Добавление своих символов в шрифт - vvip-68/LedPanelWiFi GitHub Wiki

Недостающие символы

В мире есть множество языков, имеющих в своем алфавите буквы, отличающиеся от стандартного набора символов кириллицы или латиницы. Как правило в эти буквы добавлены черточки, хвостики и другие диакритические знаки. Текущая версия прошивки кроме букв с диакритичекими знаками кириллицы - Ё ё поддерживает символы литовского алфавита - Ą ą Ę ę ų, Į į Ų, чешского - Č Ž č ž, немецкого ß, украинского Є є, ї, испанского Á É Í Ó Ú Ñ á é í ó ú ñ и некоторых других алфавитов.

Если нужного вам символа не реализовано - придется рисовать самим.

Рисуем свой шрифт

Для начала - ознакомьтесь со статьей, описывающей принципы построения шрифтов в скетче.

Для облегчения создания своего шрифта с требуемым размером символов в папке проекта tools/FontMaker находится утилита редактирования символов шрифта. Запустите файл FontMaker.exe

FontMaker

Порядок использования утилиты следующий:

  1. В поле, помеченном цифрой 1 введите требуемые размеры символа, например - 10x16. Программа создаст сетку редактирования указанного размера.
  2. Для очистки поля используйте кнопку "Очистить", отмеченную маркером 2
  3. Нажатие мышкой на клетках поля редактирования 3 переключает их в белый/черный цвет. Сформируйте образ символа.
    В процессе формирования изображения в области ниже поля клеток формируется шестнадцатеричное представление чисел массива, соответствующее сформированному образу (область 4)
  4. В поле 5 автоматически создается элемент массива, соответствующий редактируемому символу.
    Скопируйте текст из этого поля и вставьте в соответствующий элемент массива fontHEX в файле font.h
  5. Для редактирования существующего элемента массива fontHEX из файла font.h - скопируйте его в буфер обмена (Clrl-C) и вставьте (Ctrl-V) в поле 5 в редакторе шрифта. Образ символа, задаваемый текстом элемента массива будет воссоздан в области редактирования.

Скетч поддерживает три размера шрифтов - 5x8, 8x13 и 10x16. Массивы точек, составляющих изображение буквы размещены в файле fonts.h. Если нужной нам буквы нет в наборе букв алфавита, который уже поддерживается - рисуем свою букву, добавляем ее к массивам изображения букв всех трех размеров.

LETTER 5x8 LETTER 8х13 LETTER 10х16

Сгенерированный для каждой буквы массив вставляем в соответствующие места в файл fonts.h

LETTER CODE

(пример для шрифта 5x8, для других размеров - аналогично).

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

LETTER 5x8 LETTER 8х13 LETTER 10х16

Нарисованные знаки тильды добавляем в массивы (пример для шрифта 5x8, для других размеров - аналогично).

LETTER CODE

Итак, символы для шрифта нарисованы, меняем код скетча.

Кодируем символы

Функции отрисовки символа на матрице находятся в файле скетча runningText.ino.

Основная функция вывода изображения символа на экран - drawLetter(), которая вызывает ряд вспомогательных функций -

  • getFont() - получение массива точек отображения буквы
  • getDiasByte() - получение массива точек отображения диакритического символа над/под буквой
  • getDiasOffset() - получение смещения позиции отрисовки диакритического символа относительно "стандартного" расположения

Основная функция, как правило, не требует каких-либо изменений, а вот во вспомогательные придется добавить обработку новых символов.

Находим код символа

Шаг 1

Чтобы найти код символа без применения каких-либо сторонних утилит, просто добавляем в код функции getFont() следующую строку:

  DEBUGLN("modif=" + String(modif) + "; font=" + String(font));

Компилируем прошивку, загружаем ее в микроконтроллер и запускаем на исполнение.

Шаг 2

В настройках бегущей строки в Web-интерфейсе в поле вводе текста бегущей строки помещаем один исследуемый символ и нажимаем нак конпку "Просмотр".

LETTER CODE

В мониторе порта наблюдаем вывод диагностики для этой буквы.

LETTER CODE

Записываем полученные значения.

LETTER CODE

Шаг 3

Возвращаемся к скетчу. Убираем добавленный выше диагностический вывод из кода - он нам больше не нужен.

Находим функцию getFont() и для найденной группы символов с modif == 195 добавляем обработку кодов букв, которые мы записали на предыдущем шаге:

LETTER CODE

Этот код возвращает точечное изображение добавленных букв, по начертанию они соответствуют уже имеющимся в массиве fontHex[] изображениям букв латинского алфавита.

Шаг 4

Находим функцию getDiasByte() и для найденной группы символов с modif == 195 добавляем обработку кодов диакритических символов, которые мы записали на предыдущем шаге:

LETTER CODE

Этот код возвращает точечное изображение добавленных диакритических символов в массиве diasHex[] изображениям букв латинского алфавита.

Шаг 5

Находим функцию getDiasOffset() и для найденной группы символов с modif == 195 добавляем обработку кодов диакритических символов, которые мы записали на предыдущем шаге. На первом этапе указыванием смещение от основной позиции - 0.

LETTER CODE

Этот код возвращает смещение позиции вывода диакритического знака над / под буквой от основной позиции.
Компилируем код, загружаем его в микроконтроллер, запускаем на выполнение.

Шаг 6

В Web-интерфейсе возвращаемся к настройкам бегущей строки. Вводим по одной буквы из добавленных, смотрим как они отображаются на матрице.

LETTER CODE

По результатам просмотра в функции getDiasOffset() меняем смещение позиции отрисовки диакритических знаков, как нам бы хотелось, чтобы отображалась буква. Значение '1' поднимает диакритический символ над буквой на 1 строчку, значение -1 - опускает диакритический символ ниже к букве.

LETTER CODE

В Web-приложении в настройках бегущей строки вводим все добавленные символы, нажимаем кнопку "Просмотр" и убеждаемся, что все буквы отображаются корректно и читабельно.

LETTER CODE

Шаг 7

Повторяем шаги 3-6 для всех размеров шрифта, изменяя настройку компиляции проекта BIG_FONT в файле a_def_hard.h.
Проверяем отображение символов в строке. На этом процесс добавления своих символов закончен.