我正在尝试为图标字体编写器实现对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)?还是整个字形数据记录的长度为零?看来规格不是很清楚。还是我完全错过了什么?
答案 0 :(得分:2)
SBIX的排序是一个完全独立的表,没有像glyf / loca或cmap子表这样的辅助索引表。检查是否有数据的方式不需要实际读取字形的数据块,您只需要检查偏移数组以查找与成形文字使用的磅值相关的罢工。
引用规范:
字形N的数据长度为glyphDataOffset [N + 1] – glyphDataOffset [N]。如果该值为零,则此行中没有该字形的位图数据。数组中有一个额外的偏移量,以提供最后一个字形的数据长度。
因此:您通常会找到字形的id,然后检查id的偏移值以及下一个字形的id,如果它们相同,则SBIX表中没有与您的字形相关联的数据
相反,如果您正在编写代码以生成 SBIX表,则对于需要位图回退的每个磅值,您都将创建一个罢工,并且每个罢工必须偏移量字段为Offset32[maxp.numGlyphs + 1]
。那就是:您别无选择,每个字形都会有一个偏移量,但是如果一个字形不需要罢工的位图,您就不会将任何字形数据写入该字形数据块中,然后不理会偏移量,直到后面的某些字形确实与位图数据相关联为止。
offset32
的{{1}}数组,maxp.numGlyphs + 1
,strike.startOffset + 4 + offsets.length * 4
或null
或false
或其他效果最好的记录)以您选择的语言),
0
添加到偏移量跟踪器中。bytelength(glyphDataRecord)
,将字形id加1,然后重复循环offsets[id] = trackervalue
,并存储该行结束的偏移量。当然请注意,(3)可以完全以延迟的方式完成:如果您还不知道strike.startOffset,则只需从0开始,一旦知道数据在文件中的实际位置,就进行更新通过将常数offsets[maxp.numGlyphs] = trackvalue
添加到每个值,可以获取偏移量数组中的所有值。