vtgl

terminal emulator implemented in OpenGL
git clone anongit@rnpnr.xyz:vtgl.git
Log | Files | Refs | Feed | LICENSE

Commit: 565b5361f44aa04fdf61f6290325d6f4881e9bdb
Parent: 42c2fce9d37ea378d1b94bee58bb7a1700b36932
Author: Randy Palamar
Date:   Mon, 19 Aug 2024 05:45:58 -0600

indexed colour support (ESC[38;5;idx;m)

Diffstat:
Mterminal.c | 44++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 42 insertions(+), 2 deletions(-)

diff --git a/terminal.c b/terminal.c @@ -352,12 +352,36 @@ struct direct_colour_result { Colour colour; }; +/* NOTE: adapted from the perl script 256colres.pl in xterm src */ +static Colour +indexed_colour(i32 index) +{ + Colour result; + if (index < 232) { + /* NOTE: 16-231 are colours off a 6x6x6 RGB cube */ + index -= 16; + result.r = 40 * ((index / 36)); + result.g = 40 * ((index % 36) / 6); + result.b = 40 * ((index % 6)); + result.a = 0xFF; + if (result.r) result.r += 55; + if (result.g) result.g += 55; + if (result.b) result.b += 55; + } else { + /* NOTE: 232-255 are greyscale ramp */ + u32 k = (10 * (index - 232) + 8) & 0xFF; + result.r = result.g = result.b = k; + result.a = 0xFF; + } + return result; +} + static struct direct_colour_result direct_colour(i32 *argv, i32 argc, i32 *idx) { struct direct_colour_result result = {.status = DCR_FAILURE}; switch (argv[*idx + 1]) { - case 2: /* define RGB colour */ + case 2: /* NOTE: defined RGB colour */ if (*idx + 4 >= argc) { fprintf(stderr, "direct_colour: wrong paramater count: %d\n", argc); break; @@ -373,7 +397,23 @@ direct_colour(i32 *argv, i32 argc, i32 *idx) result.colour = (Colour){.r = r, .g = g, .b = b, .a = 0xFF}; result.status = DCR_SUCCESS; break; - case 5: /* TODO: indexed colour */ + case 5: /* NOTE: indexed colour */ + if (*idx + 2 >= argc) { + fprintf(stderr, "direct_colour: wrong paramater count: %d\n", argc); + break; + } + *idx += 2; + if (!BETWEEN(argv[*idx], 0, 255)) { + fprintf(stderr, "direct_colour: index parameter out of range: %d\n", + argv[*idx]); + break; + } + if (BETWEEN(argv[*idx], 0, 16)) + result.colour = g_colours.data[argv[*idx]]; + else + result.colour = indexed_colour(argv[*idx]); + result.status = DCR_SUCCESS; + break; default: fprintf(stderr, "define_colour: unknown argument: %d\n", argv[*idx + 1]); }