LCD Image Converter — шрифты и изображения для встраиваемых приложений

<img alt="LCD Image Converter Logo" src="//st.overclockers.ru/legacy/v2/fee94f041c418f9d4521eb64a1968105/hkpv0aujmouxrg5n.png"><br> <h4>Исходные требования к программе</h4> <p><ul><li><b>Формирование данных в формате исходников на языке «C»</b><br> <p>В процессе разработки ПО для микроконтроллеров использовал языки C/C++.<br> Отсюда, логично предположить, ресурсы проще всего хранить в простом и понятом для программы формате — структурах и массивах. Формирование исходников на «C» позволяет иметь данные в более-менее читаемом виде и, в то же время, встраивать их в программу с помощью того же компилятора.</p> </li><li><b>Поддержка юникода</b><br> <p>Иногда требуется выводить в тексте спецсимволы, не входящие в обычную таблицу Windows-1251 с кодами от 32 до 255. Программирую микроконтроллеры я в Linux&#39;е, в кодировке UTF-8, потому пришла идея реализовать поддержку Юникода. Это даёт возможность иметь в исходниках текст, полностью соответствующий тексту на дисплее. Без всяких условностей типа <i>&#39;\0xff&#39; будем считать за букву &#39;я&#39;</i> и <i>вместо &#39;@&#39; нарисуем греческую гамма &#39;γ&#39;</i></p> </li><li><b>Кроссплатформенность</b><br> <p>Как следствие той же разработки ПО для МК под Ubuntu Linux, очевидно было, что программа должна работать в этой ОС (в отличие от предыдущих версий на .Net и BCB). Имеющийся кроссплаторменный графический редактор GIMP, иногда используемый для этих целей, имеет очень ограниченные возможности в плане настроек для ... —&#62; </p> </li><li><b>Поддержка разных типов контроллеров</b><br> <p>Важно отсутствие привязки к какому-либо конкретному контроллеру, его организации памяти и ширины шины данных. Переписывать программу под каждый новый контроллер излишне. Имеющиеся же в интернете простые утилиты этого назначения в основном заточены именно под конкретные модели.<br> </p> </li><li><b>Основа — построение изображений</b><br> <p>Шрифты состоят из изображений символов в виде массивов бит, и соответствия кодов символов этим массивам. Поэтому главной задачей стало получение корректного представления изображения в виде массива бит.<br> <br> Поддержка цветных, монохромных и градаций серого, одинаково применимая и к изображениям, и к шрифтам.<br> </p> </li></ul> </p> <br>
24 декабря 2012, понедельник 17:43
Rius для раздела Блоги

Исходные требования к программе

  • Формирование данных в формате исходников на языке «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)
где текст между $( и ) заменяется на соответствующие переменные, определённые при создании изображения/шрифта, либо уже при преобразовании его в «С» формат.


Примеры получаемого результата


На монохромном дисплее:

Шрифты:


Приложение можно найти на домашней странице: LCD Image Converter
Тема на этом форуме