❗ Вебсайт в стадии бета-тестирования. Возможны ошибки.

Шрифт формата OpenType

Шрифт OpenType в настоящее время является фактическим стандартом и лучшим в своём классе форматом цифровых шрифтов.

Возможности шрифта

Шрифт OpenType позволяет:

  • Заменять глифы лигатурами.
  • Применять макеты, задавать правила замены и позиционирования глифов.
  • Позиционировать положение глифа. Например, задать кернинг между двумя символами.
  • Форматировать строку символов и макеты для создания последовательности глифов с их окончательными позициями.
  • Создавать файлы функций, записывать правила и сохранять их в файлах. В качестве примера можно привести AFDKO (Adobe Font Development Kit for OpenType) или FEA (feature.fea).
  • Поддерживать кроссплатформенность: контуры TrueType и правила PostScript.

Шрифты формата OpenType используют расширение файла .otf (OpenType font).

Назначение шрифта

Программисты используют возможности шрифта OpenType для отражения нюансов контекста или языка программирования. С помощью правил в файле функций возможно модифицировать существующий шрифт.

Вариативность шрифта

Шрифт в формате OpenType вариативный. Он позволяет динамически делать глифы толще или тоньше, сжатыми или растянутыми, вносить осевые изменения.

В отличие от шрифтов в формате TrueType или PostScript пользователь шрифта OpenType может выбрать не только фиксированные начертания, но и выбрать промежуточное между ними.

Коллекция шрифтов

В OpenType каждый шрифт семейства расположен в отдельном файле.

Коллекция шрифтов позволяет пользователю создать удобную структуру семейства шрифтов.

Расширение Файл, содержащий коллекцию шрифтов, имеет расширение .ttc.

Структура шрифта OpenType

С точки зрения приложения Веба, шрифт OpenType — это база данных, содержащая связанный набор таблиц. В таблицах представлены метаданные обо всех шрифтах.

Упрощённая схема структуры шрифта могла бы выглядеть так:

  • метаданные;
  • контуры;
  • метрики;
  • типографика (лигатуры, кернинг).

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

Для того чтобы открыть файл OTF и просмотреть таблицы можно использовать программу fonttools, которая обычно присутствует в дистрибутивах, имеющих библиотеки языка Python.

Обязательные таблицы

Внутри файла OTF сведения о шрифте расположены в формате SFNT (сплайновый шрифт). Для преобразования из двоичного представления в формат XML можно применить команду:

fonttools ttx -l fontName.otf

Несомненно, формат XML человеку тоже нелегко читать. Но всё-таки гораздо легче, чем исходный двоичный формат шрифта.

Для примера рассмотрим файл шрифта Nimbus:

fonttools ttx -l NimbusMonoPS-Regular.otf 
Listing table info for "NimbusMonoPS-Regular.otf":
    tag     checksum    length    offset
    ----  ----------  --------  --------
    CFF   0x4F581E65     69375       188
    GSUB  0x0302B2DF      2880     69564
    OS/2  0x722FC0F8        96     72444
    PCLT  0x571CBF2E        54     72540
    cmap  0x19F705D8      2860     72596
    head  0x0BF35358        54     75456
    hhea  0x057E002C        36     75512
    hmtx  0x6E546E0A      1712     75548
    maxp  0x03575000         6     77260
    name  0x48C9649D       636     77268
    post  0xFFC10034        32     77904

Все таблицы, кроме первых двух CFF и GSUB, обязательные для каждого шрифта OpenType. Давайте не будем рассматривать таблицу OS/2 для устаревших платформ прошлого века OS/2 и MS Windows. Рассмотрим полезные таблицы.

Назначение обязательных таблиц:

  • cmap — сопоставление символов и глифов;
  • head — метаданные шрифта;
  • hhea — данные для горизонтального набора;
  • hmtx — горизонтальные метрики для каждого глифа шрифта;
  • maxp — сведения процессору шрифтов о загрузки шрифта;
  • name — текстовые описания шрифта;
  • post — описание шрифта PostScript.

Таблица GlyphOrder

Создадим TTX файл с XML описанием:

fonttools ttx -l NimbusMonoPS-Regular.otf 

Заглянем внутрь TTX файла:

<?xml version="1.0" encoding="UTF-8"?>
<ttFont sfntVersion="OTTO" ttLibVersion="4.57">
 <GlyphOrder>
   <GlyphID id="0" name=".notdef"/>
   <GlyphID id="1" name="space"/>
   <GlyphID id="2" name="exclam"/>
   <GlyphID id="3" name="quotedbl"/>
   <GlyphID id="4" name="numbersign"/>
   <GlyphID id="5" name="dollar"/>
   <GlyphID id="6" name="percent"/>
   <GlyphID id="7" name="ampersand"/>

В TTX файл добавлена таблица . Подобной таблицы нет в файле ODF. Её добавляет XML. В этой, самой полезной для программиста, таблице представлено соответствие между идентификаторами глифов шрифта и понятными человеку названиями: «space», «numbersign», «dollar» …

Таблица head

Таблица head содержит метаданные и общие сведения о шрифте.

Наиболее интересны для проектировщиков и программистов вебсайтов значения от unitsPerEm до macStyle.

Тег unitsPerEm определяет масштабирование шрифта до значения em. Наиболее распространённые значения:

  • для шрифтов CFF: upem=1000;
  • для шрифтов TrueType внутри OpenType: upem=1024;
  • для шрифтов Open Sans: upem=2048.

Теги created и modified это двоичное представление секунд с 1 января 1904 года. Версии Mac использовали это значение в качестве своей эпохи и точки отсчёта. К счастью, TTX преобразовывает выпендрёж от Apple в более удобный для чтения формат времени.

Теги xMin и yMax представляют самую высокую и самую низкую координаты шрифта.

Таблица hhea

Таблица hhea хранит глобальные значения по умолчанию. Эти значения используют при отображении шрифта в горизонтальном наборе. Данная таблица самый неудачный из компромиссов стандарта OpenType, объединившего файлы шрифтов MS Windows и Mac. В те времена, когда шрифты использовали лишь операционные системы MS Windows и Mac, конфликтов не возникало. Шрифты одно ОС не попадали в другую ОС. Но в современном мире ситуация катастрофическая. Шрифты использует огромное количество устройств, текстовых процессоров, браузеров и другого ПО.

Каждое приложение анализирует метрики шрифтов и интерпретирует по-своему.

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

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

Значения тегов usWinAscent и usWinDescent обрезают в MS Windows контуры выше 1000 или ниже 200 единиц.

Apple Mac для обрезки использует значение тега lineGap.

Значение тега typo приложения вёрстки используют для позиционирования базовой линии и определения междустрочного интервала по умолчанию.

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

Прагматичен следующий подход:

  • Разность значений sTypoAscender и sTypoDescender не должна превышать размерность глифа, т.е. 1000 единиц.
  • Для кириллицы значение межстрочного интервала по умолчанию следует присвоить переменной sTypoLinegap.
  • Переменной lineGap присвойте значение “0”.
  • Следует следить, чтобы браузеры не обрезали шрифт. В кириллическом шрифте следует проверить все высокие глифы, особенно комбинированные «Й», «Ё». Если браузер обрезает глиф, следует уменьшить значения usWinAscent и usWinDescent. Проверьте значение по формуле: sTypoAscender - sTypoDescender + sTypoLinegap
  • Значения ascent и descent следует задать такими же, как у переменных usWinAscent и usWinDescent. Учтите, что usWinAscent имеет положительное значение, а descent — отрицательное.
  • У функции fsSelection следует включить 7 бит.

Таблица name

Таблица name хранит текстовые данные: названия шрифта, сведения о версии, авторских правах, авторе.

Самое привлекательное свойство OpenType — это возможность локализации записей на нескольких языках.

В таблице присутствуют идентификаторы платформы:

  • ID 0 — платформа Юникода;
  • ID 1 — платформа Apple Mac;
  • ID 2 — платформа ISO 10646;
  • ID 3 — платформа MS Windows.

Внимание!

Да-да, никакой ошибки! Платформа Юникода и платформа ISO 10646 определены в таблице как разные платформы. Они технически идентичны, а политически различные.

Для идентификации платформ устоялась некоторая практика:

  • Записи имён для платформы ID 1 Apple Mac вводят на латинице. И хотя есть возможность создавать записи на других языках, этого никто не делает.
  • Платформы ID 0 Юникода и ID 2 ISO 10646 никто не использует.
  • Для платформы ID 3 MS Windows записи на отличных от латиницы языках кодируют в UTF-16BE.

Таблица cmap

Таблица cmap сопоставляет идентификаторы глифов с кодовыми точками Юникода.

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

В файле шрифта OpenType таблица cmap содержит только идентификаторы глифов. И большая польза утилиты fonttool ttx в том, что она:

  • сопоставляет символы с идентификаторами глифов;
  • заменяет идентификаторы глифов наименованиями, удобными для человека.