Недостающие части для создания шрифта TTF от Spec - PullRequest
0 голосов
/ 11 января 2019

У меня возникла проблема с решением этих проблем в связи со спецификацией TTF.

  1. «Вычисление контрольной суммы» в «заголовке».
  2. «xMin», «yMin» и т. Д. В «head»
  3. maxPoints, maxContours, maxComponentPoints, maxComponentContours, maxTwilightPoints в "maxp"
  4. uint8 flags[variable] Array of flags в "глифе"

Я хотел бы знать, может ли кто-нибудь прояснить эти фрагменты.

1

Для (1) написано это:

checkSumAdjustment Для вычисления: установите его в 0, вычислите контрольную сумму для таблицы 'head' и поместите ее в каталог таблиц, суммируйте весь шрифт как uint32_t, затем сохраните 0xB1B0AFBA - sum. (Контрольная сумма для таблицы 'head' в результате будет неправильной. Это нормально; не сбрасывайте ее.),

Я нашел две реализации контрольной суммы, на которые они ссылались:

// https://docs.microsoft.com/en-us/typography/opentype/spec/otff

uint32
CalcTableChecksum(uint32 *Table, uint32 Length)
{
uint32 Sum = 0L;
uint32 *Endptr = Table+((Length+3) & ~3) / sizeof(uint32);
while (Table < EndPtr)
    Sum += *Table++;
return Sum;
}

uint32 CalcTableChecksum(uint32 *table, uint32 numberOfBytesInTable)
    {
    uint32 sum = 0;
    uint32 nLongs = (numberOfBytesInTable + 3) / 4;
    while (nLongs-- > 0)
        sum += *table++;
    return sum;
    }

Это простая реализация. Мой вопрос здесь, что входит в контрольную сумму значение . Так вот так кажется:

  1. Вычислить контрольную сумму для стола руководителя.
  2. "Суммируйте весь шрифт как" Не знаю, что это значит .
  3. Понятия не имею, что все это означает («затем сохраните 0xB1B0AFBA - сумма. (В результате контрольная сумма для таблицы 'head' будет неправильной. Это нормально; не сбрасывайте ее.),")

2

Для (2) я не уверен, как рассчитать это. Кажется, я просто объединяю все глифы в спрайт-карту, а затем вычисляю окончательный размер. Но это говорит о том, что не стоит принимать во внимание ограничивающую рамку глифов, так что не точно точно знаю, что это значит.

3

Для (3) не найдено документации о значении этих переменных.

4

Для (4) я не знаю, что это значит "uint8 flags [variable] Array of flags". У них есть таблица ниже, но я не уверен, что это на контур или на глиф или на точку .

У меня также есть связанный вопрос о понимании сложных глифов здесь , если вы знали что-либо.

1 Ответ

0 голосов
/ 13 января 2019

В целом, вам может пригодиться текущая спецификация OpenType , поскольку она содержит ряд обновлений, уточнений и исправлений, которые отсутствуют в версии Apple.

Что касается ваших конкретных вопросов:

1 head.checksumAdj расчет

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

  1. установить значение checkSumAdj в таблице head на ноль

  2. вычислить контрольную сумму только таблицы head и сохранить ее в соответствующем поле в каталоге таблицы шрифта (где тег / контрольная сумма / смещение / длина хранятся для всех таблиц, включенных в шрифт)

  3. вычислить сумму всего шрифта (сумму всех uint32s, как контрольные суммы таблиц), включая изменения в шагах 1 и 2.

  4. 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 необязательно (как в случае с хранение самих координатных данных). Это во многом зависит от расположения координат в каждом глифе.

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