如何使用freetype获取字形unicode?

时间:2020-03-04 12:23:07

标签: freetype

我正在尝试使用freetype枚举字体文件中的字形(名称和unicode)。

为了获得名称,我使用FT_Get_Glyph_Name。 但是,如何获取字形unicode值?

我是字形和字体的新手。

2 个答案:

答案 0 :(得分:2)

人们希望FT_CharMap保留以下信息:

[...]当前处于活动状态的charmap可作为face->charmap使用。

但不幸的是,它仅定义了编码的种类(Unicode,MacRoman,Shift-JIS等)。显然,查找代码的行为是在其他地方完成的,而当该字符根本不可用时,.notdef只会被返回。

在我自己的基于FreeType的OpenType渲染器中,该渲染器报告“按名称”,在可能的情况下,我在初始化序列中找到了一些存储字形名称的代码(如果有字形,则存储Unicode)。但是该代码基于字形名称的存在。

进一步思考:您可以测试所有可能的Unicode codepoint ,并查看其是否返回0.notdef)或有效的字形索引。因此,为所有可能的字形初始化一个空表,并且只有在以下例程找到它的情况下,才填写每个人的Unicode。

对于中等程度的现代字体,您只需要检查Unicode U + FFFF以下;对于沉重的中文字体(对于Heiti SC,最大为U + 2F9F4)或表情符号(对于Segoe UI Emoji,最大为U + 1FA95),您需要一个更大的数组。 (可惜的是,从字体中获得最大数量是完全不同的故事。决定做什么取决于您要使用的字体。)

printf ("num glyphs: %u\n", face->num_glyphs);
for (code=1; code<=0xFFFF; code++)
{
    glyph_index = FT_Get_Char_Index(face, code);
    /* 0 = .notdef */
    if (glyph_index)
    {
        printf ("%d -> %04X\n", glyph_index, code);
    }
}

这个简短的C代码片段将字体字形索引的转换表打印到相应的Unicode。请注意,字体中的(1)个不是 all 字形需要与它们关联的Unicode。一些字体具有大量的“额外”字形,可用于OpenType替换(例如,替代设计和自定义连字)或其他用途(例如,上述Segoe UI Emoji;它包含所有emoji的颜色蒙版)。并且(2)一些字形可能与多个Unicode字符相关联。例如,A的字形设计可以用作拉丁大写字母A和希腊大写字母Alpha。

答案 1 :(得分:0)

并非字体中的所有字形都必须具有Unicode代码点。在OpenType文本显示中,在Unicode字符序列和字形序列之间存在m:n映射。如果您对Unicode代码点和字形之间的关系感兴趣,那么最有意义的事情就是使用从Unicode代码点到字体的“ cmap”表中包含的默认字形的映射。

有关更多背景信息,请参见OpenType spec: Advanced Typographic Extensions - OpenType Layout

对于字形名称,每个字形都可以有一个名称,无论它是否从“ cmap”表中的代码点映射而成。字形名称包含在“ post”表中。但并非所有字体都必须包含字形名称。例如,CJK字体不太可能包含字形名称。

相关问题