Спецификация Microsoft OpenType для cmap - PullRequest
5 голосов
/ 21 апреля 2011

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 06 июля 2011

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

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

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

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

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

5 голосов
/ 28 ноября 2012

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

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

*(x) - это содержимое адреса x.

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

0 голосов
/ 21 апреля 2011

RTFM!

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

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

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

...