gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:20:56 24 4
gpt4 key购买 nike

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

enter image description here

复选标记和白星来自 Segoe UI Symbol,而不是来自 Gabriola,即使在演示应用程序中只指定了 Gabriola。那么,有谁知道 DirectWrite (CreateTextFormat) 是如何选择后备字体的?

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

更新 2 .引用 MSFT employee :

DirectWrite has fallback data that is not read from the registry or in any way configurable. In Windows 8.1, though, APIs have been introduced that allow an app to specify its own fallback. (It's similar to the WPF APIs for creating a composite font definition.)



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

最佳答案

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 匹配更具体的 ja-jp )。它有点类似于(但没有😅复杂)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" />

关于fonts - DirectWrite (CreateTextFormat) 如何选择后备字体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25693651/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com