From c0d756a07cdc6337f91fb95cabc2f827e2581cde Mon Sep 17 00:00:00 2001 From: xolatile Date: Tue, 3 Oct 2023 10:36:14 -0400 Subject: [PATCH] Hop hop hop... --- example/base.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++---- xlesses.c | 54 +++++++++++++++++++++++++++++++++++++----------------- xlesses.h | 8 ++++++-- 3 files changed, 93 insertions(+), 23 deletions(-) diff --git a/example/base.c b/example/base.c index 900fad2..d081b7d 100644 --- a/example/base.c +++ b/example/base.c @@ -1,18 +1,64 @@ -#include +#include +#include #include int main (void) { + int x; + int y; + int offset; + int length; + int select; + char * buffer; + + char separator [29] = ".,:;<=>+-*/%!&~^()[]{}'\" \t\r\n"; + + char * c_keywords [32] = { + "register", "volatile", "auto", "const", "static", "extern", "if", "else", + "do", "while", "for", "continue", "switch", "case", "default", "break", + "enum", "union", "struct", "typedef", "goto", "void", "return", "sizeof", + "char", "short", "int", "long", "signed", "unsigned", "float", "double" + }; + + (void) syntax_insert (0, 0, "#", " ", '\\', 0XCC33CC, 0); + (void) syntax_insert (0, 0, "/*", "*/", '\0', 0X333333, 0); + (void) syntax_insert (0, 0, "'", "'", '\\', 0XCC1133, 0); + (void) syntax_insert (0, 0, "\"", "\"", '\\', 0XCC1133, 0); + (void) syntax_insert (1, 0, ".,:;<=>+-*/%!&~^?|()[]{}", "", '\0', 0X1133CC, 0); + + for (offset = 0; offset != 32; ++offset) { + (void) syntax_insert (0, 1, c_keywords [offset], separator, '\0', 0XCCCC33, 0); + } + + (void) syntax_insert (1, 1, "0123456789", separator, '\0', 0X33CCCC, 0); + + (void) syntax_insert (1, 1, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_", separator, '\0', 0XCCCCCC, 0); + + buffer = file_import ("./example/base.c"); + blesses_initialize (); while (blesses_active != 0) { - blesses_render_string ("Heyo world!", 8, 0, 0XCC6633, 0X3366CC); - blesses_render_character ('@', 8, 8, 0X3366CC, 0XCC6633); - blesses_render_character ('@', 0, 0, 0X3366CC, 0XCC6633); + x = 0; + y = 0; + + blesses_render_background_colour (0X111111); + + for (offset = 0; buffer [offset] != '\0'; offset += length) { + select = syntax_select (& buffer [offset], & length); + + if (y >= 50 * BLESSES_FONT_WIDTH) break; + + blesses_render_string_limit (& buffer [offset], length, & x, & y, syntax_colour [select], 0X111111); + } blesses_synchronize (); } blesses_deinitialize (); + buffer = deallocate (buffer); + + syntax_delete (); + return (EXIT_SUCCESS); } diff --git a/xlesses.c b/xlesses.c index c88e69a..8fd19ee 100644 --- a/xlesses.c +++ b/xlesses.c @@ -12,8 +12,8 @@ #include char * blesses_window_title = "xolatile"; -int blesses_window_width = 640; -int blesses_window_height = 480; +int blesses_window_width = 1800; +int blesses_window_height = 900; int blesses_active = 1; int blesses_cursor_x = 0; int blesses_cursor_y = 0; @@ -126,7 +126,6 @@ void blesses_synchronize (void) { } } break; default: { - echo ("--\n"); } break; } @@ -140,6 +139,16 @@ void blesses_synchronize (void) { log_out (); } +void blesses_render_background_colour (int colour) { + int x, y; + + for (y = 0; y != blesses_window_height / 2; ++y) { + for (x = 0; x != blesses_window_width / 2; ++x) { + blesses_sub_framebuffer [y * (blesses_window_width / 2) + x] = 0XFF000000 | colour; + } + } +} + void blesses_render_character (char character, int x, int y, int foreground, int background) { const unsigned long int font_code ['~' - ' ' + 1] = { 0X0000000000000000, 0X00180018183C3C18, 0X0000000000363636, 0X006C6CFE6CFE6C6C, 0X00187ED07C16FC30, 0X0060660C18306606, 0X00DC66B61C36361C, 0X0000000000181818, @@ -156,11 +165,18 @@ void blesses_render_character (char character, int x, int y, int foreground, int 0X00663C183C660000, 0X3C607C6666660000, 0X007E0C18307E0000, 0X003018180E181830, 0X0018181818181818, 0X000C18187018180C, 0X000000000062D68C, 0X0000000000000000 }; - int offset = 0; + int offset; - log_in (LOG_WARNING, blesses_sub_framebuffer == NULL, "blesses : render_character : Sub framebuffer was not allocated."); - log_in (LOG_WARNING, blesses_framebuffer == NULL, "blesses : render_character : Framebuffer was not allocated."); - log_in (LOG_WARNING, character_is_invisible (character), "blesses : render_character : Character is not in visible ASCII range."); + if ((x <= -1) || (x >= blesses_window_width / 2 - BLESSES_FONT_WIDTH)) return; + if ((y <= -1) || (y >= blesses_window_height / 2 - BLESSES_FONT_HEIGHT)) return; + + log_in (LOG_WARNING, blesses_sub_framebuffer == NULL, "blesses : render_character : Sub framebuffer was not allocated."); + log_in (LOG_WARNING, blesses_framebuffer == NULL, "blesses : render_character : Framebuffer was not allocated."); + log_in (LOG_WARNING, character_is_invisible (character), "blesses : render_character : Character is not in visible ASCII range."); + log_in (LOG_WARNING, x <= -1, "blesses : render_character : X position is under lower limit."); + log_in (LOG_WARNING, y <= -1, "blesses : render_character : Y position is under lower limit."); + log_in (LOG_WARNING, x >= blesses_window_width - BLESSES_FONT_WIDTH, "blesses : render_character : X position is above upper limit."); + log_in (LOG_WARNING, y >= blesses_window_height - BLESSES_FONT_HEIGHT, "blesses : render_character : Y position is above upper limit."); for (offset = 0; offset != BLESSES_FONT_WIDTH * BLESSES_FONT_HEIGHT; ++offset) { int u = offset / BLESSES_FONT_WIDTH + y; @@ -172,21 +188,25 @@ void blesses_render_character (char character, int x, int y, int foreground, int log_out (); } -void blesses_render_string (char * string, int x, int y, int foreground, int background) { - int offset = 0; +void blesses_render_string_limit (char * string, int limit, int * x, int * y, int foreground, int background) { + int offset; - do { + for (offset = 0; offset != limit; ++offset) { if (string [offset] == '\t') { - x += BLESSES_FONT_WIDTH * BLESSES_FONT_TABULATOR; + * x += BLESSES_FONT_WIDTH * BLESSES_FONT_TABULATOR; } else if (string [offset] == '\n') { - y += BLESSES_FONT_HEIGHT; - x *= 0; + * y += BLESSES_FONT_HEIGHT; + * x *= 0; } else { - blesses_render_character (string [offset], x, y, foreground, background); - } + blesses_render_character (string [offset], * x, * y, foreground, background); - x += BLESSES_FONT_WIDTH; - } while (++offset != string_length (string)); + * x += BLESSES_FONT_WIDTH; + } + } +} + +void blesses_render_string (char * string, int * x, int * y, int foreground, int background) { + blesses_render_string_limit (string, string_length (string), x, y, foreground, background); } #endif diff --git a/xlesses.h b/xlesses.h index d38b47a..cfcb08e 100644 --- a/xlesses.h +++ b/xlesses.h @@ -45,7 +45,11 @@ extern void blesses_initialize (void); extern void blesses_deinitialize (void); extern void blesses_synchronize (void); -extern void blesses_render_character (char, int, int, int, int); -extern void blesses_render_string (char *, int, int, int, int); +extern void blesses_render_background_colour (int); + +extern void blesses_render_character (char, int, int, int, int); + +extern void blesses_render_string_limit (char *, int, int *, int *, int, int); +extern void blesses_render_string (char *, int *, int *, int, int); #endif