Конвертор шрифтов для embedded
https://github.com/lvgl/lv_font_conv
Если кто застал, на первых пиратских CD с играми писали “озвучено профессиональными программистами”. Выглядело совершенно психоделично. Потом правда поменяли на “озвучено профессиональными актерами”. Но мне почему-то кажется, что программисты, которых заменили актерами, с тех пор переключились на дизайн в embedded и занимаются этим до сих пор. Иначе трудно объяснить, почему когда смотришь на многие “железки”, глаза готовы лопнуть от напряжения.
Про дизайн можно говорить долго, но остановимся на самом очевидном - шрифтах. Ну допустим, рендеринг TTF-шрифтов на лету действительно тяжеловат для чахлого микроконтроллера. И ограничения по памяти довольно серьезные. Но это же не повод забивать болт на кернинг, антиалиасинг, субпиксельное сглаживание, и втыкать везде “шрифт которые принес кореш на флешке” с непонятной лицензией. Так что пришлось мне в рамках программы по улучшения мира заняться еще и шрифтами для эмбедов.
Общий принцип понятен:
- нужны битмапные шрифты
- с поддержкой grayscale (на канал прозрачности, для антиалиасинга)
- c легковесной компрессией (актуально для больших букв)
- с опциональным 3х разрешением по горизонтали (для субпиксельного сглаживания)
Как выяснилось, стандарты битмапных шрифтов тормознулись на BDF. Пришлось слегка поизобретать лисапед. Поскольку в свое время делал fontello, то шрифтовые потроха представляю неплохо. В принципе, TTF умеет хранить внутри битмапы, но там довольно много legacy шлака, и компрессия либо убогая, либо слишком сложная. Поэтому утянул из TTF сколько сумел, дополнив недостающим по минимуму. Вышло IMO неплохо:
На дисплее шрифт Roboto, размер 12px и 14px.
Естественно, поддерживаются далеко не все фичи, которые навертели в OpenType. Тот же кернинг - на уровне таблицы “kern”, без мозголомных вариантов “GPOS”. Но думаю что под незамысловатые потребности эмбедов лет на десять хватит. Ну а потом… может все микроконтроллеры уже пойдут с гигабайтом памяти на борту, и все эти ухищрения станут не актуальны.
Почему это здорово
- Ну во-первых, это красиво :)
- Можно взять любой векторный шрифт, и выдрать из него подмножество для нужных языков
- Можно объединять разные шрифты (например, добавляя к буквам иконки)
- Можно упорядочить свои проекты, используя современные шрифты, с понятными источниками и лицензиями.
Для OLED можно найти pixel-perfect TTF шрифты под разные зазмеры. Ну а если экран цветной - за счет субпиксельного сглаживания можно использовать вообще все что угодно, с прекрасным результатом.
Конкретно сейчас, разработанная спецификация и конвертор используется в GUI LittlevGL. Но формат шрифтов универсальный, и не привязан к какой-либо библиотеке или языку. Сам конвертор тоже универсальный, написан на node.js.
Всем добра!