2009-03-05 2 views
6

В настоящее время я работаю с поврежденным шрифтом TrueType. Доступные мне программы говорят мне, что есть проблема с таблицей maxp - член maxContours имеет слишком большое значение. Есть ли верный способ обнаружения, когда значение maxContours слишком велико или слишком низкое (да, это тоже может быть проблемой)? (Шрифты - программы, поэтому один способ обнаружить файл шрифта хорош, это выполнить их, но это не приемлемое решение для меня.)Коррумпированное обнаружение шрифтов TrueType

Мне не нужна библиотека шрифтов, потому что я не могу добавить ее. Я уже свернул свой собственный синтаксический анализатор TrueType. Остается проверить, является ли заданное значение указанной таблицы неверным. Затем я добавлю свой синтаксический анализатор и чеки на свой продукт.

У меня нет возможности перестроить шрифт. Я потребитель - мне нужно определить, поврежден ли входящий шрифт или нет, и если он спасется с минимальной работой, насколько это возможно.

В случае, если это помогает - я нахожусь в Windows XP/Vista как 32 & 64 бит, так и их серверные версии!

ответ

0

Какая платформа вы используете? Я был в состоянии взломать TrueType файлы довольно приятно, используя FontTools библиотеки для Python:

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

ETA ре д редактирования: Так вопрос просто «какие значения maxContours слишком низкое/слишком высокое»? Насколько мне известно, нет документального предела, но я знаю, что довольно часто «добавлять несколько» в maxContours, если глиф содержит больше контуров, чем указано.

(Что maxContours в неприятной купели, и как это связано с числом контуров, фактически используемых в глифы?)

+0

Спасибо!Но нет, мне не нужен парсер. Я изменю свой вопрос, чтобы добавить ясность. – dirkgently

2

Вместо того, чтобы пытаться обнаружить ошибки, я обнаружил, что наиболее удобно только перестроить проблема-шрифт с FontForge. Это может быть полностью автоматизировано, поскольку оно обеспечивает богатую командную строку и скриптовый API. Кроме того, вы можете преобразовать шрифт в более удобный формат или кодировку, если вам нужно.

+0

Я потребляю вход, и мне нужно выручить как можно скорее - так что это не сработает. Я добавлю это на вопрос :) – dirkgently

+0

Спасибо за идею, вы решили [связанная проблема] (https://stackoverflow.com/questions/44622656/), которую я имел. – Pikamander2

3

Есть ли верный способ обнаружить, когда значение maxContours слишком велико или слишком низкое (да, это тоже может быть проблемой)?

Да. Если вы уже создали/имеете библиотеку синтаксического анализа TrueType/OpenType, как вы указали, это конкретное значение довольно легко проверить. Вам нужно будет разобрать каждый из глифов (из 'glyf' table, используя таблицу «loca» в качестве индекса), получить количество контуров от каждого глифа, один за другим, и сравнить размер шрифта в целом с этим хранится в 'maxp'.

Обратите внимание, что некоторые другие значения в «maxp» равны , а не, это прост в тестировании; например maxSones, maxTwilightPoints, maxStorage, maxFunctionDefs, maxInstructionDefs, maxStackElements, maxSizeOfInstructions все требуют разбора дополнительных таблиц, а для некоторых из них - доступ к сканеру TrueType и интерпретатору.

Небольшой фон: таблица «maxp» (максимальный профиль) предназначалась как ярлык/резюме потенциально полезных шрифтовых максимумов, как помощь в распределении памяти. Вообще говоря, если значение в «maxp» выше фактического значения шрифта, худшее, что произойдет, это то, что вы выделяете слишком много памяти ... то есть, если вы находитесь на платформе, которая фактически использует все значения «maxp» для этой цели.

Смежные вопросы