20.05.2014 18:26, автор SergSXM
В своей практике программирования для микроконтроллеров, я часто сталкивался с созданием шрифтов, а также различных монохромных иконок. Для облегчения этой задачи мною были созданы две программы, о которых пойдёт речь в этой статье.
Программы, описанные в статье можно скачать по этой ссылке.
Первая программа BitEditor служит для создания набора монохромных изображений фиксированного размера. Максимальное число изображений - 256. Максимальный размер изображений - 64*64 пикселя. На рисунке представлено главное окно программы.

Интерфейс программы интуитивно понятен. При нажатии на кнопку "Свойства" можно задать ширину и высоту изображений в пискелях.
Важнейшей функцией данной программы является возможность экспортировать изображения в программный код различных форматов. На рисунке представлены настройки экспорта.

В данном окне можно настроить необходимые параметры экспорта. Первая группа параметров отвечает за выбор типа выходного файла (возможен вывод как в двоичные файлы, так и в формат языков программирования Pascal, C/C++), и прочие настройки вывода. Вторая группа параметров отвечает за формирование байтов из битового рисунка. Третья группа параметров позволяет задать финальную обрабоку (внести инверсию, а также добавить байты-маркеры).
Вторая программа CFSEditor служит для создания шрифтов. Максимальный размер символа шрифта - 32*32 пикселя, кодировка - Windows-1251, поддерживается переменная ширина символов. На рисунке представлено главное окно программы с уже загруженным шрифтом.

В левой части расположена таблица символов, на которой можно выбрать символ для редактирования. Также в этой таблице показаны миниатюры уже заданных символов. Следует отметить что символ под номером 0 в шрифте не используется. При нажатии на него в правой части программы появляется область, в которой можно проверить шрифт на отображении. Окно программы при выборе символа показано на рисунке.

В этом режиме можно задать ширину символа, а также отредактировать отдельные пиксели символа. Удобной функцией программы является функция "выбрать из рисунка". В этом режиме можно выбрать символ из готового изображения. Окно программы в этом режиме показано на рисунке.

Поддерживаются только BMP рисунки. Благодаря данной функции можно не рисовать шрифт вручную, а использовать готовый (например в программе Paint написать все символы нужным шрифтом).
Как и в предыдущей программе, основная функция этой - экспорт в программный код. Окно экспорта показано на рисунке.

Настройки экспорта здесь беднее, чем в предыдущей программе. Формат выходного массива следующий: первый байт массива равен 0xCF и служит для распознавания шрифта, второй байт задаёт высоту шрифта, следующие 510 байт занимают адреса символов (символ 0 как было указано выше не используется, поэтому адреса указаны для символов от 1 до 255, каждый адрес занимает два байта, первый байт - старший), далее следует информация об изображениях символов.
Следующий код служит для вывода символов на экран:
const unsigned char DefFont[] = {....};
unsigned short PutSymbol (unsigned short PosX, unsigned short PosY, unsigned long Color, unsigned char Symbol)
{
unsigned char sizex, sizey, x, y, msk;
unsigned short addr;
if (Symbol == 0) return PosX;
if (DefFont[0] != 0xCF) return PosX;
sizey = DefFont[1];
addr = ((unsigned short)DefFont[Symbol * 2] << 8) | DefFont[Symbol * 2 + 1];
if (addr == 0) return PosX;
sizex = DefFont[addr];
addr++;
msk = 0;
for (x = 0; x < sizex; x++)
for (y = 0; y < sizey; y++)
{
if ((DefFont[addr] & (1 << msk)) != 0) PutPixel (PosX + x, PosY + y, Color);
msk++;
if (msk > 7) {msk = 0; addr++;}
}
return PosX + sizex;
}
unsigned short PutText (unsigned short PosX, unsigned short PosY, unsigned long Color, unsigned char * Text)
{
while (*Text != 0)
{
PosX = PutSymbol (PosX, PosY, Color, *Text);
Text++;
}
return PosX;
}
Вместо заключения приведу неколько фотографий интерфейса, в которым был применён шрифт, созданный с помощью программы CFSEditor.


Программы, описанные в статье можно скачать по этой ссылке. В архив также включен пример шрифта для программы CFSEditor.