8-бит Графическая библиотека (C++)

Некоторое количество дней назад я написал графическую библиотеку, работающую с 8бит данными. (256цветов) Я работал со своим микроконтроллер, при этом мне нужна была небольшая графическая библиотека для вывода текста, примитивов и быстрого bit-blitting-га. Мне очень помогла книга «Секреты Программирования — Андрэ Ла Мот».
Эта библиотека также позволяет иметь доступ низкого уровня к графическому буферу (чего я очень искал на ПК) и не привязана к какому-либо устройству вывода.

[Ссылка v.1.0]

Работать она должна везде, где есть gcc компилятор и устройство вывода графического буфера на экран. Предполагается для небольших проектов с Arduino, AVR, ARM.

Графические режимы:

  • 16×16 px
  • 128×64 px
  • 256×128 px
  • 256×208 px
  • 272×208 px
  • 320×240 px

Возможности:

  • Вывод текста на экран (код. ASCII-расширенная)
  • Вывод графических примитивов (треугольники, квадраты, линии, точки)
  • Прямой доступ к видео-буферу
  • Работа с bitmap изображениями (вывод, прокрутка, изменение при выводе)
  • Работа с тайловой графикой
  • Несколько визуальных эффектов
  • Высокая скорость (низкоуровневая оптимизация)

Вы также можете использовать свою палитру цветов, однако библиотека не может работать с индексом > 256, если же не использовать палитру цветов, то кодировка цвета будет такой: RRRGGGBB (3бита на красный, 3бита на зеленый, 2бита на синий).

———-

Типы данных, которых может не быть в некоторых средах разработки:

1
2
typedef uint8_t boolean;
typedef uint8_t byte;

Также если вы запускаете библиотеку в среде Arduino IDE, то удалите файл Arduino.h.
Все функции предналежат классу GFX.. (GFX.Init()).
———-

Константы

Режимы

1
2
3
4
5
6
#define VGA_MODE_16x16
#define VGA_MODE_128x64
#define VGA_MODE_256x128
#define VGA_MODE_256x208
#define VGA_MODE_272x208
#define VGA_MODE_320x240

Цвет (из rrrgggbb)

1
2
3
4
5
6
7
8
#define COLOR_WHITE
#define COLOR_RED
#define COLOR_GREEN
#define COLOR_BLUE
#define COLOR_ORANGE
#define COLOR_GREY
#define COLOR_PINK
#define COLOR_BLACK

Переменные

1
uint16_t Width; uint16_t Height;

Ширина/Высота экрана

1
uint8_t* vram

Указатель на видео-память. Обращение к пикселю: vram[y*Width+x] =

1
size_t vramsize

Размер видео-памяти. По-другому: = Width*Height 

Типы данных

1
Image_t (uint8_t)

Bitmap изображение, хранящееся в ОЗУ. Может иметь формат, подобный этому:

1
2
3
4
5
Image_t bitmap[] = {
   0x33, // Width
   0x10, //Height
   //Data (byte per. pixel)
   0xFF, 0xFF, oxFF, oxFF,.....

Или без указания размера изображения. Пиксели идут слева-направо. Также может присутствовать цвет прозрачности, который устанавливается функцией SetAlphaColor() (см.ниже).

1
Image_f (const uint8_t)

То же самое, что и предыдущее, но хранится в постоянной памяти. (можно переделать в prog_uchar)

Инициализация

1
boolean Init(boolean vmode)

Библиотека создает видео-буфер, при установленном vmode — графическом режиме. Если все прошло успешно, то возвращает true.

1
void Destroy()

Удаляет видео-буфер и завершает работу.

1
void SetAlphaColor(uint8_t alcol)

Устанавливает цвет прозрачности. (нужен для вывода bitmap без фона и д.р.). alcol — значение от 0 до 255.

Обработка экранного буфера

1
void ClearScreen()

Очистить экран. (быстро заполнить нулями)

1
void FillScreen(byte color)

Заполнить экран цветом color.

1
2
void FillScreenFromBuffer(void *buf)
void FillScreenFromBuffer(const void *buf)

Заполнить экран из определенного буфера buf.

1
void SendScreenTo(void *dest)

Отправить видео-буфер на адрес dest. Может являться вторым буфером или областью памяти видео-устройства.

Графические примитивы

1
2
void DrawPixel(uint16_t x, uint16_t y, byte color)
void DrawPixelX(uint16_t x, uint16_t y, byte color)

Рисование пикселей на координатах. Версия с X отличается от обычной версии проверкой на выход за границы координат.

Самая скоростная — первая.

1
2
uint8_t GetPixel(uint16_t x, uint16_t y)
uint8_t GetPixelX(uint16_t x, uint16_t y)

Здесь понятно…

1
void DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, byte color)

Рисует линию цвета color.

1
void DrawTri(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t x3, uint16_t y3, byte color)

Рисует треугольник.

1
void DrawRect(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t x3, uint16_t y3, uint16_t x4, uint16_t y4, byte color)

Рисует квадрат.

1
void DrawFillRect(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, byte color)

Рисует закрашенный квадрат.

1
void DrawCircle(uint16_t xm, uint16_t ym, uint16_t r, byte color);

Рисует окружность

Текст

1
void DrawText(char *text, int16_t x, int16_t y, uint8_t fgcol, int16_t bgcol = -256, int16_t dir = 0)

Выводит текст цвета fgcol и заднего фона bgcol, с направлением dir.

Bitmap изображения

1
void DrawBitmapRaw(Image_* bmp, uint16_t w, uint16_t h, int16_t x, int16_t y, boolean inverted)

Выводит изображение типа Image_(t/f), без указания размера в массиве(указывается в переменных w и h). Параметр inverted отвечает за отражение по горизонтали.

1
void DrawBitmapRawX(Image_* bmp, uint16_t w, uint16_t h, int16_t x, int16_t y, boolean inverted)

То же самое, что и выше, но с битовыми отсечениями, при выходе за границу экрана.

1
void DrawBitmap(Image_* bmp, int16_t x, int16_t y, boolean inverted)

Выводит изображение типа Image_(t/f), с указания размера в массиве(сначала ширина, затем высота). Ширина и высота не должны превышать 255, иначе используйте другие функции. (DrawRaw, DrawHuge) Параметр inverted отвечает за отражение по горизонтали.

1
void DrawBitmap(Image_* bmp, int16_t x, int16_t y, boolean inverted, byte cdif)

Выводит изображение с изменением цвета переменной cdif. colorpixel | cdif — тем самым, мы можем изменять гамму всего изображения. (00100101 | 01001010 = 01101111)

1
void DrawBitmapX(Image_* bmp, int16_t x, int16_t y, boolean inverted)

Вывод с системой отсечений.

1
void DrawBitmapX(Image_* bmp, int16_t x, int16_t y, boolean inverted, byte cdif)

Вывод с системой отсечений и изм. гаммой цвета.

1
void DrawBitmapAlpha(Image_* bmp, int16_t x, int16_t y, byte color, boolean inverted)

Вывод изображения с цветом полу-прозрачности — color. Если color будет ровняться alcol (в функции SetAlphaColor), то все четные/нечетные пиксели будут прозрачными.

1
void DrawBitmapAlpha(Image_* bmp, int16_t x, int16_t y, byte color, boolean inverted, byte cdif)

Вывод изображения с цветом полу-прозрачности — color + изменение цветовой гаммы.

1
void DrawBitmapAlphaX(Image_* bmp, int16_t x, int16_t y, byte color, boolean inverted)

С системой отсечений.

1
void DrawBitmapAlphaX(Image_* bmp, int16_t x, int16_t y, byte color, boolean inverted, byte cdif)

C системой отсечений.

1
void DrawHugeImage(Image_* img, uint16_t w, uint16_t h, int16_t xscroll, int16_t yscroll)

Рисуем на экране изображение как в DrawBitmapRaw, но превышающее размеры экрана. xscroll и yscroll — отвечают за «прокрутку» изображения или «перемещения камеры».

1
Image_t* GetBitmap(uint16_t x, uint16_t y, uint16_t w, uint16_t h)

Сохраняет кусочек экрана и пакует его в формат Image_t с размерными данными. Но размер изображения не может превышать 255 по ширине/высоте.

Тайловая графика (полезную информацию можно узнать в цикле Тайловая графическая система)

1
void DrawTile(unsigned char tex, Image_* b, int16_t posx, int16_t posy)

Выводит 1 тайл 16×16 из набора тайлов b, формата 16x(16*кол-во тайлов) и типа Image_ без данных размера. tex = номер тайла-1. Также присутствует система отсечений. Самый первый тайл в наборе — должен быть монотонного цвета или прозрачным (альфа цвет), нули в тайловой карте (см.ниже) заполняются этим тайлом.

1
void DrawTileMap(unsigned char *mass, uint16_t mw, uint16_t mh, Image_* bb, int16_t xcam, int16_t ycam, unsigned char xbb, unsigned char ybb, boolean zero = 0)

Вывод карты тайлов типа mass, размера mw и mh. Необходимо инициализировать массив типа unsigned char tilemap[mw*mh];. Обращение к ячейке карты будет таким: tilemap[y*mw+x] =… Набор тайлов bb такой же как и в предыдущей функции. xcam, ycam — сдвиг тайла(знаковый). xbb, ybb — сдвиг тайла по-блочно (16px). zero — нулевой тайл. Если 0, то значение ячейки карты 0 будет принимать тайл под номером 0 и т.д.

Визуальные эффекты

1
void DisappearImage(void (*callback)(void))

Растворение изображения по пикселям. callback указатель на функцию рендеринга типа void, чтобы можно было видеть все растворение.

1
void ChangeLighting(int16_t vol)

Изменяет яркость изображения. Параметр vol может меняться от -8 до +8. (осторожнее со значениями!) (Работает только без палитр)

1
void Scroll(uint16_t x, uint16_t y, uint16_t w, uint16_t h, int16_t dx, int16_t dy, int16_t color=-256)

Смещает определенную область изображения. Значение color указывает — чем заливать пустоты после смещения.

1
Image_t* RotateImage(Image_* img, float angle)

Поворачивает изображение на угол angle в градусах. Возвращает изображение типа Image_t с размерами. Предупреждение: большие изображения поворачивать не получится, так как во время поворота размер изображения увеличивается.

1
void Pixelate(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint8_t size)

«Пикселезирует» участок изображения или все изображение. Размеры участка: wh. Координаты участка: xy. Размеры пиксель-блока: size. (Работает только без палитр)

   
Пример инициализации:

1
2
3
GFX.Init(VGA_MODE_272x208);
GFX.SetAlphaColor(COLOR_PINK);
GFX.ClearScreen();

 
BMP2RGB8 — полезная утилита, позволяющая кодировать bmp24 в формат, подходящий для вывода GFX.DrawBitmap или GFX.DrawBitmapRaw, если убрать информационные строки о размере. (также следуете изменить uint8_t на Image_t или Image_f)
   
Большинство функций inline, а также оптимизированы на низком уровне. К примеру, вывод пикселя на экран происходит не так: vram[y*Width+x], а вот так: vram[(y -лог.сдвиг.влево- shr1)+(y -лог.сдвиг.влево- shr2)+x] , что увеличивает скорость выполнения в 1.5 раза. GFX.DrawBitmap — также максимально оптимизирован.

Надеюсь, пригодится. Все обновления будут в этой записи.

Пишите в комментарии. 🙂

Вы можите оставить комментарий, или поставить трэкбек со своего сайта.

Есть 1 комментарий. к “8-бит Графическая библиотека (C++)”

  1. 8-бит Графическая библиотека (C ) | Pole abeyvagskid ghd styler

Написать комментарий

XHTML: Вы можете использовать эти теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Bug Report
Локализовано: шаблоны Wordpress