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:
M | terminal.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]);
}