OpenType文件中的cmap表将字符代码转换为字形ID。
任何人都可以帮助我理解C表达式:
*(idRangeOffset[i]/2 + (c - startCount[i]) + &idRangeOffset[i])
Here是Format 4 cmap子表。
答案 0 :(得分:5)
因此,在该表达式中i =段索引和c =字符代码。 idRangeOffset将段的偏移量转换为cmap内的glyphIdArray。在这种情况下,您实际寻找的值是glyphIdArray [something]。由于glyphIdArray紧跟在字体文件中的idRangeOffset之后,因此使用idRangeOffset作为基指针。
要到达glyphIdArray的开头,您需要添加idRangeOffset,但由于该值以字节为单位且idRangeOffset表为16位,因此需要除以2以获取字数。然后,您将获得glyphIdArray中段i的偏移量。
你的角色偏移但是在这个片段中是c - startCount [i]所以你需要添加它。
最后一个表达式是一个指针,因此您需要取消引用它以实际获取字形的索引。
然后将此索引用于LOCA表。
答案 1 :(得分:5)
不确定你是否仍然需要它,但我与周围的人分享我的发现。
&idRangeOffset[i]
指的是idRangeOffset[i]
的地址,或者在文档的语音中,是文件开头的偏移量。
*(x)
是x地址的内容。
因此,找到idRangeOffset[i]
的地址,将其添加到idRangeOffset[i]/2 + (c - startCount[i])
,结果将是另一个地址。该地址的内容是您想要的字形ID。
答案 2 :(得分:-5)
RTFM!
“如果段的idRangeOffset值不为0,则字符代码的映射依赖于glyphIdArray。从startCode的字符代码偏移量被添加到idRangeOffset值。此总和用作idRangeOffset中当前位置的偏移量本身可以索引正确的glyphIdArray值。这个模糊的索引技巧有效,因为glyphIdArray紧跟在字体文件中的idRangeOffset之后。产生字形索引的C表达式是:
*(idRangeOffset [I] / 2 +(c - startCount [i]) +& idRangeOffset [i])
值c是有问题的字符代码,i是出现c的段索引。如果从索引操作获得的值不是0(表示missingGlyph),则将idDelta [i]添加到其中以获取字形索引。 idDelta算术模数为65536。“