苹果的文本渲染如何绘制字体中没有的字形?

6

我对字体和编码有基本的了解,但最近我需要做一些超出我的舒适区域的事情:将字符✖(0x2716“heavy multiplication x”)转换为CGPathRef

我使用Core Text的CTFontGetGlyphsForCharacters来完成这项工作。我知道CGGlyph实际上是给定字体支持的字形集合中的索引。我很快发现,这个字形只在iOS上的很少几种字体中受支持,包括Zapf Dingbats,这是我选择的字体之一。

这是我的问题:我可以在任何字体中使用✖,只需粘贴即可。我在Pages中进行了一个小实验,在文档中粘贴✖,然后选择它,不断更改字体。我进行了类似的编程实验。该字形始终正确显示(并且从未更改)。如果很少有这些字体具有✖,那么这是如何工作的?如果给定字体没有这样的符号,是否有一组“备用字形”(我猜这将是“备用字体”)?如果是这样,是否有任何方法可以以编程方式访问这些字形?


请尝试在终端中显示此内容。终端不应使用任何备用字体。 - n. m.
好观点!但在它确实显示的情况下,它是如何工作的? - Gregory Higley
我不知道标准API是否提供回退,还是应用程序必须自己处理。 - n. m.
事实证明(至少在我发布此评论时),苹果的终端和iTerm2确实使用回退字体。 - Gregory Higley
1个回答

11

在Core Text中,备用字体列表被称为“级联列表”,是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种字体,涵盖了广泛的语言和符号。
您可以通过将自定义CTFontDescriptor的kCTFontCascadeListAttribute属性设置为后备CTFontDescriptor对象数组来自定义自己的级联列表/回退字体。然后,使用CTFontCreateWithFontDescriptor()将其转换为CTFont。如果您没有在CTFontDescriptor上设置自定义级联列表,则默认情况下会使用全局列表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接