代码之家  ›  专栏  ›  技术社区  ›  dirkgently

TrueType字体检测损坏

  •  6
  • dirkgently  · 技术社区  · 15 年前

    我目前正在处理一个损坏的TrueType字体。提供给我的程序告诉我 maxp 表-- maxContours 成员的值太大。有没有确定的方法来探测 最大等高线 值太高或太低(是的,这也可能是一个问题)?(字体是程序,因此检测字体文件的一种方法是执行它们,但这对我来说不是一个可接受的解决方案。)

    我不需要字体库,因为我不能添加。我已经推出了自己的TrueType字体分析器。剩下的是检查上述表格的给定值是否不正确。然后我将把解析器和检查添加到我的产品中。

    我没有办法重建字体。我是一个消费者——我需要检测输入的字体是否损坏,以及它是否可以通过尽可能少的工作得到解决。

    如果有帮助的话——我使用的是32&64位Windows XP/Vista及其服务器版本!

    3 回复  |  直到 15 年前
        1
  •  3
  •   SingleNegationElimination    15 年前

    与其试图检测错误,我发现用 FontForge . 这可以完全自动化,因为它提供了丰富的命令行和脚本api。另外,如果需要,可以将字体转换为更方便的格式或编码。

        2
  •  3
  •   djangodude    12 年前

    是否有一种可靠的方法来检测maxContours值是否过高或过低(是的,这也可能是一个问题)?

    对。 如果您已经构建了一个truetype/opentype解析库,那么这个值很容易验证。您需要解析每个标志符号(从 'glyf' table 使用“LoCa”表作为索引,逐个获取每个字形的轮廓数,并将字体宽度最大值与存储在 'maxp' 是的。

    注意“maxp”中的一些其他值是 这个简单的测试;例如,maxzones、maxtwillightpoints、maxstorage、maxfunctiondefs、maxinstructiondefs、maxstackelements、maxsizeofinstructions都需要解析额外的表,其中一些表需要访问truetype scaler和解释器。

    一个小背景:“Max Profile”(最大配置文件)表是一个潜在有用的字体宽最大值的快捷方式/概要,作为内存分配的辅助工具。所以一般来说,如果“maxp”中的一个值高于实际的字体值,那么最糟糕的情况就是你分配了太多的内存…也就是说,如果你所处的平台实际使用了所有的“maxp”值。

        3
  •  0
  •   bobince    15 年前

    你在用什么平台?我可以很愉快地使用 FontTools python库:

    font= fontTools.ttLib.TTFont("suspect.ttf")
    font['maxp'].maxContours
    

    eta re q edit:那么问题是“maxcourtos的哪些值太低/太高”?据我所知,并没有一个文档化的限制,但我知道在maxcourtos中添加一些on是相当常见的,以防一个glyph包含的轮廓比它声明的更多。

    (麻烦字体中的maxcourtos是什么,它与字形中实际使用的轮廓数有什么关系?)