:: commit 67498a69671149089dde7332c5705964e378fb6f

mintsuki <mintsuki@protonmail.com> — 2022-09-04 04:39

parents: b2a390c4d5

term: Initial support for RGB

diff --git a/common/lib/gterm.c b/common/lib/gterm.c
index b1a63f21..4abad5d1 100644
--- a/common/lib/gterm.c
+++ b/common/lib/gterm.c
@@ -523,6 +523,14 @@ void gterm_set_text_bg_bright(size_t bg) {
     text_bg = ansi_bright_colours[bg];
 }
 
+void gterm_set_text_fg_rgb(uint32_t fg) {
+    text_fg = fg;
+}
+
+void gterm_set_text_bg_rgb(uint32_t bg) {
+    text_bg = bg;
+}
+
 void gterm_set_text_fg_default(void) {
     text_fg = default_fg;
 }
diff --git a/common/lib/gterm.h b/common/lib/gterm.h
index 3f4f3d45..6b3686a5 100644
--- a/common/lib/gterm.h
+++ b/common/lib/gterm.h
@@ -21,6 +21,8 @@ void gterm_set_text_fg(size_t fg);
 void gterm_set_text_bg(size_t bg);
 void gterm_set_text_fg_bright(size_t fg);
 void gterm_set_text_bg_bright(size_t bg);
+void gterm_set_text_fg_rgb(uint32_t fg);
+void gterm_set_text_bg_rgb(uint32_t bg);
 void gterm_set_text_fg_default(void);
 void gterm_set_text_bg_default(void);
 bool gterm_scroll_disable(void);
diff --git a/common/lib/term.c b/common/lib/term.c
index 9d317d2a..167c58f0 100644
--- a/common/lib/term.c
+++ b/common/lib/term.c
@@ -56,6 +56,8 @@ void term_vbe(char *config, size_t width, size_t height) {
     set_text_bg    = gterm_set_text_bg;
     set_text_fg_bright = gterm_set_text_fg_bright;
     set_text_bg_bright = gterm_set_text_bg_bright;
+    set_text_fg_rgb = gterm_set_text_fg_rgb;
+    set_text_bg_rgb = gterm_set_text_bg_rgb;
     set_text_fg_default = gterm_set_text_fg_default;
     set_text_bg_default = gterm_set_text_bg_default;
     scroll_disable = gterm_scroll_disable;
@@ -155,6 +157,8 @@ void term_textmode(void) {
 
     term_reinit();
 
+    term_notready();
+
     raw_putchar    = text_putchar;
     clear          = text_clear;
     enable_cursor  = text_enable_cursor;
@@ -427,7 +431,40 @@ set_bg_bright:
             }
             continue;
         }
+
+        // 256/RGB
+        else if (esc_values[i] == 38 || esc_values[i] == 48) {
+            bool fg = esc_values[i] == 38;
+
+            i++;
+            if (i >= esc_values_i) {
+                break;
+            }
+
+            switch (esc_values[i]) {
+                case 2: { // RGB
+                    if (i + 3 >= esc_values_i) {
+                        goto out;
+                    }
+
+                    uint32_t rgb_value = 0;
+
+                    rgb_value |= esc_values[i + 1] << 16;
+                    rgb_value |= esc_values[i + 2] << 8;
+                    rgb_value |= esc_values[i + 3];
+
+                    i += 3;
+
+                    fg ? set_text_fg_rgb(rgb_value) : set_text_bg_rgb(rgb_value);
+
+                    break;
+                }
+                default: continue;
+            }
+        }
     }
+
+out:;
 }
 
 static void dec_private_parse(uint8_t c) {
diff --git a/common/lib/term.h b/common/lib/term.h
index 1dd25af4..4305ab77 100644
--- a/common/lib/term.h
+++ b/common/lib/term.h
@@ -71,6 +71,8 @@ extern void (*set_text_fg)(size_t fg);
 extern void (*set_text_bg)(size_t bg);
 extern void (*set_text_fg_bright)(size_t fg);
 extern void (*set_text_bg_bright)(size_t bg);
+extern void (*set_text_fg_rgb)(uint32_t fg);
+extern void (*set_text_bg_rgb)(uint32_t bg);
 extern void (*set_text_fg_default)(void);
 extern void (*set_text_bg_default)(void);
 extern bool (*scroll_disable)(void);
diff --git a/common/lib/term.s2.c b/common/lib/term.s2.c
index a5bf47bf..7da107d1 100644
--- a/common/lib/term.s2.c
+++ b/common/lib/term.s2.c
@@ -22,6 +22,8 @@ void (*set_text_fg)(size_t fg);
 void (*set_text_bg)(size_t bg);
 void (*set_text_fg_bright)(size_t fg);
 void (*set_text_bg_bright)(size_t bg);
+void (*set_text_fg_rgb)(uint32_t fg);
+void (*set_text_bg_rgb)(uint32_t bg);
 void (*set_text_fg_default)(void);
 void (*set_text_bg_default)(void);
 bool (*scroll_disable)(void);
@@ -184,6 +186,9 @@ static void notready_move_character(size_t a, size_t b, size_t c, size_t d) {
 static uint64_t notready_context_size(void) {
     return 0;
 }
+static void notready_uint32_t(uint32_t n) {
+    (void)n;
+}
 static void notready_uint64_t(uint64_t n) {
     (void)n;
 }
@@ -201,6 +206,8 @@ void term_notready(void) {
     set_text_bg = notready_size_t;
     set_text_fg_bright = notready_size_t;
     set_text_bg_bright = notready_size_t;
+    set_text_fg_rgb = notready_uint32_t;
+    set_text_bg_rgb = notready_uint32_t;
     set_text_fg_default = notready_void;
     set_text_bg_default = notready_void;
     scroll_disable = notready_disable;
tab: 248 wrap: offon