From ae727e372abfb5cd516f1fbab0fff28499f7d02b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 27 Jun 2020 15:22:31 +0200 Subject: [PATCH] term: erasing characters now splits sixels instead of deleting them --- sixel.c | 34 ++++++++++++++++++++++------------ sixel.h | 4 ++++ terminal.c | 10 ++++------ 3 files changed, 30 insertions(+), 18 deletions(-) diff --git a/sixel.c b/sixel.c index 8a3a3859..62a165f9 100644 --- a/sixel.c +++ b/sixel.c @@ -334,14 +334,14 @@ _sixel_split_by_rectangle( } } -static void +void sixel_split_by_rectangle( - struct terminal *term, int _row, int col, int height, int width) + 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 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; @@ -356,14 +356,14 @@ sixel_split_by_rectangle( /* Row numbers are absolute */ static void -sixel_split_at_point(struct terminal *term, int row, int col) +_sixel_split_by_row(struct terminal *term, int row, int col, int width) { assert(col >= 0); assert(row >= 0); assert(row < term->grid->num_rows); assert(col >= 0); - assert(col < term->grid->num_cols); + assert(col + width <= term->grid->num_cols); if (likely(tll_length(term->grid->sixel_images) == 0)) return; @@ -378,10 +378,13 @@ sixel_split_at_point(struct terminal *term, int row, int col) if (row >= six_start && row <= six_end) { const int col_start = six->pos.col; - const int col_end = six->pos.col + six->cols; + const int col_end = six->pos.col + six->cols - 1; - if (col >= col_start && col < col_end) { - sixel_split(term, six, row, col, 1, 1); + if ((col <= col_start && col + width - 1 >= col_start) || + (col <= col_end && col + width - 1 >= col_end) || + (col >= col_start && col + width - 1 <= col_end)) + { + sixel_split(term, six, row, col, 1, width); sixel_erase(term, six); tll_remove(term->grid->sixel_images, it); } @@ -389,13 +392,20 @@ sixel_split_at_point(struct terminal *term, int row, int col) } } +void +sixel_split_by_row(struct terminal *term, int row, int col, int width) +{ + _sixel_split_by_row( + term, + (term->grid->offset + row) & (term->grid->num_rows - 1), + col, width); +} + void sixel_split_at_cursor(struct terminal *term) { - sixel_split_at_point( - term, - (term->grid->offset + term->grid->cursor.point.row) & (term->grid->num_rows - 1), - term->grid->cursor.point.col); + sixel_split_by_row( + term, term->grid->cursor.point.row, term->grid->cursor.point.col, 1); } void diff --git a/sixel.h b/sixel.h index 1d282e85..9db720a2 100644 --- a/sixel.h +++ b/sixel.h @@ -15,6 +15,10 @@ void sixel_destroy(struct sixel *sixel); /* Row numbers are relative to current grid offset */ void sixel_delete_in_range(struct terminal *term, int row_start, int row_end); void sixel_delete_at_row(struct terminal *term, int row); + +void sixel_split_by_rectangle( + struct terminal *term, int row, int col, int height, int width); +void sixel_split_by_row(struct terminal *term, int row, int col, int width); void sixel_split_at_cursor(struct terminal *term); void sixel_colors_report_current(struct terminal *term); diff --git a/terminal.c b/terminal.c index ba39792a..c41173a3 100644 --- a/terminal.c +++ b/terminal.c @@ -1599,9 +1599,7 @@ 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); + sixel_split_by_row(term, start->row, start->col, end->col - start->col + 1); return; } @@ -1609,14 +1607,14 @@ term_erase(struct terminal *term, const struct coord *start, const struct coord erase_cell_range( term, grid_row(term->grid, start->row), start->col, term->cols - 1); + sixel_split_by_row(term, start->row, start->col, term->cols - start->col); for (int r = start->row + 1; r < end->row; r++) erase_line(term, grid_row(term->grid, r)); + sixel_split_by_rectangle(term, start->row + 1, 0, end->row - start->row, term->cols); 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); + sixel_split_by_row(term, end->row, 0, end->col + 1); } int