【发布时间】:2012-04-19 09:15:14
【问题描述】:
我正在尝试学习如何阅读开放式字体文件。
问题是我在阅读某些表格时遇到问题。我认为 http://www.microsoft.com/typography/otspec/otff.htm 提供的信息就足够了
当我尝试阅读在简单字形描述下找到的字形表时
flags[n],其中 n 是标志的数量。
问题是我不知道从哪里获得标志的数量,而且如果没有标志的数量来读取表格似乎是不可能的。
【问题讨论】:
我正在尝试学习如何阅读开放式字体文件。
问题是我在阅读某些表格时遇到问题。我认为 http://www.microsoft.com/typography/otspec/otff.htm 提供的信息就足够了
当我尝试阅读在简单字形描述下找到的字形表时
flags[n],其中 n 是标志的数量。
问题是我不知道从哪里获得标志的数量,而且如果没有标志的数量来读取表格似乎是不可能的。
【问题讨论】:
好的,我找到了问题的答案,endPtsOfContours 具有坐标列表中每个轮廓的最后一个点的位置。
我使用 TTFDUMP 来找出答案。
【讨论】:
只是为了澄清标志的数量是如何计算的。标志的数量n 是endPtsOfContours + 1 中的last 元素。
【讨论】:
虽然这是一个老问题,但我觉得我需要为这个主题添加更多信息,因为上面的答案可能会产生错误的结果。
字形中的点数等于最后一个endPtsOfContours + 1。通常这等于标志数n,但不一定。使用标志中的第 3 位(Repeat 标志)表示同一标志重复多次。如果设置了此标志,则标志的数量可以低于点数。
事实是,在读取标志之前,您无法知道需要读取多少字节。您将不得不继续阅读标志,直到达到点数。这是一个小的 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
}
}
}
我无法告诉您 Repeat 标志是否或多久用于现实世界的字体(可能是上面 cmets 中提到的两种字体 Bradley Hand ITC Regular 和 Rage Italic 使用它),但如果如果您想确保读取正确数量的标志,则必须考虑到这一点。
【讨论】: