Как указать отсутствующие глифы в таблице шрифтов SBIX TrueType / OpenType - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь реализовать поддержку таблицы SBIX для средства записи шрифтов значков, но спецификация TrueType / OpenType мне не ясна.

Спецификацию для таблицы SBIX можно найти здесь:
https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6sbix.html
https://docs.microsoft.com/en-us/typography/opentype/spec/sbix

Это говорит:
"Не каждый глиф должен иметь запись в каждом ударе в таблице 'sbix'. Если у глифа нет записипри любом ударе таблицы 'sbix' ее контур рисуется. "

Так что не для каждого глифа нужно предоставить растровое изображение, достаточно справедливо.

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

Означает ли это, что просто поле data в записи данных глифа пустое (длина 0) для глифов без растрового изображения?Или вся запись данных глифа имеет длину ноль?Кажется, спецификация не очень ясна по этому вопросу.Или я что-то упустил полностью?

1 Ответ

0 голосов
/ 07 октября 2018

В некотором роде SBIX является полностью автономной таблицей, для нее нет вторичной индексной таблицы, такой как glyf / loca или подтаблицы cmap.То, как вы проверяете, есть ли данные, не требует фактического чтения блока данных глифа, вам просто нужно проверить массив смещений для штриховки, связанной с размером точки, которую использует текст, который формируется.

Цитироватьспецификация:

длина данных для глифа N равна glyphDataOffset [N + 1] - glyphDataOffset [N].Если это ноль, в этом ударе нет растровых данных для этого глифа.В массиве есть одно дополнительное смещение, чтобы обеспечить длину данных для последнего глифа.

Итак: вы находите идентификатор своего глифа обычным способом, а затем проверяете значения смещения для своего идентификатора.а также идентификатор следующего глифа, и если они одинаковы, в таблице SBIX нет данных, связанных с вашим глифом.

И наоборот, если вы пишете код в generate в таблице SBIX, затем для каждого размера точки, для которого требуется резервное копирование растрового изображения, вы создаете удар, и каждый удар должен иметь поле смещения, равное Offset32[maxp.numGlyphs + 1].То есть: у вас нет выбора, каждый глиф будет иметь смещение , но если глиф не требует растрового изображения для страйка, вы не записываете данные глифа в блок данных глифа,и вы оставляете смещение в покое до тех пор, пока какой-нибудь последующий глиф, имеющий связанные растровые данные.

  1. инициализирует массив offset32 длины maxp.numGlyphs + 1,
  2. , инициализирует структуру данных переменной длиныдля записей данных глифа
  3. инициализируют трекер смещения прокрутки в значение strike.startOffset + 4 + offsets.length * 4,
  4. , начиная с идентификатора глифа 0, для каждого глифа:
    1. создать данные глифазапишите, если ему нужно растровое изображение, или сигнализируйте, что запись не требуется записывать в блок данных глифа (например, null или false или 0 или любой другой, который лучше всего работает на выбранном вами языке),
      • если записи нет, ничего не делать.
      • , если - это запись для записи, добавьте ее в структуру данных глифа и добавьте bytelength(glyphDataRecord) в трекер смещения.
    2. набор offsets[id] = trackervalue, приращениеyph id по одному и повторите цикл
  5. после обработки всех глифов, добавьте окончательное значение трекера смещения offsets[maxp.numGlyphs] = trackvalue, сохраняя смещение, при котором этот удар заканчивается.

Обратите внимание, что (3) можно полностью выполнить отложенным образом: если вы еще не знаете strike.startOffset, тогда вы просто начинаете с 0 и как только узнаете, куда на самом деле идут ваши данные в вашем файле,обновите все значения в вашем массиве смещений, добавив к каждому значению константу stroke.startOffset + 4 + offsets.length * 4.

...