1
0
mirror of https://github.com/rkd77/elinks.git synced 2025-02-02 15:09:23 -05:00

[plain] Decode 24 bit color sequences

This commit is contained in:
Witold Filipczyk 2021-08-04 10:30:53 +02:00
parent 13c4a1ce4d
commit 0401fd58dc

View File

@ -228,6 +228,14 @@ print_document_link(struct plain_renderer *renderer, int lineno,
return len; return len;
} }
#define RED_COLOR_MASK 0x00FF0000
#define GREEN_COLOR_MASK 0x0000FF00
#define BLUE_COLOR_MASK 0x000000FF
#define RED_COLOR(color) (((color) & RED_COLOR_MASK) >> 16)
#define GREEN_COLOR(color) (((color) & GREEN_COLOR_MASK) >> 8)
#define BLUE_COLOR(color) (((color) & BLUE_COLOR_MASK) >> 0)
static void static void
decode_esc_color(char *text, int *line_pos, int width, decode_esc_color(char *text, int *line_pos, int width,
struct screen_char *template_, enum color_mode mode, struct screen_char *template_, enum color_mode mode,
@ -238,6 +246,14 @@ decode_esc_color(char *text, int *line_pos, int width,
char *buf, *tail, *begin, *end; char *buf, *tail, *begin, *end;
int k, foreground, background, f1, b1; /* , intensity; */ int k, foreground, background, f1, b1; /* , intensity; */
int was_background = 0;
int was_foreground = 0;
int was_24 = 0;
unsigned char back_red = 0, back_green = 0, back_blue = 0;
unsigned char fore_red = 0, fore_green = 0, fore_blue = 0;
++(*line_pos); ++(*line_pos);
buf = (char *)&text[*line_pos]; buf = (char *)&text[*line_pos];
@ -245,26 +261,94 @@ decode_esc_color(char *text, int *line_pos, int width,
++buf; ++buf;
++(*line_pos); ++(*line_pos);
k = strspn(buf, "0123456789;"); k = strspn(buf, "0123456789;?");
*line_pos += k; *line_pos += k;
if (!k || buf[k] != 'm') return; if (!k || (buf[k] != 'm' && buf[k] != 'l' && buf[k] != 'h')) return;
end = buf + k; end = buf + k;
begin = tail = buf; begin = tail = buf;
get_screen_char_color(template_, &color, 0, mode); get_screen_char_color(template_, &color, 0, mode);
back_red = RED_COLOR(color.background);
back_green = GREEN_COLOR(color.background);
back_blue = BLUE_COLOR(color.background);
fore_red = RED_COLOR(color.foreground);
fore_green = GREEN_COLOR(color.foreground);
fore_blue = BLUE_COLOR(color.foreground);
set_term_color(&ch, &color, 0, COLOR_MODE_16); set_term_color(&ch, &color, 0, COLOR_MODE_16);
b1 = background = (ch.c.color[0] >> 4) & 7; b1 = background = (ch.c.color[0] >> 4) & 7;
f1 = foreground = ch.c.color[0] & 15; f1 = foreground = ch.c.color[0] & 15;
while (tail < end) { while (tail < end) {
char kod = (char)strtol(begin, &tail, 10); unsigned char kod = (unsigned char)strtol(begin, &tail, 10);
begin = tail + 1; begin = tail + 1;
if (was_background) {
switch (was_background) {
case 1:
if (kod == 2) {
was_background = 2;
continue;
}
was_background = 0;
continue;
case 2:
back_red = kod;
was_background = 3;
continue;
case 3:
back_green = kod;
was_background = 4;
continue;
case 4:
back_blue = kod;
was_background = 0;
was_24 = 1;
continue;
default:
was_background = 0;
continue;
}
}
if (was_foreground) {
switch (was_foreground) {
case 1:
if (kod == 2) {
was_foreground = 2;
continue;
}
was_foreground = 0;
continue;
case 2:
fore_red = kod;
was_foreground = 3;
continue;
case 3:
fore_green = kod;
was_foreground = 4;
continue;
case 4:
fore_blue = kod;
was_foreground = 0;
was_24 = 1;
continue;
default:
was_foreground = 0;
continue;
}
}
switch (kod) { switch (kod) {
case 0: case 0:
background = 0; background = 0;
foreground = 7; foreground = 7;
back_red = back_green = back_blue = 0;
fore_red = fore_green = fore_blue = 255;
break; break;
case 7: case 7:
if (*was_reversed == 0) { if (*was_reversed == 0) {
@ -290,6 +374,11 @@ decode_esc_color(char *text, int *line_pos, int width,
case 37: case 37:
foreground = kod - 30; foreground = kod - 30;
break; break;
case 38:
was_foreground = 1;
break;
case 40: case 40:
case 41: case 41:
case 42: case 42:
@ -300,12 +389,20 @@ decode_esc_color(char *text, int *line_pos, int width,
case 47: case 47:
background = kod - 40; background = kod - 40;
break; break;
case 48:
was_background = 1;
break;
default: default:
break; break;
} }
} }
color.background = get_term_color16(background); color.background = get_term_color16(background);
color.foreground = get_term_color16(foreground); color.foreground = get_term_color16(foreground);
if (was_24) {
color.background = (back_red << 16) | (back_green << 8) | back_blue;
color.foreground = (fore_red << 16) | (fore_green << 8) | fore_blue;
}
set_term_color(template_, &color, 0, mode); set_term_color(template_, &color, 0, mode);
} }