mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-04-05 07:15:30 -04:00
term: performance: use a bitfield to track which ascii printer to use
The things affecting which ASCII printer we use have grown... Instead of checking everything inside term_update_ascii_printer(), use a bitfield. Anything affecting the printer used, must now set a bit in this bitfield. This makes term_update_ascii_printer() much faster, since all it needs to do is check if the bitfield is zero or not.
This commit is contained in:
parent
22302d8bcc
commit
48cf57818d
5 changed files with 63 additions and 13 deletions
19
csi.c
19
csi.c
|
|
@ -33,13 +33,12 @@ static void
|
||||||
sgr_reset(struct terminal *term)
|
sgr_reset(struct terminal *term)
|
||||||
{
|
{
|
||||||
/* TODO: can we drop this check? */
|
/* TODO: can we drop this check? */
|
||||||
const enum curly_style curly_style = term->vt.curly.style;
|
|
||||||
|
|
||||||
memset(&term->vt.attrs, 0, sizeof(term->vt.attrs));
|
memset(&term->vt.attrs, 0, sizeof(term->vt.attrs));
|
||||||
memset(&term->vt.curly, 0, sizeof(term->vt.curly));
|
memset(&term->vt.curly, 0, sizeof(term->vt.curly));
|
||||||
|
|
||||||
if (unlikely(curly_style > CURLY_SINGLE))
|
term->bits_affecting_ascii_printer.curly_style = false;
|
||||||
term_update_ascii_printer(term);
|
term->bits_affecting_ascii_printer.curly_color = false;
|
||||||
|
term_update_ascii_printer(term);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *
|
static const char *
|
||||||
|
|
@ -107,6 +106,7 @@ csi_sgr(struct terminal *term)
|
||||||
case CURLY_NONE:
|
case CURLY_NONE:
|
||||||
term->vt.attrs.underline = false;
|
term->vt.attrs.underline = false;
|
||||||
term->vt.curly.style = CURLY_NONE;
|
term->vt.curly.style = CURLY_NONE;
|
||||||
|
term->bits_affecting_ascii_printer.curly_style = false;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CURLY_SINGLE:
|
case CURLY_SINGLE:
|
||||||
|
|
@ -114,7 +114,9 @@ csi_sgr(struct terminal *term)
|
||||||
case CURLY_CURLY:
|
case CURLY_CURLY:
|
||||||
case CURLY_DOTTED:
|
case CURLY_DOTTED:
|
||||||
case CURLY_DASHED:
|
case CURLY_DASHED:
|
||||||
term->vt.curly.style = style; break;
|
term->vt.curly.style = style;
|
||||||
|
term->bits_affecting_ascii_printer.curly_style =
|
||||||
|
style > CURLY_SINGLE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -134,6 +136,7 @@ csi_sgr(struct terminal *term)
|
||||||
case 24: {
|
case 24: {
|
||||||
term->vt.attrs.underline = false;
|
term->vt.attrs.underline = false;
|
||||||
term->vt.curly.style = CURLY_NONE;
|
term->vt.curly.style = CURLY_NONE;
|
||||||
|
term->bits_affecting_ascii_printer.curly_style = false;
|
||||||
term_update_ascii_printer(term);
|
term_update_ascii_printer(term);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -236,6 +239,7 @@ csi_sgr(struct terminal *term)
|
||||||
if (unlikely(param == 58)) {
|
if (unlikely(param == 58)) {
|
||||||
term->vt.curly.color_src = src;
|
term->vt.curly.color_src = src;
|
||||||
term->vt.curly.color = color;
|
term->vt.curly.color = color;
|
||||||
|
term->bits_affecting_ascii_printer.curly_color = true;
|
||||||
term_update_ascii_printer(term);
|
term_update_ascii_printer(term);
|
||||||
} else if (param == 38) {
|
} else if (param == 38) {
|
||||||
term->vt.attrs.fg_src = src;
|
term->vt.attrs.fg_src = src;
|
||||||
|
|
@ -272,6 +276,7 @@ csi_sgr(struct terminal *term)
|
||||||
case 59:
|
case 59:
|
||||||
term->vt.curly.color_src = COLOR_DEFAULT;
|
term->vt.curly.color_src = COLOR_DEFAULT;
|
||||||
term->vt.curly.color = 0;
|
term->vt.curly.color = 0;
|
||||||
|
term->bits_affecting_ascii_printer.curly_color = false;
|
||||||
term_update_ascii_printer(term);
|
term_update_ascii_printer(term);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
@ -527,6 +532,9 @@ decset_decrst(struct terminal *term, unsigned param, bool enable)
|
||||||
tll_free(term->alt.scroll_damage);
|
tll_free(term->alt.scroll_damage);
|
||||||
term_damage_view(term);
|
term_damage_view(term);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
term->bits_affecting_ascii_printer.sixels =
|
||||||
|
tll_length(term->grid->sixel_images) > 0;
|
||||||
term_update_ascii_printer(term);
|
term_update_ascii_printer(term);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
@ -1165,6 +1173,7 @@ csi_dispatch(struct terminal *term, uint8_t final)
|
||||||
if (param == 4) {
|
if (param == 4) {
|
||||||
/* Insertion Replacement Mode (IRM) */
|
/* Insertion Replacement Mode (IRM) */
|
||||||
term->insert_mode = sm;
|
term->insert_mode = sm;
|
||||||
|
term->bits_affecting_ascii_printer.insert_mode = sm;
|
||||||
term_update_ascii_printer(term);
|
term_update_ascii_printer(term);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
11
sixel.c
11
sixel.c
|
|
@ -420,6 +420,8 @@ sixel_scroll_up(struct terminal *term, int rows)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
term->bits_affecting_ascii_printer.sixels =
|
||||||
|
tll_length(term->grid->sixel_images) > 0;
|
||||||
term_update_ascii_printer(term);
|
term_update_ascii_printer(term);
|
||||||
verify_sixels(term);
|
verify_sixels(term);
|
||||||
}
|
}
|
||||||
|
|
@ -444,6 +446,8 @@ sixel_scroll_down(struct terminal *term, int rows)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
term->bits_affecting_ascii_printer.sixels =
|
||||||
|
tll_length(term->grid->sixel_images) > 0;
|
||||||
term_update_ascii_printer(term);
|
term_update_ascii_printer(term);
|
||||||
verify_sixels(term);
|
verify_sixels(term);
|
||||||
}
|
}
|
||||||
|
|
@ -852,6 +856,8 @@ sixel_overwrite_by_rectangle(
|
||||||
} else
|
} else
|
||||||
_sixel_overwrite_by_rectangle(term, start, col, height, width, NULL, NULL);
|
_sixel_overwrite_by_rectangle(term, start, col, height, width, NULL, NULL);
|
||||||
|
|
||||||
|
term->bits_affecting_ascii_printer.sixels =
|
||||||
|
tll_length(term->grid->sixel_images) > 0;
|
||||||
term_update_ascii_printer(term);
|
term_update_ascii_printer(term);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -908,6 +914,8 @@ sixel_overwrite_by_row(struct terminal *term, int _row, int col, int width)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
term->bits_affecting_ascii_printer.sixels =
|
||||||
|
tll_length(term->grid->sixel_images) > 0;
|
||||||
term_update_ascii_printer(term);
|
term_update_ascii_printer(term);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1387,6 +1395,9 @@ sixel_unhook(struct terminal *term)
|
||||||
LOG_DBG("you now have %zu sixels in current grid",
|
LOG_DBG("you now have %zu sixels in current grid",
|
||||||
tll_length(term->grid->sixel_images));
|
tll_length(term->grid->sixel_images));
|
||||||
|
|
||||||
|
|
||||||
|
term->bits_affecting_ascii_printer.sixels =
|
||||||
|
tll_length(term->grid->sixel_images) > 0;
|
||||||
term_update_ascii_printer(term);
|
term_update_ascii_printer(term);
|
||||||
render_refresh(term);
|
render_refresh(term);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
23
terminal.c
23
terminal.c
|
|
@ -2023,6 +2023,7 @@ term_reset(struct terminal *term, bool hard)
|
||||||
term_ime_enable(term);
|
term_ime_enable(term);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
term->bits_affecting_ascii_printer.value = 0;
|
||||||
term_update_ascii_printer(term);
|
term_update_ascii_printer(term);
|
||||||
|
|
||||||
if (!hard)
|
if (!hard)
|
||||||
|
|
@ -3021,6 +3022,9 @@ term_restore_cursor(struct terminal *term, const struct cursor *cursor)
|
||||||
|
|
||||||
term->vt.attrs = term->vt.saved_attrs;
|
term->vt.attrs = term->vt.saved_attrs;
|
||||||
term->charsets = term->saved_charsets;
|
term->charsets = term->saved_charsets;
|
||||||
|
|
||||||
|
term->bits_affecting_ascii_printer.charset =
|
||||||
|
term->charsets.set[term->charsets.selected] != CHARSET_ASCII;
|
||||||
term_update_ascii_printer(term);
|
term_update_ascii_printer(term);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3801,21 +3805,21 @@ ascii_printer_single_shift(struct terminal *term, char32_t wc)
|
||||||
{
|
{
|
||||||
ascii_printer_generic(term, wc);
|
ascii_printer_generic(term, wc);
|
||||||
term->charsets.selected = term->charsets.saved;
|
term->charsets.selected = term->charsets.saved;
|
||||||
|
|
||||||
|
term->bits_affecting_ascii_printer.charset =
|
||||||
|
term->charsets.set[term->charsets.selected] != CHARSET_ASCII;
|
||||||
term_update_ascii_printer(term);
|
term_update_ascii_printer(term);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
term_update_ascii_printer(struct terminal *term)
|
term_update_ascii_printer(struct terminal *term)
|
||||||
{
|
{
|
||||||
|
_Static_assert(sizeof(term->bits_affecting_ascii_printer) == sizeof(uint8_t), "bad size");
|
||||||
|
|
||||||
void (*new_printer)(struct terminal *term, char32_t wc) =
|
void (*new_printer)(struct terminal *term, char32_t wc) =
|
||||||
unlikely(tll_length(term->grid->sixel_images) > 0 ||
|
unlikely(term->bits_affecting_ascii_printer.value != 0)
|
||||||
term->vt.osc8.uri != NULL ||
|
? &ascii_printer_generic
|
||||||
term->vt.curly.style > CURLY_SINGLE ||
|
: &ascii_printer_fast;
|
||||||
term->vt.curly.color_src != COLOR_DEFAULT ||
|
|
||||||
term->charsets.set[term->charsets.selected] == CHARSET_GRAPHIC ||
|
|
||||||
term->insert_mode)
|
|
||||||
? &ascii_printer_generic
|
|
||||||
: &ascii_printer_fast;
|
|
||||||
|
|
||||||
#if defined(_DEBUG) && LOG_ENABLE_DBG
|
#if defined(_DEBUG) && LOG_ENABLE_DBG
|
||||||
if (term->ascii_printer != new_printer) {
|
if (term->ascii_printer != new_printer) {
|
||||||
|
|
@ -4108,6 +4112,8 @@ term_osc8_open(struct terminal *term, uint64_t id, const char *uri)
|
||||||
|
|
||||||
term->vt.osc8.id = id;
|
term->vt.osc8.id = id;
|
||||||
term->vt.osc8.uri = xstrdup(uri);
|
term->vt.osc8.uri = xstrdup(uri);
|
||||||
|
|
||||||
|
term->bits_affecting_ascii_printer.osc8 = true;
|
||||||
term_update_ascii_printer(term);
|
term_update_ascii_printer(term);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4117,6 +4123,7 @@ term_osc8_close(struct terminal *term)
|
||||||
free(term->vt.osc8.uri);
|
free(term->vt.osc8.uri);
|
||||||
term->vt.osc8.uri = NULL;
|
term->vt.osc8.uri = NULL;
|
||||||
term->vt.osc8.id = 0;
|
term->vt.osc8.id = 0;
|
||||||
|
term->bits_affecting_ascii_printer.osc8 = false;
|
||||||
term_update_ascii_printer(term);
|
term_update_ascii_printer(term);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
11
terminal.h
11
terminal.h
|
|
@ -393,6 +393,17 @@ struct terminal {
|
||||||
const struct config *conf;
|
const struct config *conf;
|
||||||
|
|
||||||
void (*ascii_printer)(struct terminal *term, char32_t c);
|
void (*ascii_printer)(struct terminal *term, char32_t c);
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
bool sixels:1;
|
||||||
|
bool osc8:1;
|
||||||
|
bool curly_style:1;
|
||||||
|
bool curly_color:1;
|
||||||
|
bool insert_mode:1;
|
||||||
|
bool charset:1;
|
||||||
|
};
|
||||||
|
uint8_t value;
|
||||||
|
} bits_affecting_ascii_printer;
|
||||||
|
|
||||||
pid_t slave;
|
pid_t slave;
|
||||||
int ptmx;
|
int ptmx;
|
||||||
|
|
|
||||||
12
vt.c
12
vt.c
|
|
@ -243,12 +243,16 @@ action_execute(struct terminal *term, uint8_t c)
|
||||||
case '\x0e':
|
case '\x0e':
|
||||||
/* SO - shift out */
|
/* SO - shift out */
|
||||||
term->charsets.selected = G1;
|
term->charsets.selected = G1;
|
||||||
|
term->bits_affecting_ascii_printer.charset =
|
||||||
|
term->charsets.set[term->charsets.selected] != CHARSET_ASCII;
|
||||||
term_update_ascii_printer(term);
|
term_update_ascii_printer(term);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '\x0f':
|
case '\x0f':
|
||||||
/* SI - shift in */
|
/* SI - shift in */
|
||||||
term->charsets.selected = G0;
|
term->charsets.selected = G0;
|
||||||
|
term->bits_affecting_ascii_printer.charset =
|
||||||
|
term->charsets.set[term->charsets.selected] != CHARSET_ASCII;
|
||||||
term_update_ascii_printer(term);
|
term_update_ascii_printer(term);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
@ -482,12 +486,16 @@ action_esc_dispatch(struct terminal *term, uint8_t final)
|
||||||
case 'n':
|
case 'n':
|
||||||
/* LS2 - Locking Shift 2 */
|
/* LS2 - Locking Shift 2 */
|
||||||
term->charsets.selected = G2;
|
term->charsets.selected = G2;
|
||||||
|
term->bits_affecting_ascii_printer.charset =
|
||||||
|
term->charsets.set[term->charsets.selected] != CHARSET_ASCII;
|
||||||
term_update_ascii_printer(term);
|
term_update_ascii_printer(term);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'o':
|
case 'o':
|
||||||
/* LS3 - Locking Shift 3 */
|
/* LS3 - Locking Shift 3 */
|
||||||
term->charsets.selected = G3;
|
term->charsets.selected = G3;
|
||||||
|
term->bits_affecting_ascii_printer.charset =
|
||||||
|
term->charsets.set[term->charsets.selected] != CHARSET_ASCII;
|
||||||
term_update_ascii_printer(term);
|
term_update_ascii_printer(term);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
@ -546,6 +554,8 @@ action_esc_dispatch(struct terminal *term, uint8_t final)
|
||||||
size_t idx = term->vt.private - '(';
|
size_t idx = term->vt.private - '(';
|
||||||
xassert(idx <= G3);
|
xassert(idx <= G3);
|
||||||
term->charsets.set[idx] = CHARSET_GRAPHIC;
|
term->charsets.set[idx] = CHARSET_GRAPHIC;
|
||||||
|
term->bits_affecting_ascii_printer.charset =
|
||||||
|
term->charsets.set[term->charsets.selected] != CHARSET_ASCII;
|
||||||
term_update_ascii_printer(term);
|
term_update_ascii_printer(term);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -554,6 +564,8 @@ action_esc_dispatch(struct terminal *term, uint8_t final)
|
||||||
size_t idx = term->vt.private - '(';
|
size_t idx = term->vt.private - '(';
|
||||||
xassert(idx <= G3);
|
xassert(idx <= G3);
|
||||||
term->charsets.set[idx] = CHARSET_ASCII;
|
term->charsets.set[idx] = CHARSET_ASCII;
|
||||||
|
term->bits_affecting_ascii_printer.charset =
|
||||||
|
term->charsets.set[term->charsets.selected] != CHARSET_ASCII;
|
||||||
term_update_ascii_printer(term);
|
term_update_ascii_printer(term);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue