From d730844f654a198a293f853dc897c857a5f886a2 Mon Sep 17 00:00:00 2001 From: KikooDX Date: Wed, 26 May 2021 13:41:38 +0200 Subject: [PATCH] display system It works. self.state = Happy; --- CMakeLists.txt | 4 ++++ include/disp.h | 9 +++++++++ src/disp/clear.c | 7 +++++++ src/disp/display.c | 35 +++++++++++++++++++++++++++++++++++ src/disp/init.c | 9 +++++++++ src/disp/print.c | 20 ++++++++++++++++++++ src/main.c | 5 +++++ 7 files changed, 89 insertions(+) create mode 100644 include/disp.h create mode 100644 src/disp/clear.c create mode 100644 src/disp/display.c create mode 100644 src/disp/init.c create mode 100644 src/disp/print.c diff --git a/CMakeLists.txt b/CMakeLists.txt index aa2531d..a46d30a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,6 +14,10 @@ include_directories(include) set(SOURCES src/main.c + src/disp/display.c + src/disp/print.c + src/disp/init.c + src/disp/clear.c ) set(ASSETS diff --git a/include/disp.h b/include/disp.h new file mode 100644 index 0000000..517e314 --- /dev/null +++ b/include/disp.h @@ -0,0 +1,9 @@ +#pragma once + +#define DISP_BUFFER_SIZE 1024 +extern char disp_buffer[DISP_BUFFER_SIZE]; + +void disp_init(void); +void disp_clear(void); +int disp_print(char *text); +void disp_display(void); diff --git a/src/disp/clear.c b/src/disp/clear.c new file mode 100644 index 0000000..f736112 --- /dev/null +++ b/src/disp/clear.c @@ -0,0 +1,7 @@ +#include "disp.h" + +void +disp_clear(void) +{ + disp_buffer[0] = '\0'; +} diff --git a/src/disp/display.c b/src/disp/display.c new file mode 100644 index 0000000..9f3c02f --- /dev/null +++ b/src/disp/display.c @@ -0,0 +1,35 @@ +#include "disp.h" +#include +#include + +static void draw_line(int x, int y, char *buffer, int len); + +void +disp_display(void) +{ + static int line_height = 0; + const int x = 2; + int y = 2; + char *buffer_cursor = disp_buffer; + int line_length = 0; + + if (!line_height) + line_height = dfont_default()->line_height; + + while (buffer_cursor[line_length] != '\0') { + if (buffer_cursor[line_length] == '\n') { + draw_line(x, y, buffer_cursor, line_length); + buffer_cursor += line_length + 1; + line_length = 0; + y += line_height; + } else + line_length += 1; + } + draw_line(x, y, buffer_cursor, line_length); +} + +static void +draw_line(int x, int y, char *buffer, int len) +{ + dtext_opt(x, y, C_BLACK, C_NONE, DTEXT_LEFT, DTEXT_TOP, buffer, len); +} diff --git a/src/disp/init.c b/src/disp/init.c new file mode 100644 index 0000000..83699d3 --- /dev/null +++ b/src/disp/init.c @@ -0,0 +1,9 @@ +#include "disp.h" + +char disp_buffer[DISP_BUFFER_SIZE]; + +void +disp_init(void) +{ + disp_clear(); +} diff --git a/src/disp/print.c b/src/disp/print.c new file mode 100644 index 0000000..0516c88 --- /dev/null +++ b/src/disp/print.c @@ -0,0 +1,20 @@ +#include "disp.h" + +int +disp_print(char *text) +{ + char *buffer_cursor = disp_buffer; + char *text_cursor = text; + + while (*buffer_cursor != '\0') + buffer_cursor += 1; + + while (*text_cursor != '\0') { + *buffer_cursor = *text_cursor; + buffer_cursor += 1; + text_cursor += 1; + } + buffer_cursor[1] = '\0'; + + return 0; +} diff --git a/src/main.c b/src/main.c index ece1f4d..22156b9 100644 --- a/src/main.c +++ b/src/main.c @@ -1,3 +1,4 @@ +#include "disp.h" #include #include @@ -6,8 +7,12 @@ main(void) { /* init */ disp_init(); + disp_print("Hello, World!\n"); + disp_print("Draw me an unicorn!\n"); + disp_print(" UwU\n"); dclear(C_WHITE); + disp_display(); dupdate(); getkey();