LCD Image Converter — шрифты и изображения для встраиваемых приложений
реклама
Исходные требования к программе
- Формирование данных в формате исходников на языке «C»
В процессе разработки ПО для микроконтроллеров использовал языки C/C++.
Отсюда, логично предположить, ресурсы проще всего хранить в простом и понятом для программы формате — структурах и массивах. Формирование исходников на «C» позволяет иметь данные в более-менее читаемом виде и, в то же время, встраивать их в программу с помощью того же компилятора. - Поддержка юникода
Иногда требуется выводить в тексте спецсимволы, не входящие в обычную таблицу Windows-1251 с кодами от 32 до 255. Программирую микроконтроллеры я в Linux'е, в кодировке UTF-8, потому пришла идея реализовать поддержку Юникода. Это даёт возможность иметь в исходниках текст, полностью соответствующий тексту на дисплее. Без всяких условностей типа '\0xff' будем считать за букву 'я' и вместо '@' нарисуем греческую гамма 'γ'
- Кроссплатформенность
Как следствие той же разработки ПО для МК под Ubuntu Linux, очевидно было, что программа должна работать в этой ОС (в отличие от предыдущих версий на .Net и BCB). Имеющийся кроссплаторменный графический редактор GIMP, иногда используемый для этих целей, имеет очень ограниченные возможности в плане настроек для ... —>
- Поддержка разных типов контроллеров
Важно отсутствие привязки к какому-либо конкретному контроллеру, его организации памяти и ширины шины данных. Переписывать программу под каждый новый контроллер излишне. Имеющиеся же в интернете простые утилиты этого назначения в основном заточены именно под конкретные модели.
- Основа — построение изображений
Шрифты состоят из изображений символов в виде массивов бит, и соответствия кодов символов этим массивам. Поэтому главной задачей стало получение корректного представления изображения в виде массива бит.
Поддержка цветных, монохромных и градаций серого, одинаково применимая и к изображениям, и к шрифтам.
реклама
Вкратце
- Создание изображений и шрифтов в формате «С»;
- Поддержка Юникода;
- Кроссплатформенность;
- Изображения монохромные, цветные и в градациях серого;
- Горизонтальная и вертикальная ориентация байт памяти;
- Размер элементов данных массивов в 8, 16, 24 или 32 бита;
- 1...24 бита на точку, от монохромных до 24-битных RGB;
- Возможность изменения формата выходного файла без изменения самой программы;
- Различный порядок бит данных, например RGB, BGR, RBG и т.д.;
Что получилось на данный момент
Для реализации был выбран фреймворк Qt (версии 4.7 на момент основания), из особенностей которого пригодились кроссплатформенность, скорость работы программы, поддержка XML и различных графических форматов, юникод «из коробки», интернационализация. В качестве основы для преобразования были выбраны и реализованы файлы шаблонов, парсер для них.
Алгоритм преобразования изображений в массив битов поддерживает следующие возможности:
- выбираемое направление сканирования точек изображений
- перевод точек изображений в монохромное/градации серого/RGB
- сдвиг бит данных с целью получения любого порядка цветовых бит и изменения их количества, например для R5G6B5, R8G8B8 или просто BW1
- упаковка бит в 8, 16, 24 или 32-разрядные блоки данных для заполнения массивов
Данный алгоритм применяется к каждому и отдельному изображению, и символу шрифта (также представленному в виде изображения). Благодаря этому настройка преобразования в формат «С» одинакова и для изображений, и для шрифтов.
Преобразование данных в формат «С» выполняется в процессе обработки шаблонов.
Шаблоны это простые текстовые файлы примерно такого вида (в данном случае для изображения):
реклама
$(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)где текст между $( и ) заменяется на соответствующие переменные, определённые при создании изображения/шрифта, либо уже при преобразовании его в «С» формат.
Примеры получаемого результата
На монохромном дисплее:
Шрифты:
- несколько символов шрифта Ubuntu в формате xml
- то же в формате «С»
- текст на монохромном дисплее:
Приложение можно найти на домашней странице: LCD Image Converter
Тема на этом форуме
реклама
Лента материалов
Соблюдение Правил конференции строго обязательно!
Флуд, флейм и оффтоп преследуются по всей строгости закона!
Комментарии, содержащие оскорбления, нецензурные выражения (в т.ч. замаскированный мат), экстремистские высказывания, рекламу и спам, удаляются независимо от содержимого, а к их авторам могут применяться меры вплоть до запрета написания комментариев и, в случае написания комментария через социальные сети, жалобы в администрацию данной сети.
Сейчас обсуждают