bri*_*ght 6 fonts fallback truetype opentype
我很想知道字体回退在字体整形/渲染堆栈中的位置.换句话说,在什么时候检测到缺少的字形以及它们如何被替换?
我在本文档中看到FontConfig工具"透明地基于字形覆盖"进行字体回退.
所以问题是:
编辑:我发现这个文件解释了FontConfig的"内容",但没有解释"如何".问题1是关于"如何".
总结一下 - 这篇文章只与一件事有关 - 当字体中缺少字形时,字体回退是如何工作的.
Mik*_*ans 10
浏览器中的字体后备(与操作系统相反)基于两件事:
CSS规范在这方面相当简单,只是简单地使用系统名称给出字体列表,但是几种可能的"catch all"字体在计算机之间无法保证是相同的(没有理由假设是serif映射到Times或Times New Roman,例如).
文本引擎使用的回退算法完全取决于引擎,但通常在字形查找步骤中启动:文本引擎看到一串代码点,并尝试使用字体来整形该字符串.对于序列中的每个点,它检查字体是否具有匹配的字形(通过查询CMAP表和子表),或者一个规则告诉引擎可能只有在跟随更多代码点时才使用字形,通过GSUB机制(例如,没有标志符号的单个字母的字体e,t和c,但与字形&和GSUB规定说序列e+ t+ c应该是在文本与单个字形代替&),而当它的完成积累这它是一种"点的单位",它塑造文本并将其交回任何要求它来形成文本的内容.
如果,在字形查找期间,事实证明字体不包含任何让引擎形成特定代码点的内容(即通过CMAP数据运行以及GSUB规则仍然显示"没有字形"),那么文本引擎可以做两件事:
.notdef定义为字形id 0 的轮廓,并且通常为您提供带有可爱空盒子的文本(由字体伙伴亲切地称为"豆腐")或问号.当使用回退时,引擎可以向下移动替代字体列表,直到:(a)找到字形,或(b)列表耗尽,此时引擎必须放弃,并将使用.notdef字形.引擎是.notdef从原始字体还是从列表中的最后一个字体抓取字形,完全取决于引擎(尽管通常它会使用第一个字体,因为易读性)
在任何地方都没有"标准"算法; font fallback基本上是文本引擎作者提供的一种便利机制,就像浏览器带有书签管理器一样(方便,而不是任何规范的一部分).就OpenType而言,没有要求引擎是否应该在.notdef找不到字形时提供,或者是否应该提供它可以形成的部分,然后在其他地方找到缺少的字形,并渲染文本办法.CSS意味着您的文本引擎至少应该具有某种形式的字体回退,但它没有指定它应该如何工作,或者何时应该启动.
在 Windows 上:
Firefox 对 CJK 字形和非 CJK 字形有不同的算法:
non-CJK 算法非常简单:尝试给定 html 语言的所有配置字体。这些包括 configfont.name.{generic}.{language}和 config 列表font.name-list.{generic}.{language}。
由于字形、编码和语言变化的剪切数量,CJK 本质上是复杂的。Firefox 使用动态搜索算法来解析字形。
ja) 字体。ko) 字体。zh-CN) 字体。zh-HK) 字体。zh-TW) 字体。该算法目前在GetLangPrefs() 中实现。在 CJK 和非 CJK 情况下,要搜索的字体数量都有限制 ( 32 )。脚本搜索顺序是硬编码的,因此目前无法由用户配置。
Firefox 回退算法的优势在于,由于其动态特性,可以搜索更多字体,从而最大限度地减少用户遇到丢失字形的机会。此外,通过了解搜索顺序,用户可以操纵配置为丢失的字形选择所需的字体。
缺点是不一致:因为搜索列表是硬编码的,所以所有网页都会优先使用某些语言的字体。例如,日文优化字体可能用于缺少标签的韩文网页。此外,由于尝试了更多字体,性能可能会下降。
与 Firefox 不同,Chromium 选择了一种更静态的方法来搜索字体。Chromium 不是划分 CJK 大小写和浏览字体列表,而是为每个脚本硬编码几种“核心”字体。Chromium 假定这些字体应该始终可用,因此只搜索这些字体。脚本到字体的映射可以在InitializeScriptFontMap() 中找到。此映射暂时无法由用户配置。
这种算法的优点是简单性、一致性和性能,但代价是灵活性和可配置性。
未来的实施可能会发生变化。https://gist.github.com/CrendKing/c162f5a16507d2163d58ee0cf542e695 中的更多详细信息。