Современный файл шрифтов OpenType фактически является полностью автономной программой для набора текста, и шейперу текста удается «выполнять все как указано шрифтом» (даже если для этого требуется целая куча сложностей со стороны шейпера), и так что есть предварительно запеченный список правил GSUB, которые связаны с формирователями, к которым обращаются за пределами того, что указывает шрифт.
Думайте о шрифте как об игре: пока вам нужен хороший эмулятор (текстовый формирователь), чтобы правильно Запустите игру (шрифт), и задача эмулятора - убедиться, что все сложные биты, такие как блиттинг, перестановка памяти и т. д. c. выполняется в нужное время, игра определяет, что произойдет. Аналогично, хороший формирователь текста будет иметь все (сложные) логики c для того, как интерпретировать данные OpenType и как обрабатывать их, в каком порядке, за сколько проходов и т. Д. c. но эти данные только из шрифта и больше нигде.
Конечно, это не означает, что такого рода списки не существуют: они просто не существуют в формирователях . Они абсолютно существуют в инструментах создания шрифтов, потому что работа по созданию шрифтов была бы невероятно утомительной без них, но у каждого инструмента есть свои списки и предустановки, и когда они генерируют шрифт, все эти правила кодируются в самом файле шрифта: шрифт становится источником правды, когда дело доходит до набора текста.
Если у вас есть файл шрифта, у вас есть вся информация, необходимая для формирования текста, при условии, что ваш формирователь кода анализирует шрифт в соответствии со спецификацией OpenType, и частично из этого соответствия является то, что шейперу разрешено применять только то, что в шрифте.
(Конечно, есть некоторая конфигурируемость в том, что функции OpenType явно разработаны таким образом, что шейперу разрешено пропустить применение любого или всех из них, но нельзя добавлять своих собственных)