fonts - TrueType 字体文件中的字体表数量?
问题描述
根据Apple 的 TrueType字体文件参考手册,有 45 种不同类型的字体表。检查我在我的系统上安装的那些 ttf,我确定这些文件中实际存在的表的数量范围从每个文件 12 到最多 22 个字体表。
进一步查看真实类型字体文件的结构,它从以下信息开始:
uint32 scaler type 一个标签,用于指示用于光栅化此字体的 OFA 缩放器;有关详细信息,请参阅下面有关缩放器类型的注释。
uint16 numTables 表数
uint16 searchRange(2 的最大幂 <= numTables)*16
uint16 entrySelector log2(2 的最大幂 <= numTables)
uint16 rangeShift numTables*16-searchRange
rangeShift
这让我们有理由相信,对于预先计算的但完全恕我直言的冗余字段, ...... entrySelector
,会有共同的需求searchRange
。它甚至声明它们被用于对字体表列表进行二进制搜索:
searchRange、entrySelector 和 rangeShift 的条目用于促进对随后的表目录进行快速二进制搜索(来源https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6.html)
甚至考虑添加那些无论如何都可以动态计算的字段的正当理由numTables
确实是存在大量字体表。
因此,我的问题是,如果尽管经过我的测试,确实存在这样的情况,即可以合理地预期真正的类型字体具有更大(例如>1000)数量的表格,这意味着问题是否有可能存在任何45 种不同类型的字体表可以出现多次?
它列出的表格如下。
- “acnt”(重音附件)表
- “ankr”(锚点)表
- “avar”(轴变化)表
- 'bdat'(位图数据)表
- 'bhed'(位图字体标题)表
- 'bloc'(位图位置)表
- 'bsln'(基线)表
- 'cmap'(字符代码映射)表
- “cvar”(CVT 变体)表
- 'cvt'(控制值)表
- 'EBSC'(嵌入式位图缩放控制)表
- 'fdsc'(字体描述符)表
- “壮举”(布局特征)表
- 'fmtx'(字体规格)表
- “喜欢”(字体系列兼容性)表
- 'fpgm'(字体程序)表
- 'fvar'(字体变化)表
- 'gasp'(网格拟合和扫描转换过程)表
- 'glyf'(字形轮廓)表
- “gvar”(字形变体)表
- “hdmx”(水平设备指标)表
- 'head'(字体标题)表
- 'hhea'(水平标题)表
- “hmtx”(水平指标)表
- 'just'(对齐)表
- 'kern'(字距调整)表
- “kerx”(扩展字距调整)表
- 'lcar'(连字插入符号)表
- 'loca'(字形位置)表
- 'ltag'(语言标签)表
- 'maxp'(最大配置文件)表
- “元”(元数据)表
- 'morx'(扩展变形)表
- 'name'(名称)表
- “opbd”(光学界限)表
- “OS/2”(兼容性)表
- 'post'(字形名称和 PostScript 兼容性)表
- 'prep'(控制值程序)表
- 'prop'(属性)表
- 'sbix'(扩展位图)表
- “trak”(跟踪)表
- 'vhea'(垂直标题)表
- “vmtx”(垂直指标)表
- “外部参照”(交叉引用)表
- 'Zapf'(字形参考)表
似乎“字体表”允许它们之间的任何随机“扩展”,例如有一个标记为 的字体表FFTM
,
“[...] 是 FontForge 独有的。它包含三个时间戳:首先是 FontForge 的版本日期,然后是生成字体的时间,以及创建字体的时间。我在这里描述它的格式。”
https://fontforge.github.io/TrueOpenTables.html
即使是那些偶尔添加的表格FFTM
,似乎也不值得搜索范围等字段。
解决方案
当 TrueType 在 1980 年代末/1990 年代初发明时,开发人员不确定随着格式的采用会如何发展。还要记住,当时处理器的速度要慢得多。
事实证明,事实上,很少有字体有超过 25 个表格,而且可能没有一个接近二进制搜索和使用预先计算的字段在定位表格时会产生很大差异的数量(而不是仅通过迭代排序列表)。
然而,这些字段是规范的一部分,不能“省略”。许多实现会忽略这些字段,并且它们经常填充错误的值,但请注意,许多字体检查器/验证器/清理器会检查它们并可能将错误值标记为无效字体。所以如果你问这个关于创建字体的问题,我建议用正确的数据填写这些字段。
推荐阅读
- python - Changing value in data frame column in a loop python
- python - 如何将 Python OpenID Connect 模块与 IBM Cloud App ID 结合使用?
- ios - xcode9 swift4 致命错误:在展开可选值时意外发现 nil
- css - 如何在不影响其他元素的情况下设置特定输入类型元素的样式
- sql - 如果时间戳介于同一人的其他 2 个时间戳之间以进行另一次预订
- python - 选择不在范围之间的列表中的随机整数
- c# - 值不能为空。参数名称:first
- c# - Unity c#图像未出现在UI画布面板中
- java-8 - 给定带有 getOrDefault 的键,更新 hashmap 值
- python - Find a value in a list of dicts