一个主要问题,几个承保问题(抱歉)。
我试图用ttf字体读取GSUB信息(和其他表格)。怎么做?我可以使用哪个lib?
GSUB是一个替换表,用于说明在同一邻域中使用的字形必须如何变换为另一个字形。在许多语言中是很常见的,在英语中,它更为罕见,但最好的例子是连字。
OpenType fonts (otf)有很好的记录,我知道它存在于Truetype字体(ttf)中。
但我怎样才能访问它?有没有像Freetype + Harfbuzz这样的图书馆? 似乎Freetype只能访问OTF表,而不是TTF,我是对的吗?
FT_OpenType_Validate
:此功能仅适用于OpenType字体
Harfbuzz是否可选择或强制要求?
文件很差(在我的pov中),所以我正在寻找经验,工作的例子。
似乎很难让freetype + harfbuzz在Windows上工作,是否真的需要?怎么样?
来源:
我的测试代码,不起作用,因为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;
}
答案 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规范的复杂性,这并不是一件容易的事。我什至会说这太复杂了,但仍然可能。
如果决定这样做,请记住,对于从任何表中读取的数据,您必须颠倒字节顺序。