2

CGGlyph 是 unsigned short 的 typedef。每种字体都可以(或至少可以)为同一字符指定不同的 CGGlyph 值。但是在同一个字体中,CGGlyph 的值会不会取决于字体大小呢?

基本上我想用不同的字体大小显示相同的字符。我可以使用 CGContextSetFontSize() 设置字体大小并重用 CGGlyph 值吗?

4

1 回答 1

4

CGGlyph 保存字体内字形的索引。这是因为在字体内部,字形(单个字符设计)的顺序可以是任何东西——特别是与它所代表的字符代码无关。

也就是说,字体中字符的顺序与任何编码都无关。“A”的字符代码是 65(ASCII 格式),但这并不意味着“字体中的第 65 个字符是字形“A”。对于 Unicode,几乎不可能让它以这种方式工作:卷曲的 Unicode例如,左双引号是 U+201C,或十进制的 8220。

因此,每种字体内部都有一个或多个表格,用于在字形的逻辑索引(仅计算出现在文件本身中的字符)和一个或多个编码之间进行转换。(其中编码是预定义的集合,例如“Unicode”、“MacRoman”或“Windows Latin1”。)

这有几个优点:首先,字体文件中的字符不需要以任何特定的顺序出现。字体设计者可以根据需要向文件添加尽可能多的编码。此外,字体完全有可能包含根本没有编码出现的字形(想想罕见的连字)。

都说了又做了:

每种字体都可以(或至少可以)为同一字符指定不同的 CGGlyph 值。

不能也不应该。由于 CGGlyph 是一个索引值,它总是从 0 开始,最后一个有效的有效值是字体中的字符数,减去 1。

字形的索引不是由它的大小决定的,它设置在一个非常不同的级别。因此,您确实可以将值重新用于不同的大小。
但是,值得注意的是:特定字符的索引与一种字体唯一相关。每种字体中单个字符的顺序应该被认为是唯一的(如果只是因为一种字体可能包含比另一种更多或更少的字符)。

有关相关讨论,请参阅CGGlyph toUniChar

于 2014-06-08T10:26:50.313 回答