A image-viewer/include/display_utils.h => image-viewer/include/display_utils.h +60 -0
@@ 0,0 1,60 @@
+#ifndef __DISPLAY_UTILS_H__
+#define __DISPLAY_UTILS_H__
+
+#include <stdint.h>
+
+#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__
A image-viewer/src/display_utils.c => image-viewer/src/display_utils.c +66 -0
@@ 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;
+}