如何使用freetype获取字形unicode?

问题描述 投票:0回答:1

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

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

我是字形和字体的新手。

freetype
1个回答
0
投票

有人希望FT_CharMap保留此信息:

[...]当前有效的超级用户可作为FT_CharMap使用。

但不幸的是,它仅定义了编码的kind(Unicode,MacRoman,Shift-JIS等)。显然,查找代码的操作是在其他地方完成的-当该字符根本不可用时,face->charmap只会返回。

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

。的存在。

进一步考虑:您可以测试所有可能的Unicode codepoint

,并查看它是否返回.notdef0)或有效的字形索引。因此,为所有可能的字形初始化一个空表,并且只有在以下例程找到它的情况下,才填写每个人的Unicode。

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

.notdef

此简短的C代码片段将转换表从字体字形索引打印输出到相应的Unicode。请注意,字体中的(1)个不是all

字形需要具有与它们关联的Unicode。有些字体具有大量的“额外”字形,可用于OpenType替代(例如,替代设计和自定义连字)或其他用途(例如,上述Segoe UI Emoji;它包含所有emoji的颜色蒙版)。并且(2)一些字形可能与多个Unicode字符相关联。例如,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); } } 的字形设计可以用作拉丁大写字母A和希腊大写字母Alpha。
© www.soinside.com 2019 - 2024. All rights reserved.