True Type字体。glyf表存在问题。

3
我正在尝试学习如何读取开放类型字体文件。但是,我在阅读一些表格时遇到了问题。我以为在http://www.microsoft.com/typography/otspec/otff.htm提供的信息足够了。
在尝试读取简单字形描述下的glyf表时,我发现flags[n],其中n是标志的数量。
问题在于我不知道从哪里获取标志的数量,没有标志的数量,似乎无法阅读该表格。
3个回答

6

好的,我找到了我的问题的答案,endPtsOfContours在坐标列表中表示每个轮廓的最后一个点的位置。

我使用TTFDUMP找出了答案。


2
尽管这是一个旧问题,但我觉得需要在此主题上添加一些更多的信息,因为以上的答案可能会产生错误的结果。
字形中的点数等于最后一个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
        }
    }
}

我无法告诉你在现实世界的字体中Repeat标志是否被使用,也不知道它被使用的频率(可能在上面评论中提到的 Bradley Hand ITC Regular 和 Rage Italic 这两种字体中使用了它)。但如果你想确保读取正确数量的标志,则必须考虑这一点。


不错!你是怎么发现的?有什么来源吗?我读了规格说明(很久以前),但没有找到任何东西 :-/ - vidstige
@vistige 我从 https://www.microsoft.com/typography/otspec/glyf.htm 的开放类型规范中获取了这个信息。它在 flags 表中(第3位是关键)。 - Waruyama

2

为了澄清如何计算旗帜数量。旗帜数nendPtsOfContours +1中的最后一个元素。


发现至少有两种字体公式不成立:Bradley Hand ITC Regular和Rage Italic。TTFDUMP返回了不同数量的标志。 - Igor Brejc
@IgorBrejc 好的,请问显示问题的字形是什么?实际旗帜数量是多少?endPtsOfContours 的最后一个元素报告了什么?如果需要检查单个字节,可以参考 https://github.com/vidstige/NRasterizer 中的 C# 实现示例。您也可以在评论中链接字体文件吗? - vidstige
1
@IgorBrejc 请查看我下面的回答。两种提到的字体可能使用Repeat标志,这可能会导致标志数和点数之间的差异。 - Waruyama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接