TrueType 字体文件中的字体表数量?

hum*_*ace 2 fonts file-format truetype

根据Apple TrueType 参考手册字体文件参考手册,有45种不同类型的字体表。检查我在系统上安装的那些 ttf,我确定这些文件中实际存在的表格数量范围为每个文件 12 个到最多 22 个字体表格。

进一步查看 true type 字体文件的结构,它从以下信息开始:

uint32 缩放器类型 一个标签,指示用于光栅化此字体的 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种不同类型的字体表可以多次出现吗?

它列出的表格如下。

  1. “acnt”(重音附件)表
  2. “ankr”(锚点)表
  3. “avar”(轴变化)表
  4. “bdat”(位图数据)表
  5. “bhed”(位图字体标题)表
  6. “bloc”(位图位置)表
  7. “bsln”(基线)表
  8. “cmap”(字符代码映射)表
  9. “cvar”(CVT 变体)表
  10. “cvt”(控制值)表
  11. “EBSC”(嵌入式位图缩放控制)表
  12. “fdsc”(字体描述符)表
  13. “feat”(布局功能)表
  14. “fmtx”(字体规格)表
  15. “fond”(字体系列兼容性)表
  16. “fpgm”(字体程序)表
  17. “fvar”(字体变体)表
  18. “gasp”(网格拟合和扫描转换过程)表
  19. “glyf”(字形轮廓)表
  20. “gvar”(字形变体)表
  21. “hdmx”(水平设备指标)表
  22. “head”(字体标题)表
  23. “hhea”(水平标题)表
  24. “hmtx”(水平指标)表
  25. “公正”(理由)表
  26. “kern”(字距调整)表
  27. “kerx”(扩展字距调整)表
  28. “lcar”(连字插入符)表
  29. “loca”(字形位置)表
  30. “ltag”(语言标签)表
  31. “maxp”(最大轮廓)表
  32. “元”(元数据)表
  33. “morx”(扩展变态)表
  34. 'name'(名字)表
  35. “opbd”(光学边界)表
  36. “OS/2”(兼容性)表
  37. “post”(字形名称和 PostScript 兼容性)表
  38. “准备”(控制值程序)表
  39. “prop”(属性)表
  40. “sbix”(扩展位图)表
  41. “trak”(跟踪)表
  42. “vhea”(垂直标题)表
  43. “vmtx”(垂直指标)表
  44. “xref”(交叉引用)表
  45. “Zapf”(字形参考)表

似乎“字体表”允许其中任何随机“扩展”,例如有一个标记为 的字体表FFTM,它

“[...]是FontForge独有的。它包含三个时间戳:首先是FontForge的版本日期,然后是字体生成时间,以及字体创建时间。我在这里描述了它的格式。”

https://fontforge.github.io/TrueOpenTables.html

即使是那些偶尔添加的表,例如FFTM似乎也不值得使用searchRange等字段。

dja*_*ude 5

当 TrueType 在 20 世纪 80 年代末/90 年代初发明时,开发人员不确定随着格式的采用,事情会如何发展。还要记住,当时处理器的速度要慢得多。

\n\n

事实证明,事实上,很少有字体拥有超过 25 个表,并且可能没有一个字体能够接近这样的数字,在这种情况下,二分搜索和使用预先计算的字段将在定位表时产生很大的差异(而不是仅仅迭代排序列表)。

\n\n

然而,这些字段是规范的一部分,并且不能是 \xe2\x80\x99\xe2\x80\x9comied\xe2\x80\x9d。许多实现忽略这些字段,并且它们经常填充错误的值,但请注意,许多字体检查器/验证器/消毒器确实会检查它们,并可能将错误的值标记为无效字体。因此,如果您\xe2\x80\x99询问有关创建字体的问题,我建议使用正确的数据填写字段。

\n