From 0953ffd2d3aac63f5f88edc224ae4fc62a2da479 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 27 Jun 2020 14:43:29 +0200 Subject: [PATCH] sixel: delete/split: early(ier) exit when there aren't in sixel images Avoid unnecessary wrap checks if the sixel image list is empty. --- sixel.c | 25 ++++++++++++++++--------- terminal.c | 5 ++++- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/sixel.c b/sixel.c index e7e4ba8a..8a3a3859 100644 --- a/sixel.c +++ b/sixel.c @@ -118,9 +118,13 @@ sixel_delete_at_point(struct terminal *term, int row, int col) } } +/* TODO: remove */ void sixel_delete_at_row(struct terminal *term, int row) { + if (likely(tll_length(term->grid->sixel_images) == 0)) + return; + sixel_delete_at_point( term, (term->grid->offset + row) & (term->grid->num_rows - 1), -1); } @@ -135,12 +139,6 @@ _sixel_delete_in_range(struct terminal *term, int start, int end) assert(end >= 0); assert(end < term->grid->num_rows); - if (likely(tll_length(term->grid->sixel_images) == 0)) - return; - - if (start == end) - return sixel_delete_at_point(term, start, -1); - tll_foreach(term->grid->sixel_images, it) { struct sixel *six = &it->item; @@ -163,6 +161,15 @@ _sixel_delete_in_range(struct terminal *term, int start, int end) void sixel_delete_in_range(struct terminal *term, int _start, int _end) { + if (likely(tll_length(term->grid->sixel_images) == 0)) + return; + + if (_start == _end) { + /* Avoid expensive wrap calculation */ + return sixel_delete_at_point( + term, (term->grid->offset + _start) & (term->grid->num_rows - 1), -1); + } + assert(_end >= _start); const int lines = _end - _start + 1; const int start = (term->grid->offset + _start) & (term->grid->num_rows - 1); @@ -293,9 +300,6 @@ _sixel_split_by_rectangle( assert(col >= 0); assert(col + width <= term->grid->num_cols); - if (likely(tll_length(term->grid->sixel_images) == 0)) - return; - /* We don't handle rectangle wrapping around */ assert(row + height <= term->grid->num_rows); @@ -334,6 +338,9 @@ static void sixel_split_by_rectangle( struct terminal *term, int _row, int col, int height, int width) { + if (likely(tll_length(term->grid->sixel_images) == 0)) + return; + const int start = (term->grid->offset + _row) & (term->grid->num_rows - 1); const int end = (start + height - 1) & (term->grid->num_rows - 1); const bool wraps = end < start; diff --git a/terminal.c b/terminal.c index 01fd50be..ba39792a 100644 --- a/terminal.c +++ b/terminal.c @@ -1599,6 +1599,8 @@ term_erase(struct terminal *term, const struct coord *start, const struct coord if (start->row == end->row) { struct row *row = grid_row(term->grid, start->row); erase_cell_range(term, row, start->col, end->col); + + /* TODO: split instead */ sixel_delete_at_row(term, start->row); return; } @@ -1612,6 +1614,8 @@ term_erase(struct terminal *term, const struct coord *start, const struct coord erase_line(term, grid_row(term->grid, r)); erase_cell_range(term, grid_row(term->grid, end->row), 0, end->col); + + /* TODO: split instead */ sixel_delete_in_range(term, start->row, end->row); } @@ -2381,7 +2385,6 @@ term_print(struct terminal *term, wchar_t wc, int width) print_linewrap(term); print_insert(term, width); - //sixel_delete_at_cursor(term); sixel_split_at_cursor(term); /* *Must* get current cell *after* linewrap+insert */