我正在尝试学习如何阅读开放式字体文件。
问题是我在阅读某些表格时遇到问题。我认为http://www.microsoft.com/typography/otspec/otff.htm提供的信息就足够了
当试图阅读我在 simple glyph description 下找到的 glyf 表时
flags[n]
,其中 n 是标志的数量。
问题是我不知道从哪里获得标志的数量,而且没有标志的数量读取表格似乎是不可能的。
我正在尝试学习如何阅读开放式字体文件。
问题是我在阅读某些表格时遇到问题。我认为http://www.microsoft.com/typography/otspec/otff.htm提供的信息就足够了
当试图阅读我在 simple glyph description 下找到的 glyf 表时
flags[n]
,其中 n 是标志的数量。
问题是我不知道从哪里获得标志的数量,而且没有标志的数量读取表格似乎是不可能的。
好的,我找到了问题的答案,endPtsOfContours 具有坐标列表中每个轮廓的最后一个点的位置。
我使用 TTFDUMP 来找出答案。
只是为了澄清如何计算标志的数量。标志的数量n
, 是+ 1中的最后一个元素。endPtsOfContours
虽然这是一个老问题,但我觉得我需要在这个主题中添加更多信息,因为上面的答案可能会产生错误的结果。
字形中的点数等于最后一个endPtsOfContours
+ 1。通常这等于标志数n
,但不一定。使用标志(重复标志)中的第 3 位表示同一标志重复多次。如果设置了此标志,则标志的数量可以低于点数。
事实是,在读取标志之前,您无法知道必须读取多少字节。您将不得不继续阅读标志,直到达到点数。这是一个小的 Javascript 片段,显示了如何实现读取标志。
var pointCount; // This has to the set to the last endPtsOfContours + 1
var flags = []; // our internal array of flags
while (flags.length < pointCount) {
var flag = fontReader.readByte(); // flag is a single byte
flags.push(flag); // add flag
if (flag & 8) { // if bit 3 is set
var repeats = fontReader.readByte(); // next byte indicates repeats of the flag
for (; repeats > 0; repeats--) {
flags.push(flag); // add same flag again
}
}
}
我无法告诉您是否或多久在现实世界的字体中使用重复标志(可能是上面评论中提到的两种字体 Bradley Hand ITC Regular 和 Rage Italic 使用它),但如果您想确保您阅读正确标志的数量,您将不得不考虑这一点。