gpt4 book ai didi

c++ - 如何访问 ttf 字体(不是 otf)的 GDEF/GPOS/GSUB?

转载 作者:行者123 更新时间:2023-12-02 10:24:27 37 4
gpt4 key购买 nike

一个主要问题,几个承保问题(抱歉)。

我正在尝试以 ttf 字体读取 GSUB 信息(和其他表格)。怎么做?我可以使用哪个库?

GSUB 是一个替换表,说明在同一邻域中使用的字形必须如何变形为另一个字形。 is在很多语言中很常见,在英语中比较少见,但最好的例子就是ligature。

OpenType fonts (otf) 的文档很好我知道它存在于 Truetype 字体 (ttf) 中。

但是我怎样才能访问它呢?有Freetype + Harfbuzz之类的库吗?似乎 Freetype 只允许访问 OTF 表,而不是 TTF,对吗?

FT_OpenType_Validate:此函数仅适用于 OpenType 字体

对于此类需求,Harfbuzz 是可选的还是强制性的?

文档很差(在我看来),所以我正在寻找经验和工作示例。

似乎也很难让 freetype + harfbuzz 在 windows 上一起工作,真的需要吗?怎么办?

来源:

mactype

official poor example

我的测试代码无法运行,因为 Freetype 说 GSUB 是一个“未实现的功能”:

#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_OPENTYPE_VALIDATE_H

#include <stdexcept>

int main(int argc, char* argv[])
{
FT_Library ftLibrary;

FT_Error errorLib = FT_Init_FreeType(&ftLibrary);
if (errorLib)
throw std::runtime_error("Couldn't initialize the library: FT_Init_FreeType() failed");

FT_Face ftFace;

FT_Error errorFace = FT_New_Face(ftLibrary, argv[1], 0, &ftFace); //getting first face
if (errorFace)
throw std::runtime_error("Couldn't load the font file: FT_New_Face() failed");

FT_Bytes BASE = NULL;
FT_Bytes GDEF = NULL;
FT_Bytes GPOS = NULL;
FT_Bytes GSUB = NULL;
FT_Bytes JSTF = NULL;

FT_Error errorValidate = FT_OpenType_Validate(ftFace, FT_VALIDATE_GSUB, &BASE, &GDEF, &GPOS, &GSUB, &JSTF);
if (errorValidate)
throw std::runtime_error("Couldn't validate opentype datas");
//7=Unimplemented_Feature

FT_OpenType_Free(ftFace, BASE);
FT_OpenType_Free(ftFace, GDEF);
FT_OpenType_Free(ftFace, GPOS);
FT_OpenType_Free(ftFace, GSUB);
FT_OpenType_Free(ftFace, JSTF);

FT_Done_Face(ftFace);
FT_Done_FreeType(ftLibrary);
return 0;
}

最佳答案

在 Windows 上,您必须启用 OpenType 验证模块。如果您使用 Visual Studio 构建 FreeType,请按照以下步骤操作。

freetype/config/ftmodule.h 中添加:

FT_USE_MODULE( FT_Module_Class, otv_module_class )

然后在解决方案资源管理器中将 src/otvalid/otvalid.c 添加到项目中。

您已准备好构建库。不要忘记使用新的库或目标文件更新您的项目。

使用它我能够访问GPOS 表。但不要太乐观。 FreeType 对 OpenType 表的支持非常有限。所以,你真正得到的是指向字节的原始指针。为了在那里获得一些有用的数据,您必须根据 OpenType 规范解析这些字节。考虑到 OpenType 规范的复杂性,我会说这不是一项微不足道的任务。我什至会说它过于复杂,但仍有可能。

如果您决定这样做,请记住您必须颠倒从任何表中读取的数据的字节顺序。

关于c++ - 如何访问 ttf 字体(不是 otf)的 GDEF/GPOS/GSUB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49918140/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com