Ширина символа в шрифте Open Type
У меня есть файл MinionPro-Regular.otf. Я работаю со своей структурой. Я нашел это иметь:
Table 'hhea': reference on 1668 metrics in 'hmtx' table.
Table 'hmtx': 1668 pairs of hMetrics('advanceWidth', 'leftSideBearing').
Table 'CFF ': 1429 glyph names.
Table 'CFF ': param 'CharStrings' have offset to the index of 1668 elements.
Each element consist the Width property if it is not the same
as DefaultWidth.
В спецификации CFF указано, что общее количество глифов шрифта OTF (или только что представленное в потоке CFF файла PDF, если шрифт встроен) должно быть:
- с предопределенной кодировкой ISO Adobe (228 имен)
1429 + 228 = 1649
; - с предопределенным набором символов "Эксперт" (115 имен)
1429 + 115 = 1544
; - с предопределенным набором символов "Expert Subset" (86 имен)
1429 + 116 = 1515
,
Ближайшее к 1668 число - 1649, но разница 19 означает, что я потерял кое-что важное в этой идее индексации.
Вопросы:
- Где связь между именами INDEX и метриками /charstrings INDEX?
- Где FLAG, какой тип предопределенной кодировки используется?
ВАЖНОЕ ОБНОВЛЕНИЕ
Charsets не имеют значения! Это был неправильный путь!
1 ответ
ОК, наконец я понял это!
в высоком разрешении: https://docs.google.com/drawings/pub?id=1gM7gs-ibJ_0qsUrsxIkF5rYUmC9Ix2F9WD9d3aqwc0g&w=1209&h=1179
Как это работает:
Файл открытого типа шрифта (OTF) состоит hhea
таблица с параметром numberOfHMetrics
а также hmtx
таблица с массивом горизонтальных метрик для каждого глифа в шрифте.
CFF
таблица состоит из массива строк. Есть 0...1428 имен глифов и 1429...1432 строковых значений для version
, Notes
, FullName
, FamilyName
параметры. Насколько я понял, это 4 строки всегда доп.
Теперь у нас есть Predefined Standard Strings
- общий для всех шрифтов открытого типа всего мира. Таблица имеет 0...378 общих имен глифов и 379...390 дополнительных имен для параметров, как упоминалось выше.
Теперь нам нужно объединить две таблицы имен в одном массиве. Первые элементы таблицы предопределенных имен, включают .nondef
element (это странно для меня, потому что это системное "ничто", но, как мы видим, горизонтальная метрика 500) и целый массив строк CFF, кроме имен параметров. Общее количество элементов должно быть numberOfHMetrics
,
Я трачу 60 часов, чтобы понять всю картину.