Поврежденное обнаружение шрифтов TrueType - PullRequest
6 голосов
/ 05 марта 2009

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 05 марта 2009

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

3 голосов
/ 30 января 2012

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

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

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

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

0 голосов
/ 05 марта 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...