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

时间:2018-04-19 09:58:18

标签: c++ windows true-type-fonts freetype freetype2

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

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

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

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

但我怎样才能访问它?有没有像Freetype + Harfbuzz这样的图书馆? 似乎Freetype只能访问OTF表,而不是TTF,我是对的吗?

FT_OpenType_Validate此功能仅适用于OpenType字体

Harfbuzz是否可选择或强制要求?

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

似乎很难让freetype + harfbuzz在Windows上工作,是否真的需要?怎么样?

来源:

mactype

official poor example

我的测试代码,不起作用,因为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;
}

1 个答案:

答案 0 :(得分: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规范的复杂性,这并不是一件容易的事。我什至会说这太复杂了,但仍然可能。

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