Как получить символы глифов в шрифте CFF

Я разбираю файл CFF. Я получаю таблицу с глифами, которая выглядит как GC4G38GFCGD7G70G4BGEAG39GFDG4CGEBGFEG72G4DGEC... с именами. У меня есть смещения для каждого глифа и есть смещения для CharStringINDEX. Я должен связать глифы гривы с символами. Что мне нужно сделать? Все смещения не объясняют, где находится символ.


person Павел Воевода    schedule 27.11.2014    source источник
comment
@Jongware как человек, написавший несколько парсеров шрифтов: не совсем так? этот вопрос звучит как обычная проблема программирования.   -  person Mike 'Pomax' Kamermans    schedule 27.11.2014
comment
@Mike: ну .. вся необходимая информация опубликована Adobe - что я и успешно использовал - и поэтому это все еще может подпадать под категорию недостаточно изученных.   -  person Jongware    schedule 28.11.2014
comment
в то время как это правда, технические документы также настолько плотны и недоступны, насколько это возможно, поэтому, говоря людям, чтобы они прочитали их в первую очередь, вы в значительной степени гарантируете, что вы увидите их снова, когда я читаю технические документы. Я до сих пор понятия не имею, что происходит =P   -  person Mike 'Pomax' Kamermans    schedule 28.11.2014


Ответы (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, поэтому вы, вероятно, захотите просмотреть его.

person Mike 'Pomax' Kamermans    schedule 27.11.2014