Формат TTF - чтение и запись

Общие темы о программировании
Аватара пользователя
blackstrip
Админ
Сообщения: 1176
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: Формат TTF - чтение и запись

Сообщение blackstrip » Ср сен 04, 2013 2:24 am

Следующий глиф, судя по редактору шрифтов - пустой.

Действительно, в файле по окончании первого глифа - идут два байта 00 00. Это заголовок второго глифа, означающий что в глифе ноль контуров.

А сразу после этих двух байтов начинается заголовок третьего глифа "кавычки" - 2 байта 00 02, означающие, что в глифе 2 контура (первая и вторая кавычка). Ну и, таким образом, последовательно в файл записывается вся таблица глифов.

Продолжение следует...

Аватара пользователя
blackstrip
Админ
Сообщения: 1176
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: Формат TTF - чтение и запись

Сообщение blackstrip » Пт сен 06, 2013 6:52 pm

Следующая таблица - под названием head

Название
68 65 61 64
head
Контрольная сумма
DE 60 F9 96
Смещение
00 00 00 CC
С 204-го байта
Длина
00 00 00 36
54 байта

Переходим на CC-ый байт:
4 байта 00 01 00 00 - версия таблицы 1.0 (два байта до точки, два байта после, т.к. тип этого поля FIXED)
4 байта 00 01 00 00 - версия шрифта 1.0 (тоже по 2 байта до и после точки)
4 байта 02 54 6В B0 - подстроечная контрольная сумма. Apple и Microsoft рекомендуют: для ее расчета - сначала установить эти байты в нулевые значения, затем посчитать контрольную сумму head-таблицы и записать ее в "каталог шрифта" (ту самую первую мини-таблицу, в которой перечислены все таблицы, их контрольные суммы, смещения и длины), а затем посчитать контрольную сумму для всего шрифта и сохранить в это поле значение (0xB1B0AFBA минус посчитанная сумма для всего шрифта). Вот такие хитросплетения)
4 байта 5F 0F 3C F5 - номер, который должен быть тут по стандарту
2 байта 00 19 - 16 бит флагов. 0000 0000 0001 1001.
Бит 0 - базовая линия по Y располагается на отсчете 0 (т.е. на оси X). Этот бит включен.
Бит 1 - самая левая черная точка в шрифте назначается левой границей символа (левой стороной "коробки", ограничивающей символ). Этот бит выключен.
Бит 2 - масштабированное и немасштабированное значение размера пикселя будут отличаться (используется при записи "инструкций" в шрифт и их исполнении движком отрисовки). Этот бит выключен.
Бит 3 - использовать масштабирование в целое количество раз вместо дробного. Этот бит включен. Видимо должно использоваться при отрисовке такого пиксельного шрифта, чтоб не получились пиксели шириной в "полторы" точки. Только в одну, две, три и т.д. Попробовал этим шрифтом в ворде пописать - плевать он хотел на эти биты, увеличивает шрифт плавно, поэтому буквы могут быть при некоторых масштабах неровные =)
Бит 4 - майкрософт пишет про этот флаг инструкции могут изменять общую ширину (advance width) символа (она не может скалироваться линейно). Он включен. Ну пусть так и будет.
Остальные биты выключены - ок, в создаваемых паинткадом шрифтах тоже выключу их.
2 байта 03 E8 - 1000, дробление сетки unitsPerEm, количество единиц на одну секцию сетки, от 16 до 16384, должно быть степенью двойки для шрифтов с использованием TrueType outlines. 1000 ведь не степень двойки - значит шрифт не использует TrueType outlines.
8 байт 00 00 00 00 B6 F1 89 AF - дата создания шрифта, количество секунд с полуночи 00:00 1 января 1904 года. Получается около 97 лет. Т.е. в районе 2001 года шрифт делали
8 байт 00 00 00 00 C5 A5 2C B2 - дата изменения шрифта, количество секунд с полуночи 00:00 1 января 1904 года.
2 байта FF FF = -1, минимальный X для всех символов
2 байта FF 9C = - (FFFF - (FF9C-1)) = -100, минимальный Y для всех символов
2 байта 02 A0 = 672, максимальный X для всех символов
2 байта 02 BC = 700, максимальный Y для всех символов
2 байта 00 00 - 0, стиль Mac, набор из 8 флагов, ноль означает что флаги выключены и стиль никакой
2 байта 00 00 - 0, минимальное количество пикселей на секцию сетки, при котором шрифт еще читаем. Ноль - всегда видимый)
2 байта 00 00 - 0, направление шрифта, если ноль - то "смешанное направление" (куда хочешь - туда и пиши, в любую сторону)
2 байта 00 00 - 0, тип формата смещения, используемого в таблице LOCA ("индекс -> положение", indexToLoc) шрифта. Ноль - короткие смещения, Один - длинные смещения. Тут заданы короткие.
2 байта 00 00 - 0, формат глифов, должен быть 0

Закончили с таблицей head.

Продолжение следует...

Аватара пользователя
blackstrip
Админ
Сообщения: 1176
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: Формат TTF - чтение и запись

Сообщение blackstrip » Пн сен 09, 2013 8:30 am

Дальше таблица hhea, расшифровывается как Horizontal HEAder (горизонтальный заголовок).

Apple: https://developer.apple.com/fonts/TTRef ... 6hhea.html
Microsoft: http://www.microsoft.com/typography/otspec/hhea.htm

Название
68 68 65 61
hhea
Контрольная сумма
05 7B 02 96
Смещение
00 00 01 04
С 260-го байта
Длина
00 00 00 24
36 байт

Картинка с характеристиками глифа (по ней понятны величины в таблице):
Изображение

4 байта 00 01 00 00 - версия таблицы 1.0
2 байта 02 BC - 700, надстрочник (со знаком), в FUNITах
2 байта FF 38 = - (FFFF - (FF38-1)) = минус 200, подстрочник (со знаком), в FUNITах
2 байта 00 1E, 30, типографское расстояние между строками текста (со знаком), в FUNITах
2 байта 03 01, 769, максимальное значение advance width в htmx таблице, т.е. ширины символа с первой жирной точки до второй на картинке выше (беззнаковое), должно быть совместимо с горизонтальными метриками
2 байта FF FF, -1, минимальное bearing с левой стороны символа (со знаком), должно быть совместимо с горизонтальными метриками
2 байта 00 00, 0, минимальное bearing с правой стороны символа (со знаком), должно быть совместимо с горизонтальными метриками
2 байта 02 A0, 672, максимальный выступ, рассчитывается как максимальное значение (lsb + (xMax - xMin)), где lsb - bearing с левой стороны символа, xMax - максимальный X символа, xMin - минимальный X символа
2 байта 00 01, 1, высота курсора
2 байта 00 00, 0, ширина курсора (эти два числа 1 и 0 дают понять, что курсор должен быть вертикальный, а если 0 и 1 было бы - то горизонтальный, а если 1 и 1 - то наклоненный под 45 градусов, видимо)
2 байта 00 00, 0, смещение курсора, для ненаклонных шрифтов - рекомендуют ставить 0
8 байт 00 00 00 00 00 00 00 00, это 8 зарезервированных байт, должны быть всегда нулями
2 байта 00 00, 0, формат данных метрики, на сегодняшний день сюда надо писать ноль
2 байта 00 5С, 92, количество общих ширин символов (advance widths) в таблице метрик, используется в hmtx таблице.

Закончили с таблицей hhea.

Продолжение следует...

Аватара пользователя
blackstrip
Админ
Сообщения: 1176
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: Формат TTF - чтение и запись

Сообщение blackstrip » Ср окт 09, 2013 8:20 am

Следующая таблица - под названием hmtx

Название
68 6D 74 78
hmtx
Контрольная сумма
8C B5 00 12
Смещение
00 00 01 98
С 408-го байта
Длина
00 00 01 7A
378 байт

Apple: https://developer.apple.com/fonts/TTRef ... 6hmtx.html
Microsoft: http://www.microsoft.com/typography/otspec/hmtx.htm

Hmtx - сокращенное "horizontal metrics"

Переходим на "0198"-ый байт, там должен быть массив. Длина массива - равна полю numOfLongHorMetrics из таблицы hhea. Каждый элемент массива - из двух полей:
2 байта 00 С8 - 200, advance width, полная ширина символа
2 байта 00 00 - 0, left side bearing, отступ с левой стороны символа от нулевой origin точки до начала первых пикселей
и т.д.

После этого массива еще один массив отдельно для left side bearing. Его длина - поле numGlyphs (из таблицы maxp) минус numberOfHMetrics. Состоит из 2 байтовых знаковых полей со значениями left side bearing.

Продолжение следует...

Аватара пользователя
blackstrip
Админ
Сообщения: 1176
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: Формат TTF - чтение и запись

Сообщение blackstrip » Пт окт 18, 2013 10:23 am

Дальше идет loca

Название
6С 6F 63 61
loca
Контрольная сумма
46 27 4D FA
Смещение
00 00 06 84
С 1668-го байта
Длина
00 00 00 C4
196 байт

Apple: https://developer.apple.com/fonts/TTRef ... 6loca.html
Microsoft: http://www.microsoft.com/typography/otspec/loca.htm

Эта таблица содержит положение (смещение) глифов в файле.
Бывает двух типов - короткая версия и длинная. Какая лежит в файле - написано в head-таблице. В данном шрифте это короткая версия (цитата из предыдущего поста про head-таблицу):
2 байта 00 00 - 0, тип формата смещения, используемого в таблице LOCA ("индекс -> положение", indexToLoc) шрифта. Ноль - короткие смещения, Один - длинные смещения. Тут заданы короткие.
Раз короткие - значит двухбайтовые. Массив двухбайтовых беззнаковых значений. Причем нужно для конкретного глифа номер N взять двухбайтовое значение номер N+1 и умножить его на 2 (чтобы получить смещение в байтах). Самый первый глиф (номер 0) - это глиф для отсуствующего символа. Поэтому вроде бы как добавляется +1 к индексу.

Итак, в файле лежит таблица до 0x748 байта (где начинается уже таблица glyf), вот она выделена в qview:
Изображение

196 (C4) байт - это 98 глифов. И это есть количество глифов+1, где "количество глифов" берется из maxp-таблицы.

Продолжение следует...

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость