mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-20 01:40:14 -05:00
csi: reduce duplication in code handling SGR 38 and 48 sequences
This commit is contained in:
parent
6792f5fce0
commit
856086bbbe
1 changed files with 24 additions and 85 deletions
109
csi.c
109
csi.c
|
|
@ -118,15 +118,18 @@ csi_sgr(struct terminal *term)
|
||||||
term->vt.attrs.fg = param - 30;
|
term->vt.attrs.fg = param - 30;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 38: {
|
case 38:
|
||||||
|
case 48: {
|
||||||
|
uint32_t color;
|
||||||
|
enum color_source src;
|
||||||
|
|
||||||
/* Indexed: 38;5;<idx> */
|
/* Indexed: 38;5;<idx> */
|
||||||
if (term->vt.params.idx - i - 1 >= 2 &&
|
if (term->vt.params.idx - i - 1 >= 2 &&
|
||||||
term->vt.params.v[i + 1].value == 5)
|
term->vt.params.v[i + 1].value == 5)
|
||||||
{
|
{
|
||||||
term->vt.attrs.fg_src = COLOR_BASE256;
|
src = COLOR_BASE256;
|
||||||
term->vt.attrs.fg = term->vt.params.v[i + 2].value;
|
color = term->vt.params.v[i + 2].value;
|
||||||
i += 2;
|
i += 2;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* RGB: 38;2;<r>;<g>;<b> */
|
/* RGB: 38;2;<r>;<g>;<b> */
|
||||||
|
|
@ -136,8 +139,8 @@ csi_sgr(struct terminal *term)
|
||||||
uint8_t r = term->vt.params.v[i + 2].value;
|
uint8_t r = term->vt.params.v[i + 2].value;
|
||||||
uint8_t g = term->vt.params.v[i + 3].value;
|
uint8_t g = term->vt.params.v[i + 3].value;
|
||||||
uint8_t b = term->vt.params.v[i + 4].value;
|
uint8_t b = term->vt.params.v[i + 4].value;
|
||||||
term->vt.attrs.fg_src = COLOR_RGB;
|
src = COLOR_RGB;
|
||||||
term->vt.attrs.fg = r << 16 | g << 8 | b;
|
color = r << 16 | g << 8 | b;
|
||||||
i += 4;
|
i += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -145,10 +148,8 @@ csi_sgr(struct terminal *term)
|
||||||
else if (term->vt.params.v[i].sub.idx >= 2 &&
|
else if (term->vt.params.v[i].sub.idx >= 2 &&
|
||||||
term->vt.params.v[i].sub.value[0] == 5)
|
term->vt.params.v[i].sub.value[0] == 5)
|
||||||
{
|
{
|
||||||
const struct vt_param *param = &term->vt.params.v[i];
|
src = COLOR_BASE256;
|
||||||
|
color = term->vt.params.v[i].sub.value[1];
|
||||||
term->vt.attrs.fg_src = COLOR_BASE256;
|
|
||||||
term->vt.attrs.fg = param->sub.value[1];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -177,8 +178,8 @@ csi_sgr(struct terminal *term)
|
||||||
uint8_t g = param->sub.value[g_idx];
|
uint8_t g = param->sub.value[g_idx];
|
||||||
uint8_t b = param->sub.value[b_idx];
|
uint8_t b = param->sub.value[b_idx];
|
||||||
|
|
||||||
term->vt.attrs.fg_src = COLOR_RGB;
|
src = COLOR_RGB;
|
||||||
term->vt.attrs.fg = r << 16 | g << 8 | b;
|
color = r << 16 | g << 8 | b;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Transparent: 38:1 */
|
/* Transparent: 38:1 */
|
||||||
|
|
@ -186,9 +187,19 @@ csi_sgr(struct terminal *term)
|
||||||
/* CMYK: 38:4:<color-space>:c:m:y:k[:tolerance:tolerance-color-space] */
|
/* CMYK: 38:4:<color-space>:c:m:y:k[:tolerance:tolerance-color-space] */
|
||||||
|
|
||||||
/* Unrecognized */
|
/* Unrecognized */
|
||||||
else
|
else {
|
||||||
UNHANDLED_SGR(i);
|
UNHANDLED_SGR(i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (param == 38) {
|
||||||
|
term->vt.attrs.fg_src = src;
|
||||||
|
term->vt.attrs.fg = color;
|
||||||
|
} else {
|
||||||
|
xassert(param == 48);
|
||||||
|
term->vt.attrs.bg_src = src;
|
||||||
|
term->vt.attrs.bg = color;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -209,78 +220,6 @@ csi_sgr(struct terminal *term)
|
||||||
term->vt.attrs.bg = param - 40;
|
term->vt.attrs.bg = param - 40;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 48: {
|
|
||||||
/* Indexed: 48;5;<idx> */
|
|
||||||
if (term->vt.params.idx - i - 1 >= 2 &&
|
|
||||||
term->vt.params.v[i + 1].value == 5)
|
|
||||||
{
|
|
||||||
term->vt.attrs.bg_src = COLOR_BASE256;
|
|
||||||
term->vt.attrs.bg = term->vt.params.v[i + 2].value;
|
|
||||||
i += 2;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* RGB: 48;2;<r>;<g>;<b> */
|
|
||||||
else if (term->vt.params.idx - i - 1 >= 4 &&
|
|
||||||
term->vt.params.v[i + 1].value == 2)
|
|
||||||
{
|
|
||||||
uint8_t r = term->vt.params.v[i + 2].value;
|
|
||||||
uint8_t g = term->vt.params.v[i + 3].value;
|
|
||||||
uint8_t b = term->vt.params.v[i + 4].value;
|
|
||||||
term->vt.attrs.bg_src = COLOR_RGB;
|
|
||||||
term->vt.attrs.bg = r << 16 | g << 8 | b;
|
|
||||||
i += 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Indexed: 48:5:<idx> */
|
|
||||||
else if (term->vt.params.v[i].sub.idx >= 2 &&
|
|
||||||
term->vt.params.v[i].sub.value[0] == 5)
|
|
||||||
{
|
|
||||||
const struct vt_param *param = &term->vt.params.v[i];
|
|
||||||
|
|
||||||
term->vt.attrs.bg_src = COLOR_BASE256;
|
|
||||||
term->vt.attrs.bg = param->sub.value[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* RGB: 48:2:<color-space>:r:g:b[:ignored:tolerance:tolerance-color-space]
|
|
||||||
* RGB: 48:2:r:g:b
|
|
||||||
*
|
|
||||||
* The second version is a "bastard" version - many
|
|
||||||
* programs "forget" the color space ID
|
|
||||||
* parameter... *sigh*
|
|
||||||
*/
|
|
||||||
else if (term->vt.params.v[i].sub.idx >= 4 &&
|
|
||||||
term->vt.params.v[i].sub.value[0] == 2)
|
|
||||||
{
|
|
||||||
const struct vt_param *param = &term->vt.params.v[i];
|
|
||||||
bool have_color_space_id = param->sub.idx >= 5;
|
|
||||||
|
|
||||||
/* 0 - color space (ignored) */
|
|
||||||
int r_idx = 2 - !have_color_space_id;
|
|
||||||
int g_idx = 3 - !have_color_space_id;
|
|
||||||
int b_idx = 4 - !have_color_space_id;
|
|
||||||
/* 5 - unused */
|
|
||||||
/* 6 - CS tolerance */
|
|
||||||
/* 7 - color space associated with tolerance */
|
|
||||||
|
|
||||||
uint8_t r = param->sub.value[r_idx];
|
|
||||||
uint8_t g = param->sub.value[g_idx];
|
|
||||||
uint8_t b = param->sub.value[b_idx];
|
|
||||||
|
|
||||||
term->vt.attrs.bg_src = COLOR_RGB;
|
|
||||||
term->vt.attrs.bg = r << 16 | g << 8 | b;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Transparent: 48:1 */
|
|
||||||
/* CMY: 48:3:<color-space>:c:m:y[:tolerance:tolerance-color-space] */
|
|
||||||
/* CMYK: 48:4:<color-space>:c:m:y:k[:tolerance:tolerance-color-space] */
|
|
||||||
|
|
||||||
else
|
|
||||||
UNHANDLED_SGR(i);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 49:
|
case 49:
|
||||||
term->vt.attrs.bg_src = COLOR_DEFAULT;
|
term->vt.attrs.bg_src = COLOR_DEFAULT;
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue