PixelPixie — генератор шрифтів для LCD та OSD


Привіт, %username%. У цій статті я хотів би розповісти про свій невеликий проект, покликаний за допомогою одного велосипеда і невеликий зв'язки милиць злегка спростити життя embedded-розробнику, який має справу з графічними дисплеями або платами OSD.
Інтро
Одного разу мені довелося побачити, як силами колеги створюються шрифти для плати OSD, яка повинна була бути потім встановлена в монітор. Побачене ввело мене в легкий ступор і змусило зашевилиться волосся на голові (картинка кликабельна).

Спочатку кожен символ прорисовывался на аркуші в клітинку. Потім зображення кожного символу в зошиті вручну переводилося в масив байт і містилося в вихідні коди прошивки. На створення кожного символу йшло близько години кропіткої роботи. Усвідомлення того, що за вікном вже закінчується 2016 рік, і зошит в клітку не є оптимальним засобом для досягнення мети, підштовхнуло мене… ні, не на написання свого рішення, а на пошук вже готового. Однак, швидкий пошук показав, що більшість наявних рішень містять хоча б один з таких недоліків:
  • небесплатны (іноді ціна наближалася до 100 євро);
  • заточені під певний формат (кількість біт на піксель, розмір символу і кодування кольорів);
  • підтримують тільки символи з стандартного набору шрифтів (найчастіше на OSD доводиться виводити зовсім відмінні від букв, цифр і стрілок символи).
На шляху до велофабрике
Бажання зробити світ трохи краще і пара вільних вечорів вилилися в невелику утиліту командного рядка — PixelPixie. Програма отримує На вхід файл із зображенням, на якому через рівні проміжки (для цього найпростіше використовувати сітку) зображені символи майбутнього шрифту. Налаштування генератора шрифту зберігаються в JSON файлі. Всі кольори, використані при малюванні символів, необхідно поставити у відповідність із послідовністю біт. Послідовність задається в десятковому вигляді.
"ColorMapping": {
"#FFFFFF": 0,
"#000000": 1,
"#C8C8C8": 2,
"#808080": 3
}

Генератор, обробляючи зображення, побитово складе вихідний масив. Однією з важливих особливостей PixelPixie є те, що вона може працювати з будь-якою кількістю біт на піксель. Наприклад, часто потрібно кодувати кожен піксель 2 або 3 бітами. Самі символи можуть бути довільного розміру і перебувати в сітці з довільною кількістю стовпців і рядків. Таким чином, я спробував зробити генератор максимально незалежним від конкретного пристрою, для якого генерується шрифт.
Додатково PixelPixie вміє створювати зображення з порожньою сіткою. Розробнику залишається в улюбленому растровому редакторі "вписати" символи в комірки сітки і двічі клацнути по batch-скрипту, який запускає PixelPixie. Тепер процес роботи над шрифтом виглядає приблизно так:

На виході ми отримуємо масиви, готові для копипасты у вихідний файл прошивки керуючого мікроконтролера.
//symbol 1
unsigned char c1[54] = 
{0x44, 0xC5, 0x7F, 0xFF, 0xDF, 0x7F, 0x73, 0xFD, 0x73, 0xD3, 
0xF7, 0x73, 0x70, 0xF7, 0x73, 0xFC, 0xD7, 0x73, 0xFC, 0xD7, 
0x73, 0xFC, 0xD7, 0x73, 0xDC, 0xD4, 0x33, 0xDC, 0xD4, 0x3F, 
0xD4, 0x30, 0x3F, 0xF7, 0x03, 0x37, 0xF4, 0x00, 0x07, 0xF7, 
0x00, 0x37, 0xF7, 0xF7, 0xD7, 0xF5, 0x55, 0x5F, 0xFF, 0xFF, 
0xFF, 0xFF, 0xFF, 0xFF};

//symbol 2
unsigned char c2[54] = 
{0xFD, 0x57, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
0x0F, 0xFF, 0xFD, 0xCF, 0xFF, 0xFD, 0x0F, 0xFF, 0xF5, 0x3F, 
0xFF, 0xF7, 0x04, 0xFF, 0xF7, 0xD4, 0xFF, 0xF5, 0x54, 0xFF, 
0xFF, 0xD3, 0xFF, 0xFF, 0x53, 0xFF, 0xFF, 0x70, 0x0F, 0xFF, 
0xFF, 0x0F, 0xFF, 0xC0, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
0xFF, 0xFF, 0xFF, 0xFF};

І спостерігаємо наш шрифт на екрані ЖК-дисплея, підключеного до плати OSD.

Замість висновку
Використання PixelPixie для розробки шрифтів плати OSD дозволило скоротити час роботи над кожним символом з години до 10 хвилин в найскладніших символах. Звичайно, розробнику все ще доводиться попіксельно вимальовувати кожну букву і по кілька разів перевіряти, як вона відображається на кінцевому пристрої, але кількість рутини вдалося скоротити в кілька разів.
Вихідний код PixelPixie доступний на GitHub.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.