From d27f9ecf7ea92b702df128f856c1063aa91c51f2 Mon Sep 17 00:00:00 2001 From: jaseg Date: Fri, 3 Jan 2014 16:40:44 +0100 Subject: Maybe gif-lib wasn't too bright an idea... --- host/main.c | 123 +++++++++++++++++++++++++++++++----------------------------- 1 file changed, 63 insertions(+), 60 deletions(-) (limited to 'host/main.c') diff --git a/host/main.c b/host/main.c index 48532f7..81ad7b1 100644 --- a/host/main.c +++ b/host/main.c @@ -1,4 +1,5 @@ +#include "main.h" #include "font.h" #include "color.h" #include @@ -11,17 +12,17 @@ #include #include -// CAUTION: REQUIRES INPUT TO BE \0-TERMINATED -// ...also, it does a hardcodes setlocale of LC_CTYPE to en_US.utf8 for... reasons. -int console_render(char *s, glyph_t **glyph_table, unsigned int glyph_table_size){ +/* CAUTION: REQUIRES INPUT TO BE \0-TERMINATED + * ...also, it does a hardcodes setlocale of LC_CTYPE to en_US.utf8 for... reasons. */ +color_t * framebuffer_render_text(char *s, glyph_t **glyph_table, unsigned int glyph_table_size){ unsigned int len = strlen(s); - uint8_t *gbuf = NULL; + color_t *gbuf = NULL; unsigned int gbufwidth = 0; unsigned int gbufheight = 0; char *p = s; - // Calculate screen width of string prior to allocating memory for the frame buffer + /* Calculate screen width of string prior to allocating memory for the frame buffer */ wchar_t c; mbstate_t ps = {0}; memset(&ps, 0, sizeof(mbstate_t)); @@ -32,7 +33,7 @@ int console_render(char *s, glyph_t **glyph_table, unsigned int glyph_table_size for(;;){ while(*p == '\033'){ p++; - // Jump over escape sequences + /* Jump over escape sequences */ for(;;p++){ if(!(*p == ';' || *p == '[' || ('0' <= *p && *p <= '9'))){ p++; @@ -42,12 +43,12 @@ int console_render(char *s, glyph_t **glyph_table, unsigned int glyph_table_size memset(&ps, 0, sizeof(mbstate_t)); } - size_t inc = mbrtowc(&c, p, MB_CUR_MAX, &ps); // MB_CUR_MAX is safe since p is \0-terminated + size_t inc = mbrtowc(&c, p, MB_CUR_MAX, &ps); /* MB_CUR_MAX is safe since p is \0-terminated */ if(inc == -1 || inc == -2){ fprintf(stderr, "Error rendering string: No valid UTF-8 input.\n"); goto error; } - if(inc == 0) // Reached end of string + if(inc == 0) /* Reached end of string */ break; p += inc; @@ -67,17 +68,16 @@ int console_render(char *s, glyph_t **glyph_table, unsigned int glyph_table_size gbufwidth += g->width; } - // For easier rendering on the terminal, round up to multiples of two + /* For easier rendering on the terminal, round up to multiples of two */ gbufheight += gbufheight&1; - // gbuf uses 3 bytes per color for r, g and b - unsigned int gbufsize = gbufwidth*3*gbufheight; - gbuf = malloc(gbufsize); + unsigned int gbufsize = gbufwidth*gbufheight; + gbuf = malloc(gbufsize, sizeof(color_t)); if(gbuf == 0){ - fprintf(stderr, "Cannot malloc() %d bytes.\n", gbufsize); + fprintf(stderr, "Cannot malloc() %d bytes.\n", gbufsize*sizeof(color_t)); goto error; } - memset(gbuf, 0, gbufsize); + memset(gbuf, 0, gbufsize*sizeof(color_t)); unsigned int x = 0; p = s; @@ -86,21 +86,21 @@ int console_render(char *s, glyph_t **glyph_table, unsigned int glyph_table_size color_t fg; color_t bg; unsigned int blink:4; - unsigned int bold:1; // TODO + unsigned int bold:1; /* TODO */ unsigned int underline:1; unsigned int strikethrough:1; - unsigned int fraktur:1; // TODO See: Flat10 Fraktur font + unsigned int fraktur:1; /* TODO See: Flat10 Fraktur font */ unsigned int invert:1; } style = { colortable[DEFAULT_FG_COLOR], colortable[DEFAULT_BG_COLOR], 0, 0, 0, 0, 0, 0 }; - // Render glyphs (now with escape sequence rendering!) + /* Render glyphs (now with escape sequence rendering!) */ for(;;){ - // NOTE: This nested escape sequence parsing does not contain any unicode-awareness whatsoever - if(*p == '\033'){ // Escape sequence YAY + /* NOTE: This nested escape sequence parsing does not contain any unicode-awareness whatsoever */ + if(*p == '\033'){ /* Escape sequence YAY */ char *sequence_start = ++p; - if(*p == '['){ // This was a CSI! - // Disassemble the list of numbers, only accept SGR sequences (those ending with 'm') + if(*p == '['){ /* This was a CSI! */ + /* Disassemble the list of numbers, only accept SGR sequences (those ending with 'm') */ long elems[MAX_CSI_ELEMENTS]; int nelems; for(nelems = 0; nelemsy usually is a negative index of the glyph's baseline measured from the glyph's bottom + /* g->y usually is a negative index of the glyph's baseline measured from the glyph's bottom */ int uly = gbufheight + g->y; for(int i=0; iwidth; i++){ if(style.strikethrough) - *((color_t *)(gbuf + (sty*gbufwidth + x + i)*3)) = fg; + gbuf[sty*gbufwidth + x + i] = fg; if(style.underline) - *((color_t *)(gbuf + (uly*gbufwidth + x + i)*3)) = fg; + gbuf[uly*gbufwidth + x + i] = fg; } } x += g->width; } + return gbuf; + error: + free(gbuf); + return 0; +} - // Render framebuffer to terminal, two pixels per character using Unicode box drawing stuff +void console_render_buffer(uint8_t *gbuf, unsigned int gbufwidth, unsigned int gbufheight){ + /* Render framebuffer to terminal, two pixels per character using Unicode box drawing stuff */ color_t lastfg = {0, 0, 0}, lastbg = {0, 0, 0}; printf("\e[38;5;0;48;5;0m"); for(unsigned int y=0; y < gbufheight; y+=2){ for(unsigned int x=0; x < gbufwidth; x++){ - // Da magicks: ▀█▄ - color_t ct = *((color_t *)(gbuf + (y*gbufwidth + x)*3)); // Top pixel - color_t cb = *((color_t *)(gbuf + ((y+1)*gbufwidth + x)*3)); // Bottom pixel - // The following, rather convoluted logic tries to "save" escape sequences when rendering. + /* Da magicks: ▀█▄ */ + color_t ct = *((color_t *)(gbuf + (y*gbufwidth + x)*sizeof(color_t))); /* Top pixel */ + color_t cb = *((color_t *)(gbuf + ((y+1)*gbufwidth + x)*sizeof(color_t))); /* Bottom pixel */ + /* The following, rather convoluted logic tries to "save" escape sequences when rendering. */ if(!memcmp(&ct, &lastfg, sizeof(color_t))){ if(!memcmp(&cb, &lastbg, sizeof(color_t))){ printf("▀"); @@ -309,7 +315,7 @@ int console_render(char *s, glyph_t **glyph_table, unsigned int glyph_table_size printf("\033[38;5;%dm▄", xterm_color_index(cb)); lastfg = cb; } - }else{ // No matches for the upper pixel + }else{ /* No matches for the upper pixel */ if(!memcmp(&cb, &lastfg, sizeof(color_t))){ printf("\033[48;5;%dm▄", xterm_color_index(ct)); lastbg = ct; @@ -326,9 +332,6 @@ int console_render(char *s, glyph_t **glyph_table, unsigned int glyph_table_size printf("\n"); } return 0; -error: - free(gbuf); - return 1; } int main(int argc, char **argv){ -- cgit