~ruther/CTU-FEE-B0B35APO-Semestral-project

99b6a5ac4ac299e2768f1d05833cbbabe1543586 — František Boháček 3 years ago c25fefc
feat: add display utils functions
2 files changed, 126 insertions(+), 0 deletions(-)

A image-viewer/include/display_utils.h
A image-viewer/src/display_utils.c
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;
}

Do not follow this link