From 99b6a5ac4ac299e2768f1d05833cbbabe1543586 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Mon, 14 Jun 2021 21:35:09 +0200 Subject: [PATCH] feat: add display utils functions --- image-viewer/include/display_utils.h | 60 +++++++++++++++++++++++++ image-viewer/src/display_utils.c | 66 ++++++++++++++++++++++++++++ 2 files changed, 126 insertions(+) create mode 100644 image-viewer/include/display_utils.h create mode 100644 image-viewer/src/display_utils.c diff --git a/image-viewer/include/display_utils.h b/image-viewer/include/display_utils.h new file mode 100644 index 0000000000000000000000000000000000000000..30d7f00f775dc8385f0bb98410a7d82d3948e08b --- /dev/null +++ b/image-viewer/include/display_utils.h @@ -0,0 +1,60 @@ +#ifndef __DISPLAY_UTILS_H__ +#define __DISPLAY_UTILS_H__ + +#include + +#define DISPLAY_MAX_RED 0x11111 +#define DISPLAY_MAX_GREEN 0x111111 +#define DISPLAY_MAX_BLUE 0x11111 + +#define DISPLAY_WIDTH 480 +#define DISPLAY_HEIGHT 320 + +typedef union { + struct { + uint8_t r : 5; + uint8_t g : 6; + uint8_t b : 5; + } fields; + uint16_t bits; +} display_pixel_t; + +typedef struct { + uint8_t red; + uint8_t green; + uint8_t blue; +} raw_pixel_onebit_t; + +typedef struct { + uint16_t red; + uint16_t green; + uint16_t blue; +} raw_pixel_t; + +typedef struct { + void* base_address; +} display_data_t; + +typedef struct { + display_pixel_t pixels[DISPLAY_HEIGHT * DISPLAY_WIDTH]; + display_data_t data; +} display_t; + +const display_pixel_t BLACK_PIXEL = { .bits = 0 }; +const display_pixel_t WHITE_PIXEL = { .bits = 0xFFFF }; + +display_pixel_t raw_pixel_onebit_convert_to_display(raw_pixel_onebit_t pixel, + raw_pixel_onebit_t max); +display_pixel_t raw_pixel_convert_to_display(raw_pixel_t pixel, raw_pixel_t max); + +display_t display_init(display_data_t data); +void display_deinit(display_t *display); + +void display_render(display_t *display); +void display_clear(display_t *display); + +display_pixel_t display_get_pixel(display_t *display, uint16_t x, uint16_t y); +void display_set_pixel(display_t *display, uint16_t x, uint16_t y, + display_pixel_t pixel); + +#endif // __DISPLAY_UTILS_H__ diff --git a/image-viewer/src/display_utils.c b/image-viewer/src/display_utils.c new file mode 100644 index 0000000000000000000000000000000000000000..2eef1626f1237383b115545917ce147c121c4363 --- /dev/null +++ b/image-viewer/src/display_utils.c @@ -0,0 +1,66 @@ +#include "display_utils.h" +#include "mzapo_parlcd.h" + +display_pixel_t raw_pixel_onebit_convert_to_display(raw_pixel_onebit_t pixel, + raw_pixel_onebit_t max) { + display_pixel_t new = { + .fields = { + .r = ((double)pixel.red / (double)max.red) * DISPLAY_MAX_RED, + .g = ((double)pixel.green / (double)max.green) * DISPLAY_MAX_GREEN, + .b = ((double)pixel.blue / (double)max.blue) * DISPLAY_MAX_BLUE, + }}; + + return new; +} + +display_pixel_t raw_pixel_convert_to_display(raw_pixel_t pixel, + raw_pixel_t max) { + display_pixel_t new = { + .fields = { + .r = ((double)pixel.red / (double)max.red) * DISPLAY_MAX_RED, + .g = ((double)pixel.green / (double)max.green) * DISPLAY_MAX_GREEN, + .b = ((double)pixel.blue / (double)max.blue) * DISPLAY_MAX_BLUE, + } + }; + + return new; +} + +display_t display_init(display_data_t data) { + display_t display = { + .data = data + }; + parlcd_hx8357_init(data.base_address); + display_clear(&display); + + return display; +} +void display_deinit(display_t *display) { + display_clear(display); +} + +void display_render(display_t *display) { + parlcd_write_cmd(display->data.base_address, PARLCD_CMD_FRAMEBUFFER); + int count = DISPLAY_HEIGHT * DISPLAY_WIDTH; + for (int i = 0; i < count; i++) { + parlcd_write_data(display->data.base_address, display->pixels[i].bits); + } +} + +void display_clear(display_t *display) { + int count = DISPLAY_HEIGHT * DISPLAY_WIDTH; + for (int i = 0; i < count; i++) { + display->pixels[i] = BLACK_PIXEL; + } + + display_render(display); +} + +display_pixel_t display_get_pixel(display_t *display, uint16_t x, uint16_t y) { + return display->pixels[y * DISPLAY_WIDTH + x]; +} + +void display_set_pixel(display_t *display, uint16_t x, uint16_t y, + display_pixel_t pixel) { + display->pixels[y * DISPLAY_WIDTH + x] = pixel; +}