如何在SBIX TrueType / OpenType字体表中指示丢失的字形

时间:2018-10-06 16:07:39

标签: fonts true-type-fonts opentype

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

SBIX表的规范可以在这里找到:
https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6sbix.html
https://docs.microsoft.com/en-us/typography/opentype/spec/sbix

它说:
“并不是每个字形都需要在'sbix'表的每个行中都有一个条目。如果一个字形在'sbix'表的任何行中都没有条目,轮廓已绘制。”

因此,不必为每个字形都提供位图,足够公平。

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

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

1 个答案:

答案 0 :(得分:2)

SBIX的排序是一个完全独立的表,没有像glyf / loca或cmap子表这样的辅助索引表。检查是否有数据的方式不需要实际读取字形的数据块,您只需要检查偏移数组以查找与成形文字使用的磅值相关的罢工。

引用规范:

  

字形N的数据长度为glyphDataOffset [N + 1] – glyphDataOffset [N]。如果该值为零,则此行中没有该字形的位图数据。数组中有一个额外的偏移量,以提供最后一个字形的数据长度。

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

相反,如果您正在编写代码以生成 SBIX表,则对于需要位图回退的每个磅值,您都将创建一个罢工,并且每个罢工必须偏移量字段为Offset32[maxp.numGlyphs + 1]。那就是:您别无选择,每个字形都会有一个偏移量,但是如果一个字形不需要罢工的位图,您就不会将任何字形数据写入该字形数据块中,然后不理会偏移量,直到后面的某些字形确实与位图数据相关联为止。

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

当然请注意,(3)可以完全以延迟的方式完成:如果您还不知道strike.startOffset,则只需从0开始,一旦知道数据在文件中的实际位置,就进行更新通过将常数offsets[maxp.numGlyphs] = trackvalue添加到每个值,可以获取偏移量数组中的所有值。