Я разбираю файл CFF. Я получаю таблицу с глифами, которая выглядит как GC4G38GFCGD7G70G4BGEAG39GFDG4CGEBGFEG72G4DGEC... с именами. У меня есть смещения для каждого глифа и есть смещения для CharStringINDEX. Я должен связать глифы гривы с символами. Что мне нужно сделать? Все смещения не объясняют, где находится символ.
Как получить символы глифов в шрифте CFF
Ответы (1)
Это зависит от того, на какую кодировку полагается CFF: следует ли она какой-либо из предопределенных кодировок/кодировок или это свободный блок кодировки/кодирования CFF? (какой это тип записан в структуре TOP DICT)
В первом случае имена глифов просто определяются спецификациями кодировки/кодирования Adobe и не сохраняются в самом шрифте. Если вы пишете синтаксический анализатор, вам нужно закодировать эти предопределенные кодировки с соответствующими именами глифов. Если шрифт следует за одним из них, он должен содержать каждый символ в наборе в заранее определенном порядке глифов (поэтому CFF, следующий за кодировкой X, всегда будет иметь глиф, названный 23-й строкой имени в позиции глифа 23).
Если второе, имена для каждого глифа хранятся в блоке String, как и любая другая строка в CFF (но со смещением на 390, потому что существует множество строк, указанных в документации, которые применяются ко всем CFF и, следовательно, не должны быть изменены). хранится явно в данных CFF). Чтобы найти имя глифа, вы используете структуру Charset, которая сообщает вам, какой идентификатор строки принадлежит какому глифу. Затем вы просматриваете String INDEX, чтобы найти смещение, в котором будет находиться идентификатор, а затем вы берете строку из блока данных String по этому смещению.
Я написал http://pomax.github.io/CFF-glyphlet-fonts специально для в целях объяснения макета CFF, поэтому вы, вероятно, захотите просмотреть его.