DirectWrite(CreateTextFormat)如何选择后备字体?

时间:2014-09-05 20:37:09

标签: fonts directwrite

CreateTextFormat的文档没有提及字体回退选择,但如果选择了默认(NULL =系统)集合,则DirectWrite会明确实现字体回退。例如,如果我将两个在Gabriola字体中找不到的字形添加到DirectWrite SDK演示应用程序使用的测试字符串中,则DirectWrite会从Segoe UI Symbol字体中选择缺少的字形。这种情况发生在基本DrawText调用以及自定义渲染器(对字体回退没有任何自定义),如下所示(唯一的修改是测试字符串):

enter image description here

复选标记和wite星来自Segoe UI Symbol,而不是来自Gabriola,尽管在演示应用中只指定了Gabriola。那么,有没有人知道DirectWrite(CreateTextFormat)如何选择后备字体?

更新即可。我看到有一个GetSystemFontFallback可以列出后备字体,但它只在Windows 8.1中可用(因为它在IDWriteFactory2中)。我猜他们已经注意到API中关于枚举后备字体的差距。所以我猜测在Windows 8.1之前没办法做到这一点,但是如果有人知道黑客/解决方法......

UPDATE2 即可。引用MSFT employee

  

DirectWrite具有无法从注册表读取或以任何方式配置的回退数据。但是,在Windows 8.1中,引入了允许应用程序指定自己的回退的API。 (它与用于创建复合字体定义的WPF API类似。)

这仍然无法准确解释硬编码算法/替换方案究竟是什么。

1 个答案:

答案 0 :(得分:2)

IDWriteTextLayout调用IDWriteFontFallback::MapCharacters将每个Unicode字符映射到在该字符满足之前尝试的有序字体系列列表。想象一个循环逐个读取每个字符,将代码点值和语言标记映射到Unicode范围,并停止支持cmap表中字符的第一个字体。它有点类似于CSS [http://www.w3.org/TR/css3-fonts/#font-matching-algorithm]指定的字体回退算法和WPF / XAML / Silverlight使用的回退。有关所用输入的概念,请参阅用于构建自定义回退列表的IDWriteFontFallbackBuilder::AddMapping API(Win 8.1+)。

请参阅C:\ Windows \ Fonts \ GlobalUserInterface.CompositeFont以获取示例数据(请注意,此文件实际上用于WPF,与DWrite使用的定义不完全相同)。

<FontFamilyMap
    Unicode  = "3000-30FF, 31F0-31FF"
    Language = "ja"
    Target   = "Meiryo UI, Meiryo, Microsoft YaHei UI, Microsoft YaHei, MS Gothic, MingLiu, Arial Unicode MS"
    Scale    = "1.0" />