В процессе разработки ПО для микроконтроллеров использовал языки C/C++.
Отсюда, логично предположить, ресурсы проще всего хранить в простом и понятом для программы формате — структурах и массивах. Формирование исходников на «C» позволяет иметь данные в более-менее читаемом виде и, в то же время, встраивать их в программу с помощью того же компилятора.
Иногда требуется выводить в тексте спецсимволы, не входящие в обычную таблицу Windows-1251 с кодами от 32 до 255. Программирую микроконтроллеры я в Linux'е, в кодировке UTF-8, потому пришла идея реализовать поддержку Юникода. Это даёт возможность иметь в исходниках текст, полностью соответствующий тексту на дисплее. Без всяких условностей типа '\0xff' будем считать за букву 'я' и вместо '@' нарисуем греческую гамма 'γ'
Как следствие той же разработки ПО для МК под Ubuntu Linux, очевидно было, что программа должна работать в этой ОС (в отличие от предыдущих версий на .Net и BCB). Имеющийся кроссплаторменный графический редактор GIMP, иногда используемый для этих целей, имеет очень ограниченные возможности в плане настроек для ... —>
Важно отсутствие привязки к какому-либо конкретному контроллеру, его организации памяти и ширины шины данных. Переписывать программу под каждый новый контроллер излишне. Имеющиеся же в интернете простые утилиты этого назначения в основном заточены именно под конкретные модели.
Шрифты состоят из изображений символов в виде массивов бит, и соответствия кодов символов этим массивам. Поэтому главной задачей стало получение корректного представления изображения в виде массива бит.
Поддержка цветных, монохромных и градаций серого, одинаково применимая и к изображениям, и к шрифтам.
Для реализации был выбран фреймворк Qt (версии 4.7 на момент основания), из особенностей которого пригодились кроссплатформенность, скорость работы программы, поддержка XML и различных графических форматов, юникод «из коробки», интернационализация. В качестве основы для преобразования были выбраны и реализованы файлы шаблонов, парсер для них.
Алгоритм преобразования изображений в массив битов поддерживает следующие возможности:
Данный алгоритм применяется к каждому и отдельному изображению, и символу шрифта (также представленному в виде изображения). Благодаря этому настройка преобразования в формат «С» одинакова и для изображений, и для шрифтов.
Преобразование данных в формат «С» выполняется в процессе обработки шаблонов.
Шаблоны это простые текстовые файлы примерно такого вида (в данном случае для изображения):
$(start_block_header)
/*******************************************************************************
* $(dataType)
* filename: $(fileName)
* name: $(documentName)
*
* preset name: $(preset)
* data block size: $(dataBlockSize) bit(s), uint$(dataBlockSize)_t
* RLE compression enabled: $(rle)
* conversion type: $(convType), $(monoType) $(edge)
* bits per pixel: $(bpp)
*
* preprocess:
* main scan direction: $(scanMain)
* line scan direction: $(scanSub)
* inverse: $(inverse)
*******************************************************************************/
/*
typedef struct {
const uint$(dataBlockSize)_t *data;
uint16_t width;
uint16_t height;
} tImage;
*/
#include
$(end_block_header)
$(start_block_images_table)
static const uint$(dataBlockSize)_t image_data_$(documentName_ws)[$(blocksCount)] = {
$(imageData)
};
const tImage $(documentName_ws) = { image_data_$(documentName_ws), $(width), $(height)};
$(end_block_images_table)
где текст между $( и ) заменяется на соответствующие переменные, определённые при создании изображения/шрифта, либо уже при преобразовании его в «С» формат.