Спецификация Microsoft OpenType для cmap



Таблица смар в шрифтах OpenType файлов преобразует код символа в код символа.



Может ли кто-нибудь помочь мне понять выражение C:



*(idRangeOffset[i]/2 + (c - startCount[i]) + &idRangeOffset[i])


Здесь - подтаблица формата 4 cmap.

726   3  

3 ответов:

Итак, в этом выражении i = индекс сегмента и c = код символа. idRangeOffset возвращает смещение сегмента в глифидарею внутри cmap. Значение, которое вы на самом деле ищете в этом случае, - это glyphIdArray[что-то]. Поскольку glyphIdArray непосредственно следует за idRangeOffset в файле шрифтов, вы используете idRangeOffset в качестве базового указателя.

Чтобы добраться до начала glyphIdArray, вам нужно добавить idRangeOffset, но так как это значение находится в байтах, а таблица idRangeOffset 16 бит, вам нужно разделить на 2, чтобы получить количество слов. Затем вы получаете смещение сегмента i внутри глифидара.

Смещение вашего персонажа, однако, внутри этого сегмента находится в c-startCount[i], поэтому вам нужно добавить и это.

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

Этот индекс затем используется для таблицы LOCA.

Не уверен, что вам это все еще нужно, но я делюсь своими находками для кого-то, кто смотрит вокруг.

&idRangeOffset[i] ссылается на адрес idRangeOffset[i], или в речи документа, смещение от начала файла.

*(x) является содержанием адреса x.

Итак, найдите адрес idRangeOffset[i], добавьте его к idRangeOffset[i]/2 + (c - startCount[i]), в результате получится другой адрес. Содержание этого адреса-это идентификатор глифа, который вы хотите.

RTFM!

" если значение idRangeOffset для сегмента не равно 0, отображение кодов символов полагается на glyphIdArray. Код символа, смещенный от startCode, добавляется к значению idRangeOffset. Эта сумма используется как смещение от текущего местоположения в самом idRangeOffset для индексирования правильного значения glyphIdArray. Этот непонятный трюк индексирования работает, потому что glyphIdArray сразу же следует за idRangeOffset в файле шрифтов. С выражение, которое возвращает индекс символа это:

*(idRangeOffset[i]/2 + (c-startCount[i]) + & idRangeOffset[i])

Значение c - это код символа, о котором идет речь, а i-индекс сегмента, в котором появляется c. Если значение, полученное в результате операции индексирования, не равно 0 (что указывает на отсутствие глифа), к нему добавляется idDelta[i], чтобы получить индекс глифа. Арифметика идделты равна модулю 65536."

Comments

    Ничего не найдено.