Спецификация Microsoft OpenType для cmap
Таблица смар в шрифтах OpenType файлов преобразует код символа в код символа.
Может ли кто-нибудь помочь мне понять выражение C:
*(idRangeOffset[i]/2 + (c - startCount[i]) + &idRangeOffset[i])
Здесь - подтаблица формата 4 cmap.
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