损坏的TrueType字体检测

6
我目前正在处理一个有问题的TrueType字体。可用的程序告诉我maxp表存在问题--maxContours成员的值过大。是否有一种确定maxContours值过高或过低(是的,这也可能是个问题)的可靠方法?(字体是程序,因此检测字体文件是否好用的一种方法是执行它们,但这对我来说不是可接受的解决方案。)
我不需要字体库,因为我不能添加一个。我已经编写了自己的TrueType字体解析器。剩下的就是检查上述表格中给定值是否不正确。然后我将把我的解析器和检查添加到我的产品中。
我没有重新构建字体的选项。我是消费者--我需要检测传入的字体是否有问题,如果有问题,尽可能少地进行工作并退出。
如果有帮助的话--我在Windows XP/Vista上,包括32位和64位以及它们的服务器版本!
3个回答

3
与其尝试检测错误,我发现最方便的方法是使用 FontForge 重新构建有问题的字体。这可以完全自动化,因为它提供了丰富的命令行和脚本API。此外,如果需要,您可以将字体转换为更方便的格式或编码。

我正在消耗输入,需要尽快退出 - 所以这行不通。我会把这个加到问题里 :) - dirkgently
1
谢谢你的想法,你解决了我遇到的一个相关问题。链接 - Pikamander2

3
是的。 如果您已经构建/拥有了一个TrueType/OpenType解析库,那么验证这个特定值相当容易。您需要逐个解析每个字形(从'glyf'表中,使用'loca'表作为索引),获取每个字形的轮廓数,并将字体范围的最大值与存储在'maxp'中的值进行比较。
请注意,'maxp'中的一些其他值不是这么简单的测试;例如,maxZones、maxTwilightPoints、maxStorage、maxFunctionDefs、maxInstructionDefs、maxStackElements、maxSizeOfInstructions都需要解析其他表格,并且对于其中的一些表格,需要访问TrueType缩放器和解释器。
一些背景信息:'maxp'(最大轮廓)表旨在成为潜在有用的字体全局最大值的快捷方式/摘要,以帮助内存分配。因此,一般来说,如果'maxp'中的值高于实际字体值,最坏的情况是你会分配太多内存...也就是说,如果你所在的平台实际上使用所有'maxp'值来进行内存分配。

0
你使用的是哪个平台?我一直在使用Python的FontTools库愉快地破解TrueType文件:
font= fontTools.ttLib.TTFont("suspect.ttf")
font['maxp'].maxContours

ETA重新编辑:那么问题只是“maxContours的哪些值太低/太高”吗?据我所知,没有记录的限制,但我知道通常会在maxContours上“添加一些”,以防字形包含的轮廓比其声明的要多。

(在有问题的字体中,maxContours是什么,它与实际使用的轮廓数量有什么关系?)


谢谢!但不用了,我不需要解析器。我会编辑我的问题以增加清晰度。 - dirkgently

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