Конвертор шрифтов для embedded

https://github.com/lvgl/lv_font_conv


Если кто застал, на первых пиратских CD с играми писали “озвучено профессиональными программистами”. Выглядело совершенно психоделично. Потом правда поменяли на “озвучено профессиональными актерами”. Но мне почему-то кажется, что программисты, которых заменили актерами, с тех пор переключились на дизайн в embedded и занимаются этим до сих пор. Иначе трудно объяснить, почему когда смотришь на многие “железки”, глаза готовы лопнуть от напряжения.


Про дизайн можно говорить долго, но остановимся на самом очевидном - шрифтах. Ну допустим, рендеринг TTF-шрифтов на лету действительно тяжеловат для чахлого микроконтроллера. И ограничения по памяти довольно серьезные. Но это же не повод забивать болт на кернинг, антиалиасинг, субпиксельное сглаживание, и втыкать везде “шрифт которые принес кореш на флешке” с непонятной лицензией. Так что пришлось мне в рамках программы по улучшения мира заняться еще и шрифтами для эмбедов.


Общий принцип понятен:


- нужны битмапные шрифты

- с поддержкой grayscale (на канал прозрачности, для антиалиасинга)

- c легковесной компрессией (актуально для больших букв)

- с опциональным 3х разрешением по горизонтали (для субпиксельного сглаживания)


Как выяснилось, стандарты битмапных шрифтов тормознулись на BDF. Пришлось слегка поизобретать лисапед. Поскольку в свое время делал fontello, то шрифтовые потроха представляю неплохо. В принципе, TTF умеет хранить внутри битмапы, но там довольно много legacy шлака, и компрессия либо убогая, либо слишком сложная. Поэтому утянул из TTF сколько сумел, дополнив недостающим по минимуму. Вышло IMO неплохо:

Конвертор шрифтов для embedded Микроконтроллеры, Электроника, Программирование, Длиннопост

На дисплее шрифт Roboto, размер 12px и 14px.


Естественно, поддерживаются далеко не все фичи, которые навертели в OpenType. Тот же кернинг - на уровне таблицы “kern”, без мозголомных вариантов “GPOS”. Но думаю что под незамысловатые потребности эмбедов лет на десять хватит. Ну а потом… может все микроконтроллеры уже пойдут с гигабайтом памяти на борту, и все эти ухищрения станут не актуальны.


Почему это здорово


- Ну во-первых, это красиво :)

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

- Можно объединять разные шрифты (например, добавляя к буквам иконки)

- Можно упорядочить свои проекты, используя современные шрифты, с понятными источниками и лицензиями.


Для OLED можно найти pixel-perfect TTF шрифты под разные зазмеры. Ну а если экран цветной - за счет субпиксельного сглаживания можно использовать вообще все что угодно, с прекрасным результатом.


Конкретно сейчас, разработанная спецификация и конвертор используется в GUI LittlevGL. Но формат шрифтов универсальный, и не привязан к какой-либо библиотеке или языку. Сам конвертор тоже универсальный, написан на node.js.


Всем добра!