Apple 的文本渲染如何绘制字体没有的字形?
How does Apple's text rendering draw a glyph that a font doesn't have?
我对字体和编码有基本的了解,但最近我不得不做一些超出我舒适范围的事情:把字符✖(0x2716
"heavy multiplication x")变成CGPathRef
.
我使用 Core Text 的 CTFontGetGlyphsForCharacters
来完成这项工作。我知道 CGGlyph
实际上是给定字体支持的字形集的索引。我很快发现 iOS 上只有极少数字体支持此字形,包括我选择的 Zapf Dingbats。
这是我的问题:我可以在任何字体中使用 ✖,只需将其粘贴即可。我在 Pages 中做了一个小实验,将 ✖ 粘贴到文档中,选中它,然后不断更改字体。我做了一个类似的程序化实验。字形始终正确显示(并且从未更改)。如果这些字体中很少有 ✖,这是如何工作的?如果给定的字体没有这样的符号,是否有一组 "fallback glyphs"(我猜是 "fallback font")?如果是这样,是否有任何方法可以以编程方式访问这些字形?
Core Text 中的后备字体列表称为 "cascade list",它是 CTFontDescriptor
(kCTFontCascadeListAttribute
)的属性。
可以使用CTFontCopyDefaultCascadeListForLanguages()
访问系统的默认级联列表。出于某种原因,Apple 网站上尚未记录此功能,但这是来自 'CTFont.h' 头文件的文档:
/*!
@function CTFontCopyDefaultCascadeListForLanguages
@abstract Return an ordered list of CTFontDescriptorRef's for font
fallback derived from the system default fallback region
according to the given language preferences. The style of
the given is also matched as well as the weight and width
of the font is not one of the system UI font, otherwise
the UI font fallback is applied.
@param font
The font reference.
@param languagePrefList
The language preference list - ordered array of
CFStringRef's of ISO language codes.
@result The ordered list of fallback fonts - ordered array of
CTFontDescriptors.
*/
CFArrayRef CTFontCopyDefaultCascadeListForLanguages(
CTFontRef font,
CFArrayRef languagePrefList ) CT_AVAILABLE(10_8, 6_0);
在 Mac OS X 10.10 上,默认的英文级联列表包含 26 种字体,涵盖了广泛的语言和符号集。
您可以为自己的 CTFont
实例自定义层叠 list/fallback 字体,方法是将自定义 CTFontDescriptor
的 kCTFontCascadeListAttribute
属性设置为回退数组 CTFontDescriptor
对象。然后,把它变成一个 CTFont
和 CTFontCreateWithFontDescriptor()
。如果您没有在 CTFontDescriptor
上设置自定义级联列表,它将默认使用全局列表。
我对字体和编码有基本的了解,但最近我不得不做一些超出我舒适范围的事情:把字符✖(0x2716
"heavy multiplication x")变成CGPathRef
.
我使用 Core Text 的 CTFontGetGlyphsForCharacters
来完成这项工作。我知道 CGGlyph
实际上是给定字体支持的字形集的索引。我很快发现 iOS 上只有极少数字体支持此字形,包括我选择的 Zapf Dingbats。
这是我的问题:我可以在任何字体中使用 ✖,只需将其粘贴即可。我在 Pages 中做了一个小实验,将 ✖ 粘贴到文档中,选中它,然后不断更改字体。我做了一个类似的程序化实验。字形始终正确显示(并且从未更改)。如果这些字体中很少有 ✖,这是如何工作的?如果给定的字体没有这样的符号,是否有一组 "fallback glyphs"(我猜是 "fallback font")?如果是这样,是否有任何方法可以以编程方式访问这些字形?
Core Text 中的后备字体列表称为 "cascade list",它是 CTFontDescriptor
(kCTFontCascadeListAttribute
)的属性。
可以使用CTFontCopyDefaultCascadeListForLanguages()
访问系统的默认级联列表。出于某种原因,Apple 网站上尚未记录此功能,但这是来自 'CTFont.h' 头文件的文档:
/*!
@function CTFontCopyDefaultCascadeListForLanguages
@abstract Return an ordered list of CTFontDescriptorRef's for font
fallback derived from the system default fallback region
according to the given language preferences. The style of
the given is also matched as well as the weight and width
of the font is not one of the system UI font, otherwise
the UI font fallback is applied.
@param font
The font reference.
@param languagePrefList
The language preference list - ordered array of
CFStringRef's of ISO language codes.
@result The ordered list of fallback fonts - ordered array of
CTFontDescriptors.
*/
CFArrayRef CTFontCopyDefaultCascadeListForLanguages(
CTFontRef font,
CFArrayRef languagePrefList ) CT_AVAILABLE(10_8, 6_0);
在 Mac OS X 10.10 上,默认的英文级联列表包含 26 种字体,涵盖了广泛的语言和符号集。
您可以为自己的 CTFont
实例自定义层叠 list/fallback 字体,方法是将自定义 CTFontDescriptor
的 kCTFontCascadeListAttribute
属性设置为回退数组 CTFontDescriptor
对象。然后,把它变成一个 CTFont
和 CTFontCreateWithFontDescriptor()
。如果您没有在 CTFontDescriptor
上设置自定义级联列表,它将默认使用全局列表。