В современной жизни мы имеем дело с текстом на экране почти каждый день — текст кажется настолько обыденным, что многие профессионалы, связанные с пользовательским интерфейсом, плохо понимают стоящие за ним сложности. Эта серия призвана познакомить разработчиков с некоторыми популярными научными знаниями, от двоичных данных текста до процессов между пикселями, в надежде вдохновить заинтересованных студентов.
Стандарты и форматы шрифтов
Студенты, которым нравится возиться с системой, определенно знакомы с распространенными форматами шрифтов: система Windows уже давно используется вC:\Windows\Fonts
Существует множество файлов шрифтов в формате TTF. Соответственно, в macOS/Library/Fonts
В каталоге тоже куча шрифтов: но помимо TTF есть форматы с суффиксами TTC и OTF. С чем они связаны?
Интересный вопрос, почему шрифты формата TTF распространены как в macOS, так и в Windows? На самом деле существует история py-транзакций между Microsoft и Apple: в 1980-х годах Adobe разработала собственный векторный формат шрифта Type 1 и язык печати PostScript (вы можете увидеть его в формате PDF). По сравнению с матричным шрифтом того времени, векторный шрифт — это разница между пехотой и кавалерией:
Adobe жива и здорова, но из-за некоторых нетехнических факторов (денег) Apple и Microsoft решили начать все сначала. Apple разработала TrueType, стандарт векторного шрифта, а Microsoft разработала альтернативу PostScript, TrueImage. Хотя эти две технологии взаимно разрешены между Mac и Windows, единственное, что стало стандартом де-факто, — это Apple TrueType, который соответствует формату шрифта TTF.
Зная, что TTF означает TrueType Font, по аналогии можно вывести и другие форматы:
- Как упаковать и выпустить кучу шрифтов TTF и семейных ведер? Давайте Коллекцию - отсюда и формат ТТС.
- Не ссорьтесь больше, давайте работать вместе, чтобы открыться — так есть формат OTF OpenType.
- Мы больше всего заботимся о размере Интернета, а вы, ребята, слишком велики, поэтому у нас есть формат WOFF.
Конечно, простое знание имени суффикса ничем не отличается от владения правописанием Java/C++. Давайте посмотрим, что скрыто в файле шрифта?
Xiaotan TTF файл
Во многих документах со спецификациями для форматов шрифтов подчеркивается, что файлы шрифтов создаютсяповерхностьсостоит. Мяу-мяу-мяу? Упомянутая здесь таблица похожа на таблицу Excel? Откройте файл шрифта в формате TTF, и ваше первое впечатление может быть сложно соотнести с таблицей:
О каком количестве строк и столбцов вы говорите? Однако таблицы подразумевают относительно регулярную структуру данных. Внимательные студенты могли заметить, что крайний правый столбец приведенных выше данных представляет собой набор из четырех букв. Это не случайно, согласно спецификации формата TTF.
Прежде чем продолжить вводить их конкретные значения, мы, возможно, пожелаем рассмотреть такой вопрос: как спроектировать формат данных, отвечающий следующим требованиям?
- У вас есть множество различных полей для хранения, каждый с фиксированным форматом, но переменной длины.
- Типы полей, которые необходимо сохранить, могут отличаться, а некоторые новые поля могут быть расширены в будущем. Это должно быть совместимо как вверх, так и вниз.
- Должна быть возможность узнать основную информацию о полях (позиция, длина и т. д.), не просматривая весь файл.
- Объем данных должен быть как можно меньше, и он также должен поддерживать проверку целостности содержимого.
Теперь популярный формат JSON в разработке прикладного уровня будет убит в первую очередь с точки зрения наименьшего размера. Спецификация TTF предоставляет инженерную практику для справки при разработке спецификаций формата данных:
- Дайте всем полям уникальное четырехбуквенное имя, и их соответствующее содержимое будет непрерывным фрагментом двоичных данных.
- В заголовке файла сначала сохраните таблицу, которая «выражает общую структуру таблицы». Там вы указываете, сколько существует различных полей, а также их длины, начальные позиции и т. д. Эта таблица называется таблицей смещения.
- Сразу после этой таблицы содержимое этих таблиц полей сращивается сегмент за сегментом для получения окончательного шрифта формата TTF.
Давайте посмотрим, как этот дизайн удовлетворяет эти потребности:
- Длина и порядок расположения каждой таблицы, используемой для хранения информации о шрифтах, абсолютно свободны (это чем-то похоже на структуру карты).
- Нет проблем совместимости между типами полей и последующими расширениями.О степени анализа можно судить по таблице смещения, чтобы определить степень поддержки данных.
- В таблице смещений смещение и длина данных каждого поля могут быть известны напрямую.
- Данные каждого поля хранятся в согласованной двоичной форме, а их контрольные суммы также хранятся в таблице смещений в качестве базовой основы для оценки целостности.
Простой пример может проиллюстрировать компактность двоичных структур данных. Например, при выражении метаданных, таких как жирный шрифт, курсив, моноширинный шрифт и т. д., формат JSON должен согласовывать формат для каждого состояния, напримерxxx: true
Поле, для которого требуется не менее пяти байтов. И на основе соглашения о битовой операции он может быть сохранен в одном байте из восьми битов этого 8true|false
Переменная логического типа часто имеет избыточность. Он также имеет уникальные преимущества, когда необходимо различать и сохранять различные данные точности. Поэтому, когда необходимо построить собственную структуру данных, табличный дизайн TTF по-прежнему имеет определенное справочное значение. Кроме того, при разборе такого бинарного формата весьма кстати будет и поток управления традиционного императивного программирования: не заглушайте его порывистыми голосами в сообществе, изучайте приемы, действительно применимые к разным сценариям.
Вернемся к исходной теме, какие таблицы хранятся в шрифте для выражения различного содержания? Рекомендуется здесьTypr.jsЭтот очень простой веб-инструмент, который можно использовать «из коробки», выглядит так:
Вы видели, как содержимое каждой таблицы анализируется? Они хранят ключевую информацию от двоичных битов до пикселей экрана. До сих пор мы рассмотрели формат файла шрифта и основной способ его разбора. Но как отображать текст на основе данных глифов? Увидимся в следующий раз (если будет)
P.S.1 Если вы хотите глубже понять структуру данных шрифтов, этой научно-популярной статьи далеко не достаточно.TrueType Reference ManualПриступим к документации. Обратите внимание, что в начале этого документа Apple есть ссылка на официальный сайт Microsoft, который может быть трудно увидеть в других случаях...
P.S.2 Наша команда разработчиков приветствует студентов, которые заинтересованы в том, чтобы разобраться в «рендеринге».Если вы заинтересованы, пожалуйста, напишите xuebi по адресуgaoding.comкакие