我如何访问ttf字体(而不是otf字体)的GDEF / GPOS / GSUB?

3

一个主要问题,几个下面的问题(抱歉)。

我正在尝试读取ttf字体中的GSUB信息(和其他表格)。如何做到这一点?我可以使用哪个库?

GSUB是一个替换表,告诉在同一邻域中使用的字形必须变形为另一个字形。它在许多语言中非常常见,在英语中更为罕见,但最好的例子是连字号。

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

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

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

对于这种需求,Harfbuzz是可选还是强制的?

文档很贫乏(在我的视角中),因此我正在寻找经验和工作示例。

在Windows上使freetype + harfbuzz一起工作似乎也很困难,这真的有必要吗?如何做到这一点?

来源:

mactype

官方糟糕的示例

我的测试代码无法工作,因为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;
}

我担心这会很困难。首先,恕我从15年前的记忆中快速回答。OpenType 1.0大约在Freetype 2发布的同时推出,并且并行开发了几年。例如,Freetype-1.4支持您的需求,但该部分未集成到FT2中。当OT稳定在1.4时,其对完整OTF字体的支持被正确地添加到了FT2中(正如Adobe和MS所希望的那样),但是没有投入处理每个TT+OT字体的努力。 - AntoineL
在寻找上述断言的参考资料时,我发现了 Werner 在 2000 年左右发布的一条消息(链接:https://lists.nongnu.org/archive/html/freetype-devel/2000-05/msg00004.html)。我不知道在 2018 年是否有可能回到 Freetype 1(肯定不容易:这是从 Pascal 移植过来的 C 代码,编写于 1996 年,已经近 20 年没有更新;而且与 FT2 相比,其 API 一点也不友好)。 - AntoineL
1个回答

1
在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 规范的复杂性,我会说这不是一项简单的任务。我甚至会说它过于复杂,但仍然可行。
如果您决定这样做,请记住,您必须反转从任何表中读取的数据的字节顺序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接