cmap的Microsoft OpenType规范

Ayr*_*osa 5 truetype

OpenType文件中的cmap表将字符代码转换为字形ID.

任何人都可以帮助我理解C表达式:

*(idRangeOffset[i]/2 + (c - startCount[i]) + &idRangeOffset[i])
Run Code Online (Sandbox Code Playgroud)

是Format 4 cmap子表.

Dan*_*mon 5

因此,在该表达式中,i =段索引和c =字符代码.idRangeOffset将段的偏移量转换为cmap内的glyphIdArray.在这种情况下,您实际寻找的值是glyphIdArray [something].由于glyphIdArray紧跟在字体文件中的idRangeOffset之后,因此使用idRangeOffset作为基指针.

要到glyphIdArray开始,你需要添加idRangeOffset,但是因为该值是在字节,idRangeOffset表是16位,你需要除以2得到的字数.然后,您将获得glyphIdArray中段i的偏移量.

但是你的角色在这个片段中的偏移是在c - startCount [i],所以你也需要添加它.

最后一个表达式是一个指针,因此您需要取消引用它以实际获取字形的索引.

然后将该索引用于LOCA表.


小智 5

不确定你是否仍然需要它,但我与周围的人分享我的发现.

&idRangeOffset[i]idRangeOffset[i]文件开头的偏移量,或者在文档的语音中.

*(x) 是x地址的内容.

所以,找到地址idRangeOffset[i],将其添加到idRangeOffset[i]/2 + (c - startCount[i]),结果将是另一个地址.该地址的内容是您想要的字形ID.