如何在 SBIX TrueType/OpenType 字体 table 中指示缺失的字形

How to indicate missing glyphs in a SBIX TrueType/OpenType font table

我正在尝试为图标字体编写器实现对 SBIX table 的支持,但我不清楚 TrueType/OpenType 规范。

可在此处找到 SBIX table 的规格:
https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6sbix.html
https://docs.microsoft.com/en-us/typography/opentype/spec/sbix

它说:
"Not every glyph needs to have an entry in every strike in an 'sbix' table. If a glyph has no entry in any strike of an 'sbix' table, then its outline is drawn."

所以不是每个字形都必须提供位图,这很公平。

但是如何指示没有可用于字形的位图?我没有看到从字形索引到罢工条目的任何映射。

这是否意味着对于没有位图的字形,字形数据记录中的 data 字段只是空的(长度为 0)?或者整个字形数据记录的长度为零?似乎规范对此不是很清楚。还是我完全错过了什么?

某种程度上,SBIX 是一个完全独立的 table,没有像 glyf/loca 或 cmap subtable 那样的辅助索引 table。检查是否有数据的方式不需要实际读取字形的数据块,您只需要检查与正在整形的文本使用的点大小相关联的罢工的偏移量数组。

引用规范:

the length of data for glyph N is glyphDataOffset[N+1] – glyphDataOffset[N]. If this is zero, there is no bitmap data for that glyph in this strike. There is one extra offset in the array in order to provide the length of data for the last glyph.

因此:您以通常的方式找到字形的 ID,然后检查您的 ID 的偏移值以及下一个字形的 ID,如果它们相同,则没有与您的字形相关联的数据SBIX table.

相反,如果您正在编写代码以生成 SBIX table,那么对于每个需要位图回退的磅值,您都会创建一个罢工,并且每个罢工 必须 有一个 Offset32[maxp.numGlyphs + 1] 的偏移字段。那就是:你没有选择,每个字形都有一个偏移量,但是如果一个字形不需要一个位图来进行罢工,你就不会将任何字形数据写入字形数据块,并且您不理会偏移量,直到某些具有关联位图数据的后续字形。

  1. 初始化长度为 maxp.numGlyphs + 1
  2. offset32 数组
  3. 为字形数据记录初始化可变长度数据结构,
  4. 将滚动偏移跟踪器初始化为值 strike.startOffset + 4 + offsets.length * 4
  5. 从字形 ID 0 开始,对每个字形执行:
    1. 如果需要位图,则创建一个字形数据记录,或者表示没有记录要写入字形数据块(例如 nullfalse0 或其他在您选择的语言中效果最好),
      • 如果没有记录,什么也不做。
      • 如果有一条记录要写入,将其附加到字形数据数据结构中,并将bytelength(glyphDataRecord)添加到偏移跟踪器。
    2. 设置offsets[id] = trackervalue,将字形ID递增1,然后重复循环
  6. 处理完所有字形后,添加最终的偏移跟踪器值offsets[maxp.numGlyphs] = trackvalue,存储此罢工结束的偏移量。

当然请注意,(3) 可以完全以延迟方式完成:如果您还不知道 strike.startOffset,那么您只需从 0 开始,一旦您知道数据实际进入的位置您的文件,通过将常量 stroke.startOffset + 4 + offsets.length * 4 添加到每个值来更新偏移量数组中的所有值。