CreateTextFormat的文档没有提到字体回退选择,但是如果选择了默认的(NULL = system)集合,那么DirectWrite显然实现了字体回退。例如,如果我向DirectWrite SDK演示应用程序使用的测试字符串中添加了两个在加布里奥拉字体中找不到的象形文字,那么DirectWrite将从Segoe符号字体中选择缺少的字符。这种情况发生在基本的DrawText调用以及自定义呈现程序(对于字体回缩不做任何自定义)上,如下所示(唯一的修改是测试字符串):

复选标记和智慧之星来自Segoe符号,而不是加布里奥拉,尽管在演示应用程序中只指定了加布里奥拉。那么,有人知道DirectWrite (CreateTextFormat)是如何选择回退字体的吗?
更新.我看到有一个GetSystemFontFallback可以列出备用字体,但它只能在Windows8.1中使用(因为它是在IDWriteFactory2中)。我想他们已经注意到API中在枚举回退字体方面的差距。所以我猜在Windows 8.1之前没有办法这么做,但是如果有人知道黑客/解决办法.
Update2.引用MSFT员工
DirectWrite具有无法从注册表读取或以任何方式配置的回退数据。然而,在Windows8.1中,app已经被引入,允许应用程序指定自己的备份。(它类似于用于创建复合字体定义的WPF API。)
这仍然不能确切地解释硬编码算法/替换方案到底是什么。
发布于 2015-07-02 09:11:33
IDWriteTextLayout调用IDWriteFontFallback::MapCharacters将每个Unicode字符映射到一个有序的字体系列列表中,直到该字符得到满足为止。设想一个循环逐个读取每个字符,将代码点值和语言标记映射到Unicode范围,并在支持cmap表中字符的第一个字体处停止。伪码:
for each ch in text
if ch is a combining mark or other similar extending character
if the previously selected font supports the combining mark too
use the previously selected font
continue
endif
endif
find first mapping for ch within the Unicode range, which matches
the current language and base font family too (if pertinent)
if mapping found
for each font in mapping (starting with first listed)
if ch in font cmap
use current font
endif
endfor
else
use base font and undefined (.notdef) glyph
endif
endfor还存在确定回退区域设置的逻辑(例如对于zh-Hans/Hant或与更具体的ja-jp匹配的一般ja )。它与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" />https://stackoverflow.com/questions/25693651
复制相似问题