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

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

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

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

здесь находится подтаблица cmap Format 4.


person Ayrosa    schedule 21.04.2011    source источник
comment
Вы можете попробовать пропустить документацию Microsoft и перейти к оригинальной документации Apple TrueType: разработчику. apple.com/fonts/ttrefman/rm06/Chap6cmap.html   -  person ohmantics    schedule 21.04.2011
comment
Спасибо омантикам. Это было здорово !   -  person Ayrosa    schedule 27.04.2011


Ответы (3)


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

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

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

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

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

person Dan Filimon    schedule 06.07.2011
comment
Я долгое время держался подальше от SO. Вот почему мне потребовалось так много времени, чтобы принять ваш ответ. - person Ayrosa; 13.11.2011

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

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

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

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

person Bong    schedule 28.11.2012

РТФМ!

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

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

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

person James    schedule 21.04.2011
comment
Но это именно то, что мне нужно понять. Меня волнует не формула, а сама структура таблицы. Если idRangeOffset[i] является смещением для GlyphIDArray[], где расположены глифы в сегменте i, эта формула не кажется правильной. По сути, я ищу значения для массивов idDelta[] и idRangeOffset[] в таблице cmap Format 4. Спасибо. - person Ayrosa; 21.04.2011