diff options
author | Jesse Luehrs <doy@tozt.net> | 2016-06-05 02:09:43 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2016-06-05 02:09:43 -0400 |
commit | 8b199fa81546f7d08e9edbd7ae5968462492cb74 (patch) | |
tree | 2b7e1603d292755c35d57121e7621dd6ceb811ba | |
parent | 827846b76373196c1d6f746c305f487bc29a0177 (diff) | |
download | runes-dirty-cells-take-2.tar.gz runes-dirty-cells-take-2.zip |
move dirty tracking to individual cellsdirty-cells-take-2
m--------- | libvt100 | 0 | ||||
-rw-r--r-- | src/display.c | 84 |
2 files changed, 46 insertions, 38 deletions
diff --git a/libvt100 b/libvt100 -Subproject bd9fc2ba0396f04df399c1f685aacced8412851 +Subproject 4c7f37b890d4201423987bedb7b9b42b033f360 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; } |