mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-25 01:40:19 -05:00
terminal: foreground/background in cell attributes are now uint32_t
This reduces the cell size, and thus improves the cache behavour
This commit is contained in:
parent
2a1c4d29e9
commit
ccc8ef9606
5 changed files with 123 additions and 62 deletions
88
csi.c
88
csi.c
|
|
@ -18,6 +18,7 @@
|
|||
|
||||
#define min(x, y) ((x) < (y) ? (x) : (y))
|
||||
|
||||
#if 0
|
||||
static const struct rgb colors_regular[] = {
|
||||
{0.000000, 0.000000, 0.000000}, /* 0x000000 */
|
||||
{0.800000, 0.576471, 0.576471}, /* 0xcc9393 */
|
||||
|
|
@ -41,6 +42,31 @@ static const struct rgb colors_bright[] = {
|
|||
};
|
||||
|
||||
static struct rgb colors256[256];
|
||||
#else
|
||||
static const uint32_t colors_regular[] = {
|
||||
0x000000,
|
||||
0xcc9393,
|
||||
0x7f9f7f,
|
||||
0xd0bf8f,
|
||||
0x6ca0a3,
|
||||
0xdc8cc3,
|
||||
0x93e0e3,
|
||||
0xdcdccc,
|
||||
};
|
||||
|
||||
static const uint32_t colors_bright[] = {
|
||||
0x000000,
|
||||
0xdca3a3,
|
||||
0xbfebbf,
|
||||
0xf0dfaf,
|
||||
0x8cd0d3,
|
||||
0xdc8cc3,
|
||||
0x93e0e3,
|
||||
0xffffff,
|
||||
};
|
||||
|
||||
static uint32_t colors256[256];
|
||||
#endif
|
||||
|
||||
static void __attribute__((constructor))
|
||||
initialize_colors256(void)
|
||||
|
|
@ -53,21 +79,31 @@ initialize_colors256(void)
|
|||
for (size_t r = 0; r < 6; r++) {
|
||||
for (size_t g = 0; g < 6; g++) {
|
||||
for (size_t b = 0; b < 6; b++) {
|
||||
#if 0
|
||||
colors256[16 + r * 6 * 6 + g * 6 + b] = (struct rgb) {
|
||||
r * 51 / 255.0,
|
||||
g * 51 / 255.0,
|
||||
b * 51 / 255.0,
|
||||
};
|
||||
#else
|
||||
colors256[16 + r * 6 * 6 + g * 6 + b]
|
||||
= r * 51 << 16 | g * 51 << 8 | b * 51;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < 24; i++){
|
||||
#if 0
|
||||
colors256[232 + i] = (struct rgb) {
|
||||
i * 11 / 255.0,
|
||||
i * 11 / 255.0,
|
||||
i * 11 / 255.0,
|
||||
};
|
||||
#else
|
||||
/* TODO: i + 1? */
|
||||
colors256[232 + i] = i * 11 << 16 | i * 11 << 8 | i * 11;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -152,8 +188,7 @@ csi_sgr(struct terminal *term)
|
|||
case 35:
|
||||
case 36:
|
||||
case 37:
|
||||
term->vt.attrs.have_foreground = true;
|
||||
term->vt.attrs.foreground = colors_regular[param - 30];
|
||||
term->vt.attrs.foreground = 1 << 31 | colors_regular[param - 30];
|
||||
break;
|
||||
|
||||
case 38: {
|
||||
|
|
@ -161,8 +196,7 @@ csi_sgr(struct terminal *term)
|
|||
term->vt.params.v[i + 1].value == 5)
|
||||
{
|
||||
size_t idx = term->vt.params.v[i + 2].value;
|
||||
term->vt.attrs.foreground = colors256[idx];
|
||||
term->vt.attrs.have_foreground = true;
|
||||
term->vt.attrs.foreground = 1 << 31 | colors256[idx];
|
||||
i += 2;
|
||||
|
||||
}
|
||||
|
|
@ -173,12 +207,7 @@ csi_sgr(struct terminal *term)
|
|||
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.foreground = (struct rgb) {
|
||||
r / 255.0,
|
||||
g / 255.0,
|
||||
b / 255.0,
|
||||
};
|
||||
term->vt.attrs.have_foreground = true;
|
||||
term->vt.attrs.foreground = 1 << 31 | r << 16 | g << 8 | b;
|
||||
i += 4;
|
||||
}
|
||||
|
||||
|
|
@ -194,12 +223,7 @@ csi_sgr(struct terminal *term)
|
|||
/* 6 - CS tolerance */
|
||||
/* 7 - color space associated with tolerance */
|
||||
|
||||
term->vt.attrs.foreground = (struct rgb) {
|
||||
r / 255.0,
|
||||
g / 255.0,
|
||||
b / 255.0,
|
||||
};
|
||||
term->vt.attrs.have_foreground = true;
|
||||
term->vt.attrs.foreground = 1 << 31 | r << 16 | g << 8 | b;
|
||||
} else {
|
||||
LOG_ERR("invalid CSI SGR sequence");
|
||||
abort();
|
||||
|
|
@ -214,8 +238,7 @@ csi_sgr(struct terminal *term)
|
|||
}
|
||||
|
||||
case 39:
|
||||
term->vt.attrs.foreground = term->foreground;
|
||||
term->vt.attrs.have_foreground = false;
|
||||
term->vt.attrs.foreground = 0;
|
||||
break;
|
||||
|
||||
/* Regular background colors */
|
||||
|
|
@ -227,8 +250,7 @@ csi_sgr(struct terminal *term)
|
|||
case 45:
|
||||
case 46:
|
||||
case 47:
|
||||
term->vt.attrs.background = colors_regular[param - 40];
|
||||
term->vt.attrs.have_background = true;
|
||||
term->vt.attrs.background = 1 << 31 | colors_regular[param - 40];
|
||||
break;
|
||||
|
||||
case 48: {
|
||||
|
|
@ -236,8 +258,7 @@ csi_sgr(struct terminal *term)
|
|||
term->vt.params.v[i + 1].value == 5)
|
||||
{
|
||||
size_t idx = term->vt.params.v[i + 2].value;
|
||||
term->vt.attrs.background = colors256[idx];
|
||||
term->vt.attrs.have_background = true;
|
||||
term->vt.attrs.background = 1 << 31 | colors256[idx];
|
||||
i += 2;
|
||||
}
|
||||
|
||||
|
|
@ -247,12 +268,7 @@ csi_sgr(struct terminal *term)
|
|||
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.background = (struct rgb) {
|
||||
r / 255.0,
|
||||
g / 255.0,
|
||||
b / 255.0,
|
||||
};
|
||||
term->vt.attrs.have_background = true;
|
||||
term->vt.attrs.background = 1 << 31 | r << 16 | g << 8 | b;
|
||||
i += 4;
|
||||
|
||||
}
|
||||
|
|
@ -269,12 +285,7 @@ csi_sgr(struct terminal *term)
|
|||
/* 6 - CS tolerance */
|
||||
/* 7 - color space associated with tolerance */
|
||||
|
||||
term->vt.attrs.background = (struct rgb) {
|
||||
r / 255.0,
|
||||
g / 255.0,
|
||||
b / 255.0,
|
||||
};
|
||||
term->vt.attrs.have_background = true;
|
||||
term->vt.attrs.background = 1 << 31 | r << 16 | g << 8 | b;
|
||||
} else {
|
||||
LOG_ERR("invalid CSI SGR sequence");
|
||||
abort();
|
||||
|
|
@ -289,8 +300,7 @@ csi_sgr(struct terminal *term)
|
|||
break;
|
||||
}
|
||||
case 49:
|
||||
term->vt.attrs.background = term->background;
|
||||
term->vt.attrs.have_background = false;
|
||||
term->vt.attrs.background = 0;
|
||||
break;
|
||||
|
||||
/* Bright foreground colors */
|
||||
|
|
@ -302,8 +312,7 @@ csi_sgr(struct terminal *term)
|
|||
case 95:
|
||||
case 96:
|
||||
case 97:
|
||||
term->vt.attrs.foreground = colors_bright[param - 90];
|
||||
term->vt.attrs.have_foreground = true;
|
||||
term->vt.attrs.foreground = 1 << 31 | colors_bright[param - 90];
|
||||
break;
|
||||
|
||||
/* Regular background colors */
|
||||
|
|
@ -315,8 +324,7 @@ csi_sgr(struct terminal *term)
|
|||
case 105:
|
||||
case 106:
|
||||
case 107:
|
||||
term->vt.attrs.background = colors_bright[param - 100];
|
||||
term->vt.attrs.have_background = true;
|
||||
term->vt.attrs.background = 1 << 31 | colors_bright[param - 100];
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue