From b2c4115f3e5b36ff04b2f7ff1af4d7bce787a16f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 1 May 2020 11:49:11 +0200 Subject: [PATCH] grid: add per-cell combining characters The data is *not* added to the cell struct, since that one is too performance critical. Instead, the data is added as a separate array in the row struct. This allows our performance critical code paths that e.g. clear cells to perform as before. --- grid.c | 6 +++++- terminal.h | 6 ++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/grid.c b/grid.c index 51d76191..9da36934 100644 --- a/grid.c +++ b/grid.c @@ -34,10 +34,13 @@ grid_row_alloc(int cols, bool initialize) if (initialize) { row->cells = calloc(cols, sizeof(row->cells[0])); + row->comb_chars = calloc(cols, sizeof(row->comb_chars[0])); for (size_t c = 0; c < cols; c++) row->cells[c].attrs.clean = 1; - } else + } else { row->cells = malloc(cols * sizeof(row->cells[0])); + row->comb_chars = malloc(cols * sizeof(row->comb_chars[0])); + } return row; } @@ -48,6 +51,7 @@ grid_row_free(struct row *row) if (row == NULL) return; + free(row->comb_chars); free(row->cells); free(row); } diff --git a/terminal.h b/terminal.h index 7152bc23..e653e9be 100644 --- a/terminal.h +++ b/terminal.h @@ -77,10 +77,16 @@ struct damage { int lines; }; +struct combining_chars { + uint8_t count; + wchar_t chars[5]; /* TODO: do we need this many? */ +}; + struct row { struct cell *cells; bool dirty; bool linebreak; + struct combining_chars *comb_chars; }; struct sixel {