如何访问 TTF 字体(不是 OTF)的 GDEF / GPOS / GSUB?

How can I access GDEF / GPOS / GSUB of a ttf font (not a otf)?

本文关键字:GDEF GPOS GSUB OTF 字体 何访问 访问 TTF 不是      更新时间:2023-10-16

一个主要问题,几个承保问题(对不起)。

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

GSUB 是一个替换表,说明在同一邻域中使用的字形必须如何变形为另一个字形。Is在许多语言中都很常见,而在英语中,它更为罕见,但最好的例子是连字。

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

但是我如何访问它呢?有没有像Freetype + Harfbuzz这样的库? 似乎Freetype只能访问OTF表,而不是TTF,对吗?

FT_OpenType_Validate此功能仅适用于 OpenType 字体

Harfbuzz 对于这些需求是可选的还是强制性的?

文档很差(在我的 pov 中),所以我正在寻找经验、工作示例。

在窗户上制作freetype + harfbuzz似乎也很难,真的需要吗?如何?

来源:

苹果类型

官方差的例子

我的测试代码不起作用,因为 GSUB 是一个"未实现的功能"说 Freetype:

#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 Validation Module。如果您正在使用Visual Studio构建FreeType,请按照以下步骤操作。

freetype/config/ftmodule.h中添加以下内容:

FT_USE_MODULE( FT_Module_Class, otv_module_class )

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

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

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

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