首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DirectWrite (CreateTextFormat)如何选择回退字体?

DirectWrite (CreateTextFormat)如何选择回退字体?
EN

Stack Overflow用户
提问于 2014-09-05 20:37:08
回答 1查看 2.2K关注 0票数 5

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

这仍然不能确切地解释硬编码算法/替换方案到底是什么。

EN

回答 1

Stack Overflow用户

发布于 2015-07-02 09:11:33

IDWriteTextLayout调用IDWriteFontFallback::MapCharacters将每个Unicode字符映射到一个有序的字体系列列表中,直到该字符得到满足为止。设想一个循环逐个读取每个字符,将代码点值和语言标记映射到Unicode范围,并在支持cmap表中字符的第一个字体处停止。伪码:

代码语言:javascript
复制
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使用的定义不同)。

代码语言:javascript
复制
<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" />
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25693651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档