2014-09-05 208 views
2

CreateTextFormat的文档没有提及字体后备选择,但如果选择了默认(NULL = system)集合,则DirectWrite清晰地实现了字体后备。例如,如果我将Gabrieola字体中未找到的两个字形添加到DirectWrite SDK演示应用程序使用的测试字符串中,则DirectWrite会从Segoe UI Symbol字体中挑选缺失的字形。出现这种情况的基本DrawText呼叫,还与自定义呈现(即不为字体回退没有自定义),如下图所示(唯一的改变是测试字符串):DirectWrite(CreateTextFormat)如何选择备用字体?

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。)

这仍然不能准确解释硬编码算法/替换方案实际上是什么。

回答

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" />