term: "cache" pointer to current line

This adds a pointer to the first cell on the current line. This
pointer must be updated every time the row changes.

The advantage is mainly that PRINT doesn't have to call
grid_get_range(), which is fairly expensive.
This commit is contained in:
Daniel Eklöf 2019-07-02 22:18:25 +02:00
parent ed68eafdf0
commit 9682e15deb
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
3 changed files with 14 additions and 5 deletions

View file

@ -169,6 +169,12 @@ term_cursor_to(struct terminal *term, int row, int col)
term->cursor.linear = new_linear;
term->cursor.col = col;
term->cursor.row = row;
size_t len = term->cols;
term->grid->cur_line = grid_get_range(
term->grid, term->cursor.linear - col, &len);
assert(len == (size_t)term->cols);
}
void
@ -253,6 +259,12 @@ term_scroll_partial(struct terminal *term, struct scroll_region region, int rows
max(0, region.end - rows) * term->cols, 0, rows * term->cols);
term_damage_scroll(term, DAMAGE_SCROLL, region, rows);
size_t len = term->cols;
term->grid->cur_line = grid_get_range(
term->grid, term->cursor.linear - term->cursor.col, &len);
assert(len == (size_t)term->cols);
}
void

View file

@ -66,6 +66,7 @@ struct grid {
int offset;
struct cell *cells;
struct cell *cur_line;
tll(struct damage) damage;
tll(struct damage) scroll_damage;

6
vt.c
View file

@ -678,11 +678,7 @@ action(struct terminal *term, enum action action, uint8_t c)
term_cursor_to(term, term->cursor.row + 1, 0);
}
size_t cell_count = 1;
struct cell *cell = grid_get_range(
term->grid, term->cursor.linear, &cell_count);
assert(cell_count == 1);
struct cell *cell = &term->grid->cur_line[term->cursor.col];
term_damage_update(term, term->cursor.linear, 1);
if (term->vt.utf8.idx > 0) {