Как устроен файл ttf

Обновлено: 03.07.2024

TrueType является контурный шрифт стандарт , разработанный Apple , в конце 1980 - х годов в качестве конкурента Adobe «s Type 1 шрифтов , используемых в PostScript . Он стал наиболее распространенным форматом шрифтов в классических операционных системах Mac OS , macOS и Microsoft Windows .

Основная сила TrueType изначально заключалась в том, что он предлагал разработчикам шрифтов высокую степень контроля над тем, как именно отображаются их шрифты, вплоть до определенных пикселей , с различными размерами шрифтов. В связи с тем, что сегодня используются самые разные технологии рендеринга, для шрифта TrueType больше нельзя использовать элемент управления на уровне пикселей.

СОДЕРЖАНИЕ

История

TrueType был известен на стадии разработки, сначала под кодовым названием «Бас», а затем под кодовым названием «Роял». Система была разработана и в конечном итоге выпущена как TrueType с запуском Mac System 7 в мае 1991 года. Первоначальные контурные шрифты TrueType, семейства Times Roman , Helvetica , Courier с четырьмя весами , а также шрифт pi «Symbol» копировали оригинальные шрифты PostScript. из Apple LaserWriter. Apple также заменила некоторые из своих растровых шрифтов, используемых в графическом пользовательском интерфейсе предыдущих версий системы Macintosh (включая Женеву, Монако и Нью-Йорк), на масштабируемые контурные шрифты TrueType. Для совместимости со старыми системами Apple предоставила эти шрифты, расширение TrueType и версию Font / DA Mover для System 6 с поддержкой TrueType . Для совместимости с Laserwriter II Apple разработала шрифты, такие как ITC Bookman и ITC Chancery, в формате TrueType.

Все эти шрифты теперь можно масштабировать до любых размеров на экране и на принтере, что делает Macintosh System 7 первой ОС, работающей без растровых шрифтов. Ранние системы TrueType - все еще являющиеся частью графической подсистемы Apple QuickDraw - не отображали шрифты Type 1 на экране, как это происходит сегодня. В то время многие пользователи уже вложили значительные деньги в все еще проприетарные шрифты Adobe Type 1. В рамках тактики Apple по открытию формата шрифта против желания Adobe сохранить его закрытым для всех, кроме лицензиатов Adobe, Apple передала лицензию TrueType Microsoft . Когда было объявлено о TrueType и лицензии Microsoft, Джон Варнок из Adobe произнес страстную речь, в которой заявил, что Apple и Microsoft продают змеиное масло , а затем объявил, что формат Type 1 открыт для всех.

Между тем, в обмен на TrueType Apple получила лицензию на TrueImage , PostScript- совместимый язык описания страниц, принадлежащий Microsoft, который Apple может использовать при лазерной печати . Фактически это никогда не было включено ни в какие продукты Apple, когда позднее было заключено соглашение между Apple и Adobe, по которому Adobe пообещала установить интерпретатор TrueType в свои платы принтеров PostScript. Apple возобновила свои соглашения с Adobe на использование PostScript в своих принтерах, что привело к более низким выплатам роялти компании Adobe, которая начала лицензировать контроллеры принтеров, способные напрямую конкурировать с принтерами Apple LaserWriter.

Частью реакции Adobe на информацию о разработке TrueType было создание программного обеспечения Adobe Type Manager для масштабирования шрифтов Type 1 для вывода на экран со сглаживанием . Хотя изначально банкомат стоил денег, а не был бесплатным с операционной системой, он стал де-факто стандартом для всех, кто занимается настольными издательскими системами . Рендеринг со сглаживанием в сочетании с возможностью приложений Adobe увеличивать масштаб для чтения мелкого шрифта, а также в сочетании с теперь открытым форматом шрифтов PostScript Type 1, послужили толчком к взрывному развитию шрифтового дизайна и настольной публикации газет и журналов.

Apple расширила TrueType с запуском TrueType GX в 1994 году, добавив дополнительные таблицы в sfnt, которые являются частью QuickDraw GX . Это предложило мощные расширения в двух основных областях. Во-первых, это оси шрифтов ( морфинг ), например, позволяющие плавно настраивать шрифты от светлого к полужирному или от узкого к расширенному - конкуренция за технологию Adobe " multi master ". Вторым был Менеджер компоновки строк, в котором определенные последовательности символов могут быть закодированы для перехода к разным рисункам в определенных обстоятельствах, что полезно, например, чтобы предлагать лигатуры для «fi», «ffi», «ct» и т. Д., Сохраняя при этом резервное хранилище символы, необходимые для проверки орфографии и поиска текста. Однако отсутствие удобных инструментов для создания шрифтов TrueType GX означало, что шрифтов GX было всего несколько.

Большая часть технологий TrueType GX, включая морфинг и замену, продолжает существовать в macOS как AAT ( Apple Advanced Typography ) . Некоторые разработчики шрифтов за пределами Apple пытаются создавать шрифты AAT; вместо этого OpenType стал доминирующим форматом sfnt.

Принятие Microsoft

Чтобы обеспечить его широкое распространение, Apple предоставила Microsoft бесплатную лицензию на использование TrueType. К 1991 году Microsoft добавила TrueType в операционную среду Windows 3.1 . В сотрудничестве со своими подрядчиками, Monotype Imaging , Microsoft приложила много усилий для создания набора высококачественных шрифтов TrueType, совместимых с основными шрифтами, которые в то время поставлялись в комплекте с оборудованием PostScript. Сюда входят шрифты, которые являются стандартными для Windows по сей день: Times New Roman (совместимый с Times Roman), Arial (совместим с Helvetica) и Courier New (совместим с Courier). Под словом «совместимость» следует понимать две вещи: во-первых, шрифты похожи по внешнему виду, а во-вторых, что очень важно, шрифты имеют одинаковую ширину символов и поэтому могут использоваться для набора одних и тех же документов без перекомпоновки текста. .

Технические специалисты Microsoft и Monotype использовали технологию хинтинга TrueType, чтобы гарантировать, что эти шрифты не страдают от проблемы неразборчивости при низких разрешениях, которая ранее вынуждала использовать растровые шрифты для отображения на экране. Последующие достижения в области технологии представили первое сглаживание, которое сглаживает края шрифтов за счет небольшого размытия, а в последнее время - субпиксельный рендеринг (реализация Microsoft называется ClearType ), который использует структуру пикселей ЖК- дисплеев. для увеличения видимого разрешения текста. Microsoft активно продвигает ClearType, и методы субпиксельного рендеринга текста теперь широко используются на всех платформах.

Microsoft также разработала технологию « умных шрифтов », названную TrueType Open в 1994 году, позже переименованную в OpenType в 1996 году, когда она объединила поддержку контуров глифов Adobe Type 1.

TrueType сегодня

Macintosh и Microsoft Windows

TrueType уже давно является наиболее распространенным форматом шрифтов в классической Mac OS , Mac OS X и Microsoft Windows , хотя Mac OS X и Microsoft Windows также включают встроенную поддержку формата Adobe Type 1 и расширения OpenType для TrueType (начиная с Mac OS X 10.0 и Windows 2000 ). Хотя некоторые шрифты, поставляемые с новыми операционными системами, теперь имеют формат OpenType, большинство бесплатных или недорогих сторонних шрифтов используют простой TrueType.

Повышение разрешения и новые подходы к рендерингу экрана снизили потребность в обширных подсказках TrueType. Подход Apple к рендерингу в macOS игнорирует почти все подсказки в шрифте TrueType, в то время как Microsoft ClearType игнорирует многие подсказки и, по мнению Microsoft, лучше всего работает со шрифтами со «слегка намеками».

Linux и другие платформы

Проект FreeType Дэвида Тернера создал независимую реализацию стандарта TrueType (а также других стандартов шрифтов в FreeType 2). FreeType включен во многие дистрибутивы Linux .

До мая 2010 года не были потенциальные нарушения патентных прав в FreeType 1 , потому что части TrueType намекая виртуальную машину были запатентованы от Apple, на самом деле не упоминается в стандартах TrueType. (Владельцы патентов, которые вносят свой вклад в стандарты, опубликованные крупным органом по стандартизации, таким как ISO , должны раскрывать объем своих патентов, но TrueType не был таким стандартом.) FreeType 2 включал дополнительный автоматический хинтер, чтобы избежать запатентованной технологии, но они срок действия патентов истек, поэтому FreeType 2.4 теперь включает эти функции по умолчанию.

Технические примечания

Контуры

Сегмент квадратичной кривой Безье определяется двумя конечными точками и одной контрольной точкой. Этот круг состоит из восьми смежных сегментов. Квадраты - это конечные точки, а круги - контрольные точки.

Контуры символов (или глифов ) в шрифтах TrueType состоят из отрезков прямых линий и квадратичных кривых Безье . Эти кривые математически проще и быстрее обрабатывать, чем кубические кривые Безье, которые используются как в мире графического дизайна, ориентированном на PostScript, так и в шрифтах Type 1. Однако для большинства форм требуется больше точек для описания квадратичными кривыми, чем кубиками. Это различие также означает, что невозможно преобразовать Тип 1 без потерь в формат TrueType, хотя на практике часто можно выполнить преобразование без потерь из TrueType в формат Тип 1.

Язык подсказок

Системы TrueType включают виртуальную машину, которая выполняет программы внутри шрифта, обрабатывая « подсказки » глифов . Они искажают контрольные точки, определяющие контур, с тем, чтобы растеризатор создавал меньше нежелательных функций на глифе. Программа подсказок каждого глифа учитывает размер (в пикселях), при котором глиф должен отображаться, а также другие менее важные факторы среды отображения.

Несмотря на то, что язык подсказок TrueType неспособен принимать ввод и производить вывод, как это обычно понимается в программировании, он предлагает другие предварительные условия языков программирования: условное ветвление (операторы IF), выполнение цикла произвольное количество раз (операторы типов FOR и WHILE), переменные (хотя это просто нумерованные слоты в области памяти, зарезервированной шрифтом), и инкапсуляция кода в функции. Специальные инструкции, называемые дельта-подсказками, представляют собой элемент управления самого низкого уровня, перемещающий контрольную точку всего на один пиксель.

Отличительным эффективных методов TrueType глифов программирования является то , что он делает как можно больше с помощью переменных определяются только один раз , в целом шрифта (например, стволовые ширины, высоты колпачка , х-высота ). Это означает, что нужно максимально избегать инструкций по дельте. Это помогает разработчику шрифта вносить серьезные изменения (например, точку, в которой основные основы всего шрифта перескакивают с 1 на 2 пикселя в ширину) на протяжении большей части процесса разработки.

Создание шрифта TrueType с очень четкими подсказками остается значительным объемом работы, несмотря на повышенное удобство использования программ для добавления подсказок к шрифтам. Поэтому многие шрифты TrueType имеют только элементарные подсказки или имеют подсказки, автоматически применяемые редактором шрифтов, с результатами разного качества.

Защита от встраивания

Формат TrueType допускает самый простой тип управления цифровыми правами - встраиваемое поле флага, которое указывает, разрешает ли автор встраивать файл шрифта в такие вещи, как файлы PDF и веб-сайты. Любой, у кого есть доступ к файлу шрифта, может напрямую изменить это поле, и существуют простые инструменты, облегчающие его изменение (очевидно, изменение этого поля не изменяет лицензию на шрифт и не дает дополнительных юридических прав). Эти инструменты были предметом споров по поводу потенциальных проблем с авторским правом.

Форматы шрифтов

Коллекция TrueType

TrueType Collection (TTC) - это расширение формата TrueType, которое позволяет объединять несколько шрифтов в один файл, обеспечивая значительную экономию места для коллекции шрифтов с множеством общих глифов. Сначала они были доступны в китайской, японской и корейской версиях Windows и поддерживались для всех регионов в Windows 2000 и более поздних версиях.

Классическая Mac OS включала поддержку TTC, начиная с Mac OS 8 .5. В классической Mac OS и macOS TTC имеет тип файла ttcf .

Смайлики

Apple реализовала собственное расширение, позволяющее использовать цветные файлы .ttf для своего шрифта смайликов Apple Color Emoji .

Форматы файлов

Базовый

Базовый шрифт состоит из нескольких таблиц, указанных в его заголовке. Имя таблицы может содержать до 4 букв.

Файл коллекции TrueType начинается с таблицы ttcf, которая позволяет получить доступ к шрифтам в коллекции, указывая на отдельные заголовки для каждого включенного шрифта. Шрифты в коллекции используют одну и ту же таблицу схем глифов, хотя каждый шрифт может ссылаться на подмножества в этих схемах по-своему через свои таблицы cmap, name и loca.

Расширение .ttf указывает на обычный шрифт TrueType или шрифт OpenType с контурами TrueType, тогда как расширение .ttc зарезервировано для TTC. Редактор символов, определяемый конечным пользователем Windows (EUDCEDIT.EXE), создает шрифт TrueType с именем EUDC.TTE. Шрифт OpenType с контурами PostScript должен иметь расширение .otf. В принципе, шрифт OpenType с контурами TrueType может иметь расширение .otf, но на практике это делается редко.

В классической Mac OS и macOS OpenType является одним из нескольких форматов, называемых шрифтами вилки данных, поскольку в них отсутствует классическая вилка ресурсов Mac.

Чемодан

Формат чемодана для TrueType используется в классической Mac OS и macOS. Он добавляет дополнительную информацию, относящуюся к Apple.

Как и TTC, он может обрабатывать несколько шрифтов в одном файле. Но в отличие от TTC, эти шрифты не обязательно должны принадлежать к одному семейству.

Чемоданы бывают в форматах ресурсов и данных . Версия с вилкой ресурсов была оригинальным форматом чемодана. Чемоданы только для вилки данных, которые помещают содержимое вилки ресурсов в вилку данных, впервые были поддержаны в macOS. Чемодан, упакованный в формат data-fork-only, имеет расширение dfont .

PostScript

В языке PostScript контуры TrueType обрабатываются с помощью оболочки PostScript как Тип 42 для шрифтов с ключом имени или Тип 11 для шрифтов с ключом CID .

Пожалуй, самый распространённый на сегодняшний день формат шрифтов это TrueType и его расширение – OpenType.
Стандарт TrueType разработан компанией Apple в конце 1980-х годов и представляет собой векторное описание символов шрифта, что позволяет их легко масштабировать. Файл шрифта состоит из нескольких двоичных таблиц, которые описывают различные свойства шрифта.

Первые компьютеры Apple использовали процессоры Motorolla 68xxx, которые имели отличный от архитектуры x86 порядок байт в машинном слове. При работе непосредственно с файлом шрифтов необходимо учитывать этот факт.

Формат OpenType обратно совместим с форматом TrueType и является его расширением. Одной из новых возможностей OpenType являются коллекции шрифтов (расширение .ttc). Коллекция описывает несколько шрифтов, при этом некоторые таблицы коллекции могут быть общими для всех шрифтов коллекции.

Для чего может понадобиться знание внутреннего устройства шрифта? Например, некоторые форматы документов (pdf, xps) позволяют включать файл шрифта непосредственно в документ. Это делается для того, чтобы документ правильно отображался на системе, где не установлен шрифт, используемый в документе. Но даже внедрение шрифта не обязывает знать его структуру. Так зачем же может понадобиться знание внутреннего устройства шрифта? Дело в том, что внедрение даже одного шрифта способно увеличить размер документа во много раз. Это цена, которую приходится платить за возможность использования документа на любой платформе и любом устройстве. Стоит ли говорить, что внедрение нескольких шрифтов может на порядки увеличить размер документа? Именно поэтому возникает необходимость «обрезать» шрифт, оставив в нём только необходимую информацию, например, удалить из шрифта данные о начертаниях символов, не используемых в документе.

Итак, настало время внимательно рассмотреть содержимое TTF файла. Посмотрим, из чего же состоит шрифт Arial из Windows 7. В нём обнаружены следующие таблицы:


Однако, здесь возникает проблема – таблица глифов содержит только описание глифов, но не содержит информацию об их позициях в таблице. Чтобы получить позицию глифа в таблице glyf, используется вспомогательная таблица loca . Структура этой таблицы исключительно проста – количество её элементов соответствует количеству символов в шрифте и каждый элемент этой таблицы указывает позицию символа в таблице glyf:



Соответственно, при сжатии шрифта, вместе с перестройкой и сжатием таблицы глифов, перестраивается таблица loca. Помимо информации о позиции глифа, из этой таблицы можно получить информацию о количестве байт, занимаемые глифом. На приведённом выше рисунке можно увидеть, что элементы с номерами 1, 2, 3 и 4 имеют одинаковое значение. Дело в том, что количество байт, необходимых для отрисовки символа, можно получить вычитая текущую позицию из позиции следующего элемента таблицы. Например, из фрагмента вышеприведённой таблицы loca, видно, что информация, необходимая для изображения первого символа (элемент 0), занимает 42 байта. Если какой-то символ не имеет графического отображения в таблице глифов, то следующий элемент будет начинаться с той же самой позиции. Таким образом символы, определяемые элементами 1, 2 и 3 не имеют графического представления. Символ, определяемый четвёртым элементом, начинается со смещения 42 и занимает 172 байта.

В мире используются множество языков, а любой шрифт формата TrueType может содержать различные комбинации различных шрифтов для различных языков. Для того, чтобы перейти от кода символа к его графическому представлению, используется дополнительная таблица cmap . Все символы шрифта разбиты на сегменты, где каждый сегмент соответствует набору символов какого-либо алфавита.
Например, нам необходимо, используя файл шрифта, нарисовать русскую букву Ё. Для этого по коду символа находится сегмент в таблице cmap. Если соответствующий символу сегмент не найден, то шрифт не содержит описание символа. Если сегмент найден, то с помощью несложной формулы находится индекс, указывающий позицию этого символа в таблице loca. Элемент таблицы loca по найденному индексу указывает на данные символа в таблице glyf.

Буква Ё неслучайно взята для примера, в найденной позиции таблицы glyf Вы не найдёте буквы Ё. Причина в том, что эта буква является составной из двух глифов – из глифа Е и глифа «комбинированный диарезис» (две точки над символом). Соответственно, в найденной позиции будет описание взаимного расположения и индексы простых глифов, из которого образован составно глиф. Этот момент необходимо учитывать, чтобы при упаковке таблицы по ошибке не удалить части составного глифа.

Таким образом, при переходе от кода символа к его графическому представлению всегда используются три таблицы. А что же остальные таблицы? Часть из них необходима, а часть необязательна, но позволяют улучшить вид печатаемого документа. Например, некоторые шрифты могут содержать в себе тщательно нарисованные художниками графические образы символов, для их корректного отображения на устройствах с низким DPI (графическим разрешением, определяющим количество точек на 1 дюйм). В большинстве случаев можно исключить эту таблицу при сжатии шрифта. В этом случае документ будет иметь чуть худший вид на экране, но при этом хорошо выглядеть при печати на современных принтерах.

Таблица name содержит текстовые описания шрифта – короткое и полное имя, автор шрифта, версия шрифта, лицензионная информация и другие параметры. Именно из этой таблицы черпают информацию различные программы для каталогизации, просмотра и выбора шрифтов. Например, на рисунке ниже показаны некоторые строки, содержащиеся в шрифте Arial.




Базовые свойства шрифта определяются таблицей head. Её содержимое показано на рисунке ниже.


Поля indexToLocFormat и glyphDataFormat таблицы head определяет формат таблиц loca и glyf, поэтому таблица head должна быть прочитана первой. Даты создания и модификации шрифта указаны в секундах, прошедших с 1 января 1904 года. Параметры xMax, xMin, yMax, yMin описывают прямоугольник, в который вписываются любой глиф шрифта. Важный параметр, использующийся при рисовании символов шрифта – untisPerEm. Он определяет, ширину заглавной латинской буквы M в условных единицах. Значение untisPerEm используется для масштабирования символов при их выводе на физические устройства – экран или принтер.

Пришла в голову мысль сделать в PaintCAD 4Windows экспорт PCF шрифтов в TTF. Чтобы можно было использовать нарисованные шрифты не только в PCW, но и в других программах.

PCF - формат растровый, внутри него картинки букв, цифр и других символов. (кстати, недавно узнал что есть еще один формат шрифтов PCF - Portable Compiled Format, он тоже растровый, как ни странно).

А TTF - векторный. Внутри него опорные точки для прямых линий, кривых линий Безье и множество других вещей, даже можно внутрь запихнуть растр (вроде как).

Формат TTF придумал Apple. Потом он разошелся на разные подформаты, один для Mac-ов, другой для Винды, еще для OS/2 что то было. Вроде бы это все один и тот же формат, но для каждого направления там свои особенности что ли.

Т.к. в инете почти нет информации про чтение TTF, и тем более про запись TTF, а тем более на русском - то буду потихоньку переводить этот файл спецификации. Переведенное в упрощенном виде буду выкладывать в эту тему. Основная задача - записать растр в векторный формат TTF. Кому то может быть будет интересно почитать (тем кто тоже захочет читать и писать TTFы). Заодно и сам разберусь.

Значит то, что будет записываться у нас - это файл OpenType. Он может иметь расширение как TTF, так и OTF. Зависеть расширение файла должно от того, если ли в нашем шрифте TrueType outlines или нет. Но чтобы долго не думать - будем сохранять с расширением TTF, а что это за зверь "TrueType outlines", наверное, поймем позже.

Во всей этой документации используются следующие типы данных:
BYTE 1-байтовое беззнаковое целое
CHAR 1-байтовое знаковое целое
USHORT 2-байтовое беззнаковое целое
SHORT 2-байтовое знаковое целое
UINT24 3-байтовое беззнаковое целое
ULONG 4-байтовое беззнаковое целое
LONG 4-байтовое знаковое целое
Fixed 4-байтовое знаковое с фиксированной (неплавающей) точкой (а ля 16 бит до точки и 16 бит после)
FUNIT Минимальное измеряемое расстояние в пространстве "em"
FWORD 2-байтовое знаковое целое (SHORT), которое описывает количество в единицах FUNIT.
UFWORD 2-байтовое беззнаковое целое (USHORT), которое описывает количество в единицах FUNIT.
F2DOT14 2-байтовое знаковое с фиксированнной точкой, где 2 бита - число до точки, а 14 оставшихся - после точки (а ля 2.14).
LONGDATETIME Дата, описывающая количество секунд с полуночи 12:00 от 1 января 1904 года. Знаковое 64-битное целое.
Tag Массив из четырех uint8s (длина в общем - 32 бита) используется для идентификации скрипта, языковой системы, фичи или базовой линии
GlyphID Индекс глифа, такой же как uint16 (длина 16 бит)
Offset Смещение таблицы, такое же как uint16 (длина 16 бит), неустановленное смещение (NULL) должно быть равно 0x0000

Чтобы не просто читать документацию, а сравнивать ее с реальными шрифтами - возьмем несколько готовых TTF шрифтов и будем смотреть их внутреннюю структуру.

Изображение

Я выбрал три шрифта из папки Windows/Fonts

Изображение

Первый - пиксельный грубый шрифт, примерно такой же я хочу получать в паинткаде из растрового PCF шрифта. Чем больше выбираем размер - тем сильнее увеличиваются квадраты-пиксели:

Изображение

Второй - шрифт для нотной грамоты, там всякие ноты, паузы и другие значки:

Изображение

Третий - спецшрифт от Adobe, внутри почти нет символов, несколько хреновинок и точек:

Почитав разные источники, понял что выбрал не те шрифты для разбора)

Изображение

Смотрим его в хекс-редакторе, попутно читая документацию по TTF от Apple и от Microsoft

2 байта: 00 0С - "количество таблиц". 12 штук. Ну и хорошо.

2 байта: 00 80 - "диапазон поиска" - 16 умножить на максимальную степень двойки, меньшую или равную "количеству таблиц". В байтах у нас число 128. Поделим обратно на 16 - будет 8. Ну все правильно.
2^0 - это 1. И это меньше 12 таблиц.
2^1 - это 2. И это меньше 12 таблиц.
2^2 - это 4. И это меньше 12 таблиц.
2^3 - это 8. И это меньше 12 таблиц.
2^4 - это 16. И это больше 12 таблиц! Он уже не подходит, надо брать предыдущий. Значит 8 это максимальный результат возведения двойки в степень. Его и записали, причем умноженным на 16.

2 байта: 00 03 - "входной селектор". Логарифм по основанию 2 от (максимальной степени двойки, меньшей или равной "количеству таблиц"). Это в какую степень надо возвести 2, чтобы получить не большее число, чем количество таблиц. В предыдущих двух байтах нам подошло число 2^3, поэтому сюда надо эту самую степень, т.е. 3. Так оно и есть.

2 байта: 00 40 - "сдвиг диапазона". Это ("количество таблиц" * 16 - "диапазон поиска") = 12 * 16 - 128 = 12 * 16 - 8 * 16 = 4 * 16 = 64, т.е. 40 в шестнадцатиричной системе. Так оно и есть.

Вот такой основной заголовок TTF шрифта. Совсем несложный вроде бы. Ниже под ним идут структуры для каждой из 12 таблиц.

Заголовок таблицы

4 байта - идентификатор, обычный текст. Например, cmap, glyf, head и т.д.
4 байта - контрольная сумма. О ней ниже.
4 байта - смещение в байтах от начала sfnt-файла (видимо в яблочных устройствах TTF-файлы именуются как SFNT).
4 байта - длина таблицы в байтах.

Apple приводит код для подсчета контрольной суммы:

uint32 CalcTableChecksum(uint32 *table, uint32 numberOfBytesInTable)
uint32 sum = 0;
uint32 nLongs = (numberOfBytesInTable + 3) / 4;

while (nLongs-- > 0)
sum += *table++;

Приходит в процедуру указатель на массив table и 32-битная длина таблицы в байтах (видимо, та самая из заголовка таблицы). Высчитывается длина таблицы в 4-байтных словах (1 байт = (1+3)/4 = 1 слово, 2 байта - 1 слово, 3 байта - 1 слово, 4 байта - 1 слово, 5 байт = (5+3)/4 = 2 слова, 6 байт - 2 слова и т.д., поэтому там +3). И потом в цикле по всем 4-байтным элементам таблицы идет сложение их беззнаковых значений в одну кучу (одно беззнаковое число). Беззнаковые 32-битные в дельфе это тип Longword или Cardinal (одно и тоже, но Longword это "фундаментальный", а Cardinal нет, в общем то разницы между ними нет).

Таким образом, в дельфе это будет нечто типа
checksum:=0;
leng:=(lenbytes+3) div 4;
for i:=0 to leng-1 do checksum := checksum + table; ,
достаточно простой подсчет. Я ожидал худшего.

Apple приводит обязательные таблицы в TTFе, а также необязательные.

Обязательные (9 штук, значит в шрифте Wendy из 12 таблиц еще есть 3 штуки необязательных):
'cmap' -связи между символами и их номерами
'glyf' - изображения символов
'head' - заголовок шрифта
'hhea' - горизонтальный заголовок
'hmtx' - горизонтальные метрики
'loca' - индекс положения
'maxp' - профиль максимума
'name' - обозначение
'post' - PostScript

Необязательные:
'cvt ' - контрольное значение
'fpgm' - программа шрифта
'hdmx' - горизонтальные метрики устройства
'kern' - кернинг
'OS/2' - OS/2
'prep' - программа контрольного значения

В хекс-редакторе сразу виды все названия таблиц в шрифте друг под другом (т.к. длина заголовка таблицы 16 байт и в хекс-редакторах обычно бывает по 16 байт на строку), это OS/2, cmap, fpgm, glyf, head, hhea, htmx, loca, maxp, name, post, prep.

Изображение

Придется посмотреть все таблицы по очереди, чтоб понять как устроен TTF.

Итак, расшифровываем заголовки таблиц и содержимое каждой таблицы.

Отличия от 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) в шрифте, т.е. последний символ

2 байта 00 1E - 30, расстояние между строками.
2 байта 03 BC - 956, виндовское расстояние над строкой, рассчитывается как Y максимальное для всех символов. Используется виндой для расчета расстояния между строками по умолчанию. Винда обрезает все куски символов, которые вылезут выше этого значения.
2 байта 01 64 - 356, виндовское расстояние под строкой, рассчитывается как минус Y минимальное для всех символов. Используется виндой для расчета расстояния между строками по умолчанию. Винда обрезает все куски символов, которые вылезут ниже этого значения.

Вот такая вот таблица OS/2, причем она обязательная для Windows шрифтов.

Осталось разобраться, что же это за "пиксели", которые называются то pels, то font design units. Некоторые опорные единицы, и видимо очень мелкие (равные одному пикселю при огромном размере шрифта, 1000, например). Или можно взять за основу то что есть в этом шрифте, а уже походу испытаний сохраненных шрифтов выискивать баги в расчете этих величин (когда винда начнет срезать куски букв при отрисовке и т.д.).

На сегодняшний день шрифты стали доступными и мало кому интересными, за исключением тех, кто с их помощью зарабатывает деньги. Редко встречаются энтузиасты, которые безвозмездно рисуют качественные шрифты и выкладывают их в свободный доступ. Также тяжело найти человека, который будет скачивать, и коллекционировать шрифты ради хобби. Чаще всего, одни создают гарнитуры с целью их продажи дизайнерам, а последние, в свою очередь, используют их в своих работах и перепродают своему клиенту.

Тем ни менее, бесплатные шрифты это не миф. Многие из них устаревшие, некоторые демонстрационные, но есть и качественные, современные начертания. Создавая бесплатные гарнитуры, и выкладывая их в свободный доступ, чаще всего, разработчики привлекают внимание к своим платным продуктам.

Как устроен современный электронный шрифт? В создании шрифта принимают участие много специалистов. В первую очередь это художники, дизайнеры и юристы. Последние нужны для того, чтобы впоследствии не было проблем с регистрацией нового набора изображений (в зависимости от законодательства страны). Это не шутка – был уже скандал, когда в российских деньгах использовался контрафактный шрифт. В целом, обычный шрифт TrueType «готовится» по следующему рецепту. Как правило, сначала определяется его вид, рисуются эскизы, прорабатываются особенности начертания. Затем каждый символ рисуется краской на бумаге удобного формата. Затем картинка попадает в сканер и преобразовывается в набор кривых линий, регулируемых точками привязки. Такой эффект вы можете наблюдать в векторных редакторах таких как Corel Draw и Adobe Illustrator. Изображение снова проходит корректуру: выбрасываются лишние элементы кривых, остальные скругляются и дорабатываются до идеала. В результате получается контурное изображение символа с пустотами внутри, рассчитанное на максимальный размер шрифта. Затем на основе векторов набор кривых преобразуется в математический вид – системы уравнений, таблицы уточнений и контрольных точек. Эта информация преобразуется в специальный формат и записывается в виде программы. Да, TTF файл – это тоже программа Windows.

Применение математических преобразований дает возможность выдавать различные масштабы символов по требованию, при этом в отдельных случаях могут появляться искажения шрифта. В этом случае дорабатываются и шрифт, и формулы – происходит отладка. Интересно, что курсивный, полужирный и комбинированные варианты начертания получаются отнюдь не «автоматом» – они тоже рисуются отдельно.


Внутри Windows существует шрифтовой растризатор: когда программа просит дать ей символ Arial Cyr 12 пунктов, растризатор ищет установленный шрифт, считывает из него формулы, строит чертеж в памяти и заливает пустоты фоновым цветом. Затем изображение отдается приложению в виде растровой картинки нужного размера. Кстати, на медленных компьютерах вы могли замечать, как строки символов появляются «половинками». Для того, чтобы растризатор работал быстрее, файлы гарнитур содержат самые популярные его размеры в оптимизированном виде. Скажем, экранные шрифты, для окон диалогов, меню уже заранее преобразованы в графические матрицы с определенным шагом.

Кроме того, в хороших шрифтах обязательно учитываются кернинговые пары – особенности выбора расстояния между определенными символами: они будут автоматически сдвигаться ближе друг к другу при выводе.

Если вы дизайнер, и вам интересна разработка шрифтов – попробуйте программы FontForge или Fontstruct. Разобраться с интерфейсом труда не составит, однако, если вы хотите создать качественную гарнитуру – вам нужно придется запастись терпением

Читайте также: