aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2016-06-05 02:09:43 -0400
committerJesse Luehrs <doy@tozt.net>2016-06-05 02:09:43 -0400
commit8b199fa81546f7d08e9edbd7ae5968462492cb74 (patch)
tree2b7e1603d292755c35d57121e7621dd6ceb811ba
parent827846b76373196c1d6f746c305f487bc29a0177 (diff)
downloadrunes-dirty-cells-take-2.tar.gz
runes-dirty-cells-take-2.zip
move dirty tracking to individual cellsdirty-cells-take-2
m---------libvt1000
-rw-r--r--src/display.c84
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;
}