From 9682e15deb2037b4da2b9796be81bd3f80e1a153 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Tue, 2 Jul 2019 22:18:25 +0200 Subject: [PATCH] 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. --- terminal.c | 12 ++++++++++++ terminal.h | 1 + vt.c | 6 +----- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/terminal.c b/terminal.c index f11ddad6..25e1246e 100644 --- a/terminal.c +++ b/terminal.c @@ -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 diff --git a/terminal.h b/terminal.h index 4efaab9f..66f6bde0 100644 --- a/terminal.h +++ b/terminal.h @@ -66,6 +66,7 @@ struct grid { int offset; struct cell *cells; + struct cell *cur_line; tll(struct damage) damage; tll(struct damage) scroll_damage; diff --git a/vt.c b/vt.c index 5d04008b..f2d85d4b 100644 --- a/vt.c +++ b/vt.c @@ -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) {