From 8b199fa81546f7d08e9edbd7ae5968462492cb74 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sun, 5 Jun 2016 02:09:43 -0400 Subject: move dirty tracking to individual cells --- libvt100 | 2 +- src/display.c | 84 ++++++++++++++++++++++++++++++++--------------------------- 2 files changed, 47 insertions(+), 39 deletions(-) diff --git a/libvt100 b/libvt100 index bd9fc2b..4c7f37b 160000 --- a/libvt100 +++ b/libvt100 @@ -1 +1 @@ -Subproject commit bd9fc2ba0396f04df399c1f685aacced84128518 +Subproject commit 4c7f37b890d4201423987bedb7b9b42b033f360c diff --git a/src/display.c b/src/display.c index 92dfab3..0ee38fe 100644 --- a/src/display.c +++ b/src/display.c @@ -67,53 +67,58 @@ void runes_display_draw_screen(RunesTerm *t) RunesDisplay *display = t->display; int r, rows; - if (t->scr->dirty || display->dirty) { - if (t->scr->dirty) { - display->has_selection = 0; - } - - cairo_push_group(display->cr); + cairo_push_group(display->cr); + + /* XXX quite inefficient */ + rows = t->scr->grid->max.row; + for (r = 0; r < rows; ++r) { + int c = 0, cols = t->scr->grid->max.col; + int vr = r + t->scr->grid->row_top - display->row_visible_offset; + int start = c; + struct vt100_cell *cell = NULL, *prev_cell = NULL; + GPtrArray *cells; + + cells = g_ptr_array_new(); + + while (c < cols) { + cell = &t->scr->grid->rows[vr].cells[c]; + if (display->dirty) { + cell->was_drawn = 0; + } - /* XXX quite inefficient */ - rows = t->scr->grid->max.row; - for (r = 0; r < rows; ++r) { - int c = 0, cols = t->scr->grid->max.col; - int vr = r + t->scr->grid->row_top - display->row_visible_offset; - int start = c; - struct vt100_cell *cell = NULL, *prev_cell = NULL; - GPtrArray *cells; - - cells = g_ptr_array_new(); - - while (c < cols) { - cell = &t->scr->grid->rows[vr].cells[c]; - - if (!runes_display_continue_string(prev_cell, cell)) { - runes_display_draw_string( - t, r, start, c - start, - (struct vt100_cell **)cells->pdata, cells->len); - g_ptr_array_set_size(cells, 0); - start = c; - } - g_ptr_array_add(cells, cell); - - c += cell->is_wide ? 2 : 1; - prev_cell = cell; + if (!runes_display_continue_string(prev_cell, cell)) { + display->has_selection = 0; + runes_display_draw_string( + t, r, start, c - start, + (struct vt100_cell **)cells->pdata, cells->len); + g_ptr_array_set_size(cells, 0); + start = c; } - runes_display_draw_string( - t, r, start, cols - start, - (struct vt100_cell **)cells->pdata, cells->len); + g_ptr_array_add(cells, cell); + + c += cell->is_wide ? 2 : 1; + prev_cell = cell; - g_ptr_array_unref(cells); + if (cell->was_drawn) { + g_ptr_array_set_size(cells, 0); + start = c; + } + else { + cell->was_drawn = 1; + } } + runes_display_draw_string( + t, r, start, cols - start, + (struct vt100_cell **)cells->pdata, cells->len); - cairo_pattern_destroy(display->buffer); - display->buffer = cairo_pop_group(display->cr); + g_ptr_array_unref(cells); } + cairo_pattern_destroy(display->buffer); + display->buffer = cairo_pop_group(display->cr); + runes_display_repaint_screen(t); - t->scr->dirty = 0; display->dirty = 0; } @@ -220,6 +225,9 @@ static int runes_display_continue_string( if (!old) { return 1; } + if (new->was_drawn) { + return old->was_drawn; + } if (!old->len || !new->len) { return 0; } -- cgit v1.2.3