В целом, вам может пригодиться текущая спецификация OpenType , поскольку она содержит ряд обновлений, уточнений и исправлений, которые отсутствуют в версии Apple.
Что касается ваших конкретных вопросов:
1 head.checksumAdj
расчет
Инструкции достаточно ясны, хотя подразумеваемый «нулевой шаг» объединяет все данные шрифта (таблицы, каталог и т. Д.) В окончательную форму и порядок . Как только у вас есть это:
установить значение checkSumAdj
в таблице head
на ноль
вычислить контрольную сумму только таблицы head
и сохранить ее в соответствующем поле в каталоге таблицы шрифта (где тег / контрольная сумма / смещение / длина хранятся для всех таблиц, включенных в шрифт)
вычислить сумму всего шрифта (сумму всех uint32s, как контрольные суммы таблиц), включая изменения в шагах 1 и 2.
store 0xB1B0AFBA минус значение из шага 3 в head.checkSumAdj
. Это все! Формулировка о том, что контрольная сумма головы отображается неверно, означает, что если бы вы запустили вычисление контрольной суммы в таблице head
после сохранения окончательного значения, это выглядело бы неправильно. Но это нормально, потому что так было определено: по существу, для контрольной суммы таблицы head
вы должны сначала игнорировать (установить в 0) значение checkSumAdj
.
2 head
xMin, xMax, yMin, yMax
Это просто xMin, xMax, yMin и yMax для всех глифов. Каждый глиф xMin, xMax и т. Д. Является просто "минимальной (максимальной) координатой X (Y)" всех точек (для составных глифов вы бы взяли этот результат после составления глиф, т.е. после применения любого сдвига, масштаба или других преобразований в определении составного глифа). И в таблице head
, и в данных глифа ограничивающий прямоугольник представляет собой массив 16-разрядных целых чисел со знаком. Таким образом, в общем случае процедура будет заключаться в том, чтобы перебрать каждый глиф, получить вычисленную ограничивающую рамку и, как вы это делаете, отслеживать X / Y min / max (независимо). Когда вы закончите с циклом, у вас будут значения для таблицы head
, которая по сути является прямоугольником, который включает в себя каждую координату каждого глифа в шрифте.
3 maxp
значения
Они достаточно четко определены в определении таблицы maxp
:
maxPoints
- максимальное количество точек любого одиночного несоставного («простого») глифа
maxContours
аналогично максимальному числу контуров любого отдельного некомпозитного глифа
maxComponentPoints
- это максимальное количество точек в составном глифе (то есть сумма точек всех глифов компонентов)
maxComponentContours
аналогично максимальному количеству контуров в составном глифе
maxTwilightPoints
относится к максимальному количеству сумеречных точек, используемых в Зоне 0 инструкций TrueType. Если ваш шрифт не использует инструкции TrueType, это (и другие связанные с инструкциями поля) можно установить на ноль. Возможно, вы захотите ознакомиться с разделами « Инструктивные символы TrueType » и « TrueType Instruction Set » спецификации OpenType, если вы не знакомы с инструкциями TrueType (часто называемыми «подсказками»). ) и как они хранятся в данных глифа.
4 glyf
таблица простых глиф-флагов
uint8 flags[variable]
указывает, что длина массива флагов является переменной . Причина этого обсуждается в спецификации («Флаги простых глифов»):
В логических терминах есть один элемент байта флага, одна x-координата,
и одна координата Y для каждой точки. Обратите внимание, однако, что флаг
Байтовые элементы и координатные массивы использовали упакованные представления. В
конкретный , если логическая последовательность элементов флага или последовательность х-или y-координаты повторяются , тогда фактический элемент байта флага или
значение координаты может быть указано в одной записи со специальными флагами
используется для указания того, что это значение повторяется для последующего логического
записи.
Другими словами, элементы массива flags
, при расширении являются координатами, но фактическое хранилище в виде массива uint8 необязательно (как в случае с хранение самих координатных данных). Это во многом зависит от расположения координат в каждом глифе.