Немного о WASM’е в шрифтах
Когда я вчера в небольшом кругу рассказал о том как работает WASM в шрифтах, оказалось, что никто не понял некоторые базовые вещи, которые мне казались очевидными. Поэтому я хочу их расписать и тут тоже.
Давайте опять немного о том, почему язык программирования в шрифте — это удобно.
Шрифты сейчас устроены довольно сложно. Если не приглядываться, то ничего и не заметишь, но если разглядывать как взаимодействуют буквы между собой, окажется, что даже в отображении привычных нам кириллических и латинских букв есть особенности — в хороших шрифтах расстояния между различными парами букв тщательно выверено и записано внутрь шрифта.
Это делается для красоты, чтобы шрифт казался однородным. Буквы не квадратные, одни шире, другие у́же, «о» круглая, а «ж» похожа на причёску Альберта Эйнштейна. Если писать буквы как есть, то будет выглядеть неаккуратно, поэтому в местах их прилегания расстояния подбирают так, чтобы смотрелось хорошо.
Но вот нам хочется добавить в Юникод египетские иероглифы, а там имя фараона пишется в продолговатом овале — картуше. Как это решить в шрифте? Да никак. Мы можем ввести символы начала картуша и конца, а линии, которыми они должны соединяться, запрограммируем в движке, который рисует нам символы. Причём дизайнер шрифта никак не будет влиять на то, как эти линии рисуются.
Может показаться, что это не так уж и важно, наверное правда в этом есть, но это всего лишь пример. Есть и более актуальные проблемы, например, в арабском письме, но там их объяснить сложнее. По крайней мере, сложнее для меня.
Вместо того чтобы писать каждый раз новую логику в библиотеке, есть другое решение — внедрить этот кусок кода в сам шрифт, тогда с каждым шрифтом будет идти «инструкция» как его рисовать. Это удобно, потому что не нужно ждать, пока библиотека обновится во всех программах, где нам хочется, чтобы картуши рисовались правильно.
Как это работает?
Библиотека, если сильно упрощать, получает на вход от приложения место на экране (координаты) и строку, которую надо написать в этом месте. Строка, перед тем как начнётся отрисовка, засовывается в программу, которая хранится внутри шрифта. Эта программа производит с символами какие-то манипуляции (я, например, заменил каждую букву на эквивалент в азбуке Морзе) и полученная строка отображается на экране.
Внутри программы можно менять символы, сдвигать их на другие позиции и так далее. Самое главное — программе доступен контекст в виде целой строки. Таким образом можно обнаружить (в случае египетских иероглифов), что слово начинается с символа начала картуша и нарисовать линии до признака его конца.
Вот бы кто еще императивный подход вернул в программирование UI снова!
А нужен он там? )