CreateTextFormat的文档没有提及字体回退选择,但如果选择了默认(NULL =系统)集合,则DirectWrite会明确实现字体回退。例如,如果我将两个在Gabriola字体中找不到的字形添加到DirectWrite SDK演示应用程序使用的测试字符串中,则DirectWrite会从Segoe UI Symbol字体中选择缺少的字形。这种情况发生在基本DrawText
调用以及自定义渲染器(对字体回退没有任何自定义),如下所示(唯一的修改是测试字符串):
复选标记和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类似。)
这仍然无法准确解释硬编码算法/替换方案究竟是什么。
答案 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" />