Придется посмотреть все таблицы по очереди, чтоб понять как устроен TTF.
Итак, расшифровываем заголовки таблиц и содержимое каждой таблицы.
Название
4F 53 2F 32
OS/2
Контрольная сумма
6E 3C 74 00
Смещение
00 00 01 48
С 328-го байта
Длина
00 00 00 4E
78 байт
Лезем на 328 байт и смотрим по документации, что такое таблица OS/2:
https://developer.apple.com/fonts/TTRef ... p6OS2.html
Написано, что таблица требуется для шрифтов Windows. И еще написано, что она в оригинале была 68 байт, но для майкрософтовских шрифтов были введены удлиненные версии 78 и даже 86 байт. Далее приведен пример 68-байтной таблицы. Нам это не подходит, у нас 78 байтная. Лезем в документацию майкрософта
http://www.microsoft.com/typography/otspec/os2.htm . Оказывается бывает такая таблица версий 0, 1, 2, 3, 4. Страница с описанием нулевой версии для windows дается ниже по ссылке:
http://www.microsoft.com/typography/otspec/os2ver0.htm
Отличия от Apple: после полей fsFirstCharIndex и fsLastCharIndex есть еще лишние 10 байт, превращающие таблицу из 68 байт в 78 байт.
Поехали по файлу:
2 байта 00 00 - версия таблицы, должна быть 0. Так и есть.
2 байта 01 68 - 360, среднее значение ширины символа в "пикселях" (pels). Видимо имеются ввиду какие то маленькие пиксели, типографские какие нибудь) Расчет этого числа предлагается проводить умножая реальную ширину в пикселях каждого из символов на его вес (дается таблица весов, где у буквы a вес 64, у пробела 166 и т.д.), а затем эту сумму надо еще поделить на 1000. В общем если лень это считать - то можно использовать любое число, видимо это число для тех, кто сидит в типографии и выбирает шрифт по "средней температуре по больнице" +) Например, использовать 360.
2 байта 01 90 - 400, класс веса (жирноты), бывает, судя по майкрософту, от 100 (ультратонкий) до 900 (ультражирный). 400 это нормальный (Regular).
2 байта 00 05 - 5, класс ширины, от 1 (ультрасжатый) до 9 (ультрарасширенный). У нас 5, это Нормальный.
2 байта 00 00 - 0, характеристики шрифта. Если равен нулю, то шрифт "устанавливаемый и встраиваемый", свободный. А иначе можно установить разные биты, и таким образом сказать, что он лицензионный, защищенный, только для печати и т.п. У нас это 0 - свободный шрифт.
Дальше идут 4 поля по 2 байта, они описывают, что надо сделать со шрифтом, если использовать его для нижнего индекса:
2 байта 00 64 - 100, горизонтальный размер при нижнем индексе
2 байта 00 64 - 100, вертикальный размер при нижнем индексе
2 байта 00 00 - 0, смещение по горизонтали при нижнем индексе
2 байта 00 8С - 140, смещение по вертикали при нижнем индексе
Дальше идут 4 поля по 2 байта, они описывают, что надо сделать со шрифтом, если использовать его для верхнего индекса (причем такие же, как и для нижнего индекса):
2 байта 00 64 - 100, горизонтальный размер при верхнем индексе
2 байта 00 64 - 100, вертикальный размер при верхнем индексе
2 байта 00 00 - 0, смещение по горизонтали при верхнем индексе
2 байта 00 8С - 140, смещение по вертикали при верхнем индексе
Дальше 2 поля по 2 байта, они описывают рекомендуемую толщину штриха и его вертикальное положение при отрисовке текста, зачеркнутого посередине горизонтальной линией:
2 байта 00 32 - 50, толщина штриха
2 байта 00 FA - 250, смещение
2 байта 00 00 - 0, класс семейства шрифтов. У Apple расписана таблица с классами, старший байт это класс, младший байт это подкласс. 0 - это "никакой" класс, т.е. пофиг какой. Отлично.
Далее 10-байтовая структура с говорящим названием "panose":
10 байт 00 00 00 00 00 00 00 00 00 00 - вообще в этой структуре задаются свойства шрифта, но если поставить все нули, это значит выставить "любой" (Any) во все свойства.
Далее 4 поля по 4 байта каждое, делятся на 96 и 32 бит. Рекомендуют ставить нули, т.к. еще не утвердили конкретно какие биты выставлять и что это будет значить =) Тут зачем-то стоит тройка в одном из полей.
4 байта 00 00 00 03 - 3
4 байта 00 00 00 00 - 0
4 байта 00 00 00 00 - 0
4 байта 00 00 00 00 - 0
4 байта 6D 69 65 70 - "miep", поле с названием вендора ("продавца, ответственного за маркетинг и распространение").
2 байта 00 40 - поле с битами, обозначающими какие же буквы в шрифте (наклонные, зачеркнутые, жирные, обведенные и т.п.). В двоичной системе это 01000000, т.е. 6 бит установлен, это обычный шрифт (REGULAR).
2 байта 00 20 - 0, минимальный код символа (в Unicode) в шрифте, то бишь первый символ "пробел" с 32 кодом.
2 байта 00 FC - 0, максимальный код символа (в Unicode) в шрифте, т.е. последний символ
Вот уже прошли 68 байт. Осталось 10 байт, которые Microsoft добавили в формат таблицы:
2 байта 02 BC - 700, типографский надстрочник, используется для расчета расположения пробелов между строк текста. Ну и пусть будет 700.
2 байта FF 38 - минус 200, типографский подстрочник, используется для расчета расположения пробелов между строк текста. Ну и пусть будет -200.
не забывайте смотреть в таблице, что поля SHORT -
это знаковые, и тогда FF38 будет не 65336, а -(FFFF-(FF38-1)) = -(65535-(65336-1)) = -200
2 байта 00 1E - 30, расстояние между строками.
2 байта 03 BC - 956, виндовское расстояние над строкой, рассчитывается как Y максимальное для всех символов. Используется виндой для расчета расстояния между строками по умолчанию. Винда обрезает все куски символов, которые вылезут выше этого значения.
2 байта 01 64 - 356, виндовское расстояние под строкой, рассчитывается как минус Y минимальное для всех символов. Используется виндой для расчета расстояния между строками по умолчанию. Винда обрезает все куски символов, которые вылезут ниже этого значения.
Вот такая вот таблица OS/2, причем она
обязательная для Windows шрифтов.
Осталось разобраться, что же это за "пиксели", которые называются то pels, то font design units. Некоторые опорные единицы, и видимо очень мелкие (равные одному пикселю при огромном размере шрифта, 1000, например). Или можно взять за основу то что есть в этом шрифте, а уже походу испытаний сохраненных шрифтов выискивать баги в расчете этих величин (когда винда начнет срезать куски букв при отрисовке и т.д.).
Продолжение следует...