В некотором роде SBIX является полностью автономной таблицей, для нее нет вторичной индексной таблицы, такой как glyf / loca или подтаблицы cmap.То, как вы проверяете, есть ли данные, не требует фактического чтения блока данных глифа, вам просто нужно проверить массив смещений для штриховки, связанной с размером точки, которую использует текст, который формируется.
Цитироватьспецификация:
длина данных для глифа N равна glyphDataOffset [N + 1] - glyphDataOffset [N].Если это ноль, в этом ударе нет растровых данных для этого глифа.В массиве есть одно дополнительное смещение, чтобы обеспечить длину данных для последнего глифа.
Итак: вы находите идентификатор своего глифа обычным способом, а затем проверяете значения смещения для своего идентификатора.а также идентификатор следующего глифа, и если они одинаковы, в таблице SBIX нет данных, связанных с вашим глифом.
И наоборот, если вы пишете код в generate в таблице SBIX, затем для каждого размера точки, для которого требуется резервное копирование растрового изображения, вы создаете удар, и каждый удар должен иметь поле смещения, равное Offset32[maxp.numGlyphs + 1]
.То есть: у вас нет выбора, каждый глиф будет иметь смещение , но если глиф не требует растрового изображения для страйка, вы не записываете данные глифа в блок данных глифа,и вы оставляете смещение в покое до тех пор, пока какой-нибудь последующий глиф, имеющий связанные растровые данные.
- инициализирует массив
offset32
длины maxp.numGlyphs + 1
, - , инициализирует структуру данных переменной длиныдля записей данных глифа
- инициализируют трекер смещения прокрутки в значение
strike.startOffset + 4 + offsets.length * 4
, - , начиная с идентификатора глифа 0, для каждого глифа:
- создать данные глифазапишите, если ему нужно растровое изображение, или сигнализируйте, что запись не требуется записывать в блок данных глифа (например,
null
или false
или 0
или любой другой, который лучше всего работает на выбранном вами языке), - если записи нет, ничего не делать.
- , если - это запись для записи, добавьте ее в структуру данных глифа и добавьте
bytelength(glyphDataRecord)
в трекер смещения.
- набор
offsets[id] = trackervalue
, приращениеyph id по одному и повторите цикл
- после обработки всех глифов, добавьте окончательное значение трекера смещения
offsets[maxp.numGlyphs] = trackvalue
, сохраняя смещение, при котором этот удар заканчивается.
Обратите внимание, что (3) можно полностью выполнить отложенным образом: если вы еще не знаете strike.startOffset, тогда вы просто начинаете с 0 и как только узнаете, куда на самом деле идут ваши данные в вашем файле,обновите все значения в вашем массиве смещений, добавив к каждому значению константу stroke.startOffset + 4 + offsets.length * 4
.