[vte/wip/egmont/bidi: 8/79] vte-26-invalidate_rows-v1.patch



commit bd07f5c6fd61ead335157ca4a0bb8f9061657076
Author: Egmont Koblinger <egmont gmail com>
Date:   Wed Sep 19 10:26:10 2018 +0200

    vte-26-invalidate_rows-v1.patch

 src/vte.cc         | 402 ++++++++++++-----------------------------------------
 src/vteinternal.hh |  18 +--
 src/vteseq.cc      |  33 ++---
 3 files changed, 108 insertions(+), 345 deletions(-)
---
diff --git a/src/vte.cc b/src/vte.cc
index a4825547..95940d29 100644
--- a/src/vte.cc
+++ b/src/vte.cc
@@ -229,33 +229,31 @@ Terminal::last_displayed_row() const
         return r;
 }
 
+/* start and end are inclusive, and might be in reversed order */
 void
-Terminal::invalidate_cells(vte::grid::column_t column_start,
-                                     int n_columns,
-                                     vte::grid::row_t row_start,
-                                     int n_rows)
+Terminal::invalidate_rows(vte::grid::row_t row_start,
+                          vte::grid::row_t row_end)
 {
        if (G_UNLIKELY (!widget_realized()))
                 return;
 
-        /* FIXMEchpe: == 0 is fine, but somehow sometimes we
-         * get an actual negative n_columns value passed!?
-         */
-        if (n_columns <= 0 || n_rows <= 0)
-                return;
-
-       if (m_invalidated_all) {
+        if (m_invalidated_all)
                return;
-       }
+
+        /* Swapping them here saves tons of MIN() and MAX() macros elsewhere. */
+        if (G_UNLIKELY (row_end < row_start)) {
+                auto tmp = row_start;
+                row_start = row_end;
+                row_end = tmp;
+        }
 
        _vte_debug_print (VTE_DEBUG_UPDATES,
-                       "Invalidating cells at (%ld,%ld)x(%d,%d).\n",
-                       column_start, row_start,
-                       n_columns, n_rows);
+                          "Invalidating rows %ld..%ld.\n",
+                          row_start, row_end);
        _vte_debug_print (VTE_DEBUG_WORK, "?");
 
-       if (n_columns == m_column_count &&
-            n_rows == m_row_count) {
+        // FIXMEegmont what if we're scrolled back and these are not the last rows?
+        if (row_end - row_start + 1 == m_row_count) {
                invalidate_all();
                return;
        }
@@ -265,12 +263,13 @@ Terminal::invalidate_cells(vte::grid::column_t column_start,
         * by multiplying by the size of a character cell.
         * Always include the extra pixel border and overlap pixel.
         */
-        rect.x = column_start * m_cell_width - 1;
-        int xend = (column_start + n_columns) * m_cell_width + 1;
+        // FIXMEegmont invalidate the left and right padding too
+        rect.x = -1;
+        int xend = m_column_count * m_cell_width + 1;
         rect.width = xend - rect.x;
 
         rect.y = row_to_pixel(row_start) - 1;
-        int yend = row_to_pixel(row_start + n_rows) + 1;
+        int yend = row_to_pixel(row_end + 1) + 1;
         rect.height = yend - rect.y;
 
        _vte_debug_print (VTE_DEBUG_UPDATES,
@@ -294,36 +293,18 @@ Terminal::invalidate_cells(vte::grid::column_t column_start,
        _vte_debug_print (VTE_DEBUG_WORK, "!");
 }
 
+/* Convenience method */
 void
-Terminal::invalidate_region(vte::grid::column_t scolumn,
-                                      vte::grid::column_t ecolumn,
-                                      vte::grid::row_t srow,
-                                      vte::grid::row_t erow,
-                                      bool block)
+Terminal::invalidate_row(vte::grid::row_t row)
 {
-       if (block || srow == erow) {
-               invalidate_cells(
-                               scolumn, ecolumn - scolumn + 1,
-                               srow, erow - srow + 1);
-       } else {
-               invalidate_cells(
-                               scolumn,
-                               m_column_count - scolumn,
-                               srow, 1);
-               invalidate_cells(
-                               0, m_column_count,
-                               srow + 1, erow - srow - 1);
-               invalidate_cells(
-                               0, ecolumn + 1,
-                               erow, 1);
-       }
+        invalidate_rows(row, row);
 }
 
 void
-Terminal::invalidate(vte::grid::span const& s,
-                               bool block)
+Terminal::invalidate(vte::grid::span const& s)
 {
-        invalidate_region(s.start_column(), s.end_column(), s.start_row(), s.end_row(), block);
+        invalidate_rows(s.start_row(),
+                        s.end_column() < 0 ? s.end_row() - 1 : s.end_row());
 }
 
 void
@@ -360,32 +341,6 @@ Terminal::invalidate_all()
        }
 }
 
-/* FIXMEchpe: remove this obsolete function. It became useless long ago
- * when we stopped moving window contents around on scrolling. */
-/* Scroll a rectangular region up or down by a fixed number of lines,
- * negative = up, positive = down. */
-void
-Terminal::scroll_region (long row,
-                                   long count,
-                                   long delta)
-{
-       if ((delta == 0) || (count == 0)) {
-               /* Shenanigans! */
-               return;
-       }
-
-       if (count >= m_row_count) {
-               /* We have to repaint the entire window. */
-               invalidate_all();
-       } else {
-               /* We have to repaint the area which is to be
-                * scrolled. */
-               invalidate_cells(
-                                    0, m_column_count,
-                                    row, count);
-       }
-}
-
 /* Find the row in the given position in the backscroll buffer. */
 // FIXMEchpe replace this with a method on VteRing
 VteRowData const*
@@ -512,46 +467,6 @@ Terminal::get_preedit_length(bool left_only)
        return i;
 }
 
-void
-Terminal::invalidate_cell(vte::grid::column_t col,
-                                    vte::grid::row_t row)
-{
-       int columns;
-       guint style;
-
-       if (G_UNLIKELY (!widget_realized()))
-                return;
-
-       if (m_invalidated_all) {
-               return;
-       }
-
-       columns = 1;
-       auto row_data = find_row_data(row);
-       if (row_data != NULL) {
-               const VteCell *cell;
-               cell = _vte_row_data_get (row_data, col);
-               if (cell != NULL) {
-                       while (cell->attr.fragment() && col> 0) {
-                               cell = _vte_row_data_get (row_data, --col);
-                       }
-                       columns = cell->attr.columns();
-                       style = _vte_draw_get_style(cell->attr.bold(), cell->attr.italic());
-                        if (cell->c != 0) {
-                                int right;
-                                _vte_draw_get_char_edges(m_draw, cell->c, columns, style, NULL, &right);
-                                columns = MAX(columns, howmany(right, m_cell_width));
-                       }
-               }
-       }
-
-       _vte_debug_print(VTE_DEBUG_UPDATES,
-                       "Invalidating cell at (%ld,%ld-%ld).\n",
-                       row, col, col + columns);
-
-        invalidate_cells(col, columns, row, 1);
-}
-
 void
 Terminal::invalidate_cursor_once(bool periodic)
 {
@@ -591,11 +506,9 @@ Terminal::invalidate_cursor_once(bool periodic)
                }
 
                _vte_debug_print(VTE_DEBUG_UPDATES,
-                               "Invalidating cursor at (%ld,%ld-%ld).\n",
-                               row, column, column + columns);
-               invalidate_cells(
-                                    column, columns,
-                                    row, 1);
+                                 "Invalidating cursor in row %ld.\n",
+                                 row);
+                invalidate_row(row);
        }
 }
 
@@ -830,7 +743,7 @@ void
 Terminal::deselect_all()
 {
        if (m_has_selection) {
-               gint sx, sy, ex, ey, extra;
+                gint sy, ey;
 
                _vte_debug_print(VTE_DEBUG_SELECTION,
                                "Deselecting all text.\n");
@@ -841,15 +754,9 @@ Terminal::deselect_all()
 
                emit_selection_changed();
 
-               sx = m_selection_start.col;
                sy = m_selection_start.row;
-               ex = m_selection_end.col;
                ey = m_selection_end.row;
-                extra = m_selection_block_mode ? (VTE_TAB_WIDTH_MAX - 1) : 0;
-               invalidate_region(
-                               MIN (sx, ex), MAX (sx, ex) + extra,
-                               MIN (sy, ey),   MAX (sy, ey),
-                               false);
+                invalidate_rows(sy, ey);
        }
 }
 
@@ -2623,9 +2530,7 @@ Terminal::cleanup_fragments(long start,
                         cell_end->c = ' ';
                         cell_end->attr.set_fragment(false);
                         cell_end->attr.set_columns(1);
-                        invalidate_cells(
-                                              end, 1,
-                                              m_screen->cursor.row, 1);
+                        invalidate_row(m_screen->cursor.row);
                 }
         }
 
@@ -2649,9 +2554,7 @@ Terminal::cleanup_fragments(long start,
                                                          "Cleaning CJK left half at %ld\n",
                                                          col);
                                         g_assert(start - col == 1);
-                                        invalidate_cells(
-                                                              col, 1,
-                                                              m_screen->cursor.row, 1);
+                                        invalidate_row(m_screen->cursor.row);
                                 }
                                 keep_going = FALSE;
                         }
@@ -2690,8 +2593,7 @@ Terminal::cursor_down(bool explicit_sequence)
                                 ring_insert(m_screen->cursor.row, false);
                                /* Force the areas below the region to be
                                 * redrawn -- they've moved. */
-                               scroll_region(start,
-                                                           end - start + 1, 1);
+                                invalidate_rows(start, end);
                                /* Force scroll. */
                                adjust_adjustments();
                        } else {
@@ -2701,11 +2603,7 @@ Terminal::cursor_down(bool explicit_sequence)
                                ring_remove(start);
                                ring_insert(end, true);
                                /* Update the display. */
-                               scroll_region(start,
-                                                          end - start + 1, -1);
-                               invalidate_cells(
-                                                     0, m_column_count,
-                                                     end - 2, 2);
+                                invalidate_rows(start, end);
                        }
                } else {
                        /* Scroll up with history. */
@@ -2939,10 +2837,8 @@ Terminal::insert_char(gunichar c,
 
                /* Always invalidate since we put the mark on the *previous* cell
                 * and the higher level code doesn't know this. */
-               invalidate_cells(
-                                     col - columns,
-                                     columns,
-                                     row_num, 1);
+                // FIXME could this be cleaned up now that we invalidate rows?
+                invalidate_row(row_num);
 
                goto done;
         } else {
@@ -2987,10 +2883,7 @@ Terminal::insert_char(gunichar c,
 
        /* Signal that this part of the window needs drawing. */
        if (G_UNLIKELY (invalidate_now)) {
-               invalidate_cells(
-                               col - columns,
-                               insert ? m_column_count : columns,
-                                m_screen->cursor.row, 1);
+                invalidate_row(m_screen->cursor.row);
        }
 
         m_screen->cursor.col = col;
@@ -3521,7 +3414,7 @@ Terminal::process_incoming()
        VteVisualPosition saved_cursor;
        gboolean saved_cursor_visible;
         VteCursorStyle saved_cursor_style;
-       GdkPoint bbox_topleft, bbox_bottomright;
+        vte::grid::row_t bbox_top, bbox_bottom;
        gboolean modified, bottom;
        gboolean invalidated_text;
        gboolean in_scroll_region;
@@ -3562,8 +3455,8 @@ Terminal::process_incoming()
        modified = FALSE;
        invalidated_text = FALSE;
 
-       bbox_bottomright.x = bbox_bottomright.y = -G_MAXINT;
-       bbox_topleft.x = bbox_topleft.y = G_MAXINT;
+        bbox_bottom = -G_MAXINT;
+        bbox_top = G_MAXINT;
 
         vte::parser::Sequence seq{m_parser};
 
@@ -3630,10 +3523,8 @@ Terminal::process_incoming()
                                 switch (rv) {
                                 case VTE_SEQ_GRAPHIC: {
 
-                                        bbox_topleft.x = MIN(bbox_topleft.x,
-                                                             m_screen->cursor.col);
-                                        bbox_topleft.y = MIN(bbox_topleft.y,
-                                                             m_screen->cursor.row);
+                                        bbox_top = MIN(bbox_top,
+                                                       m_screen->cursor.row);
 
                                         // does insert_char(c, false, false)
                                         GRAPHIC(seq);
@@ -3646,39 +3537,24 @@ Terminal::process_incoming()
                                                 m_line_wrapped = false;
                                                 /* line wrapped, correct bbox */
                                                 if (invalidated_text &&
-                                                    (m_screen->cursor.col > bbox_bottomright.x + 
VTE_CELL_BBOX_SLACK   ||
-                                                     m_screen->cursor.col < bbox_topleft.x - 
VTE_CELL_BBOX_SLACK       ||
-                                                     m_screen->cursor.row > bbox_bottomright.y + 
VTE_CELL_BBOX_SLACK   ||
-                                                     m_screen->cursor.row < bbox_topleft.y - 
VTE_CELL_BBOX_SLACK)) {
+                                                    (m_screen->cursor.row > bbox_bottom + 
VTE_CELL_BBOX_SLACK ||
+                                                     m_screen->cursor.row < bbox_top - VTE_CELL_BBOX_SLACK)) 
{
                                                         /* Clip off any part of the box which isn't already 
on-screen. */
-                                                        bbox_topleft.x = MAX(bbox_topleft.x, 0);
-                                                        bbox_topleft.y = MAX(bbox_topleft.y, top_row);
-                                                        bbox_bottomright.x = MIN(bbox_bottomright.x,
-                                                                                 m_column_count);
-                                                        /* lazily apply the +1 to the cursor_row */
-                                                        bbox_bottomright.y = MIN(bbox_bottomright.y + 1,
-                                                                                 bottom_row + 1);
-
-                                                        invalidate_cells(
-                                                                         bbox_topleft.x,
-                                                                         bbox_bottomright.x - bbox_topleft.x,
-                                                                         bbox_topleft.y,
-                                                                         bbox_bottomright.y - 
bbox_topleft.y);
-                                                        bbox_bottomright.x = bbox_bottomright.y = -G_MAXINT;
-                                                        bbox_topleft.x = bbox_topleft.y = G_MAXINT;
+                                                        bbox_top = MAX(bbox_top, top_row);
+                                                        bbox_bottom = MIN(bbox_bottom, bottom_row);
+
+                                                        invalidate_rows(bbox_top, bbox_bottom);
+                                                        bbox_bottom = -G_MAXINT;
+                                                        bbox_top = G_MAXINT;
 
                                                 }
-                                                bbox_topleft.x = MIN(bbox_topleft.x, 0);
-                                                bbox_topleft.y = MIN(bbox_topleft.y,
-                                                                     m_screen->cursor.row);
+                                                bbox_top = MIN(bbox_top,
+                                                               m_screen->cursor.row);
                                         }
                                         /* Add the cells over which we have moved to the region
                                          * which we need to refresh for the user. */
-                                        bbox_bottomright.x = MAX(bbox_bottomright.x,
-                                                                 m_screen->cursor.col);
-                                        /* cursor.row + 1 (defer until inv.) */
-                                        bbox_bottomright.y = MAX(bbox_bottomright.y,
-                                                                 m_screen->cursor.row);
+                                        bbox_bottom = MAX(bbox_bottom,
+                                                          m_screen->cursor.row);
                                         invalidated_text = TRUE;
 
                                         /* We *don't* emit flush pending signals here. */
@@ -3723,28 +3599,17 @@ Terminal::process_incoming()
                                          */
                                         if (invalidated_text &&
                                             ((new_in_scroll_region && !in_scroll_region) ||
-                                             (m_screen->cursor.col > bbox_bottomright.x + 
VTE_CELL_BBOX_SLACK ||
-                                              m_screen->cursor.col < bbox_topleft.x - VTE_CELL_BBOX_SLACK    
 ||
-                                              m_screen->cursor.row > bbox_bottomright.y + 
VTE_CELL_BBOX_SLACK ||
-                                              m_screen->cursor.row < bbox_topleft.y - VTE_CELL_BBOX_SLACK))) 
{
+                                             (m_screen->cursor.row > bbox_bottom + VTE_CELL_BBOX_SLACK ||
+                                              m_screen->cursor.row < bbox_top - VTE_CELL_BBOX_SLACK))) {
                                                 /* Clip off any part of the box which isn't already 
on-screen. */
-                                                bbox_topleft.x = MAX(bbox_topleft.x, 0);
-                                                bbox_topleft.y = MAX(bbox_topleft.y, top_row);
-                                                bbox_bottomright.x = MIN(bbox_bottomright.x,
-                                                                         m_column_count);
-                                                /* lazily apply the +1 to the cursor_row */
-                                                bbox_bottomright.y = MIN(bbox_bottomright.y + 1,
-                                                                         bottom_row + 1);
-
-                                                invalidate_cells(
-                                                                 bbox_topleft.x,
-                                                                 bbox_bottomright.x - bbox_topleft.x,
-                                                                 bbox_topleft.y,
-                                                                 bbox_bottomright.y - bbox_topleft.y);
+                                                bbox_top = MAX(bbox_top, top_row);
+                                                bbox_bottom = MIN(bbox_bottom, bottom_row);
+
+                                                invalidate_rows(bbox_top, bbox_bottom);
 
                                                 invalidated_text = FALSE;
-                                                bbox_bottomright.x = bbox_bottomright.y = -G_MAXINT;
-                                                bbox_topleft.x = bbox_topleft.y = G_MAXINT;
+                                                bbox_bottom = -G_MAXINT;
+                                                bbox_top = G_MAXINT;
                                         }
 
                                         in_scroll_region = new_in_scroll_region;
@@ -3799,19 +3664,10 @@ Terminal::process_incoming()
 
        if (invalidated_text) {
                /* Clip off any part of the box which isn't already on-screen. */
-               bbox_topleft.x = MAX(bbox_topleft.x, 0);
-                bbox_topleft.y = MAX(bbox_topleft.y, top_row);
-               bbox_bottomright.x = MIN(bbox_bottomright.x,
-                               m_column_count);
-               /* lazily apply the +1 to the cursor_row */
-               bbox_bottomright.y = MIN(bbox_bottomright.y + 1,
-                                bottom_row + 1);
+                bbox_top = MAX(bbox_top, top_row);
+                bbox_bottom = MIN(bbox_bottom, bottom_row);
 
-               invalidate_cells(
-                               bbox_topleft.x,
-                               bbox_bottomright.x - bbox_topleft.x,
-                               bbox_topleft.y,
-                               bbox_bottomright.y - bbox_topleft.y);
+                invalidate_rows(bbox_top, bbox_bottom);
        }
 
         // FIXMEchpe: also need to take into account if the number of columns the cursor 
@@ -3820,14 +3676,14 @@ Terminal::process_incoming()
             (saved_cursor.row != m_screen->cursor.row)) {
                /* invalidate the old and new cursor positions */
                if (saved_cursor_visible)
-                       invalidate_cell(saved_cursor.col, saved_cursor.row);
+                        invalidate_row(saved_cursor.row);
                invalidate_cursor_once();
                check_cursor_blink();
                /* Signal that the cursor moved. */
                queue_cursor_moved();
         } else if ((saved_cursor_visible != m_modes_private.DEC_TEXT_CURSOR()) ||
                    (saved_cursor_style != m_cursor_style)) {
-               invalidate_cell(saved_cursor.col, saved_cursor.row);
+                invalidate_row(saved_cursor.row);
                check_cursor_blink();
        }
 
@@ -5434,15 +5290,19 @@ Terminal::hyperlink_invalidate_and_get_bbox(vte::base::Ring::hyperlink_idx_t idx
         for (row = first_row; row < end_row; row++) {
                 rowdata = _vte_ring_index(m_screen->row_data, row);
                 if (rowdata != NULL) {
+                        bool do_invalidate_row = false;
                         for (col = 0; col < rowdata->len; col++) {
                                 if (G_UNLIKELY (rowdata->cells[col].attr.hyperlink_idx == idx)) {
-                                        invalidate_cells(col, 1, row, 1);
+                                        do_invalidate_row = true;
                                         top = MIN(top, row);
                                         bottom = MAX(bottom, row);
                                         left = MIN(left, col);
                                         right = MAX(right, col);
                                 }
                         }
+                        if (G_UNLIKELY (do_invalidate_row)) {
+                                invalidate_row(row);
+                        }
                 }
         }
 
@@ -6257,11 +6117,7 @@ Terminal::widget_paste(GdkAtom board)
 void
 Terminal::invalidate_selection()
 {
-        invalidate_region(m_selection_start.col,
-                          m_selection_end.col,
-                          m_selection_start.row,
-                          m_selection_end.row,
-                          m_selection_block_mode);
+        invalidate_rows(m_selection_start.row, m_selection_end.row);
 }
 
 /* Confine coordinates into the visible area. Padding is already subtracted. */
@@ -6728,72 +6584,19 @@ Terminal::extend_selection(long x,
        if (had_selection) {
 
                if (m_selection_block_mode) {
-                       /* Update the selection area diff in block mode. */
-
-                       /* The top band */
-                       invalidate_region(
-                                               MIN(sc->col, so->col),
-                                               MAX(ec->col, eo->col),
-                                               MIN(sc->row, so->row),
-                                               MAX(sc->row, so->row) - 1,
-                                               true);
-                       /* The bottom band */
-                       invalidate_region(
-                                               MIN(sc->col, so->col),
-                                               MAX(ec->col, eo->col),
-                                               MIN(ec->row, eo->row) + 1,
-                                               MAX(ec->row, eo->row),
-                                               true);
-                       /* The left band */
-                       invalidate_region(
-                                               MIN(sc->col, so->col),
-                                               MAX(sc->col, so->col) - 1 + (VTE_TAB_WIDTH_MAX - 1),
-                                               MIN(sc->row, so->row),
-                                               MAX(ec->row, eo->row),
-                                               true);
-                       /* The right band */
-                       invalidate_region(
-                                               MIN(ec->col, eo->col) + 1,
-                                               MAX(ec->col, eo->col) + (VTE_TAB_WIDTH_MAX - 1),
-                                               MIN(sc->row, so->row),
-                                               MAX(ec->row, eo->row),
-                                               true);
+                        /* Update the selection area diff in block mode.
+                         * We could optimize when the columns don't change, probably not worth it. */
+                        invalidate_rows(MIN(sc->row, so->row), MAX(ec->row, eo->row));
                } else {
                        /* Update the selection area diff in non-block mode. */
 
                        /* The before band */
-                       if (sc->row < so->row)
-                               invalidate_region(
-                                                       sc->col, so->col - 1,
-                                                       sc->row, so->row,
-                                                       false);
-                       else if (sc->row > so->row)
-                               invalidate_region(
-                                                       so->col, sc->col - 1,
-                                                       so->row, sc->row,
-                                                       false);
-                       else
-                               invalidate_region(
-                                                       MIN(sc->col, so->col), MAX(sc->col, so->col) - 1,
-                                                       sc->row, sc->row,
-                                                       true);
-
+                        // FIXMEegmont simplify these conditions when sc becomes a grid:coords.
+                        if (sc->row != so->row || sc->col != so->col)
+                                invalidate_rows(sc->row, so->row);
                        /* The after band */
-                       if (ec->row < eo->row)
-                               invalidate_region(
-                                                       ec->col + 1, eo->col,
-                                                       ec->row, eo->row,
-                                                       false);
-                       else if (ec->row > eo->row)
-                               invalidate_region(
-                                                       eo->col + 1, ec->col,
-                                                       eo->row, ec->row,
-                                                       false);
-                       else
-                               invalidate_region(
-                                                       MIN(ec->col, eo->col) + 1, MAX(ec->col, eo->col),
-                                                       ec->row, ec->row,
-                                                       true);
+                        if (ec->row != eo->row || ec->col != eo->col)
+                                invalidate_rows(ec->row, eo->row);
                }
        }
 
@@ -7871,6 +7674,7 @@ Terminal::Terminal(vte::platform::Widget* w,
        gtk_widget_set_redraw_on_allocate(m_widget, FALSE);
 
         m_invalidated_all = false;
+        // FIXMEegmont make this store row indices only, maybe convert to a bitmap
         m_update_rects = g_array_sized_new(FALSE /* zero terminated */,
                                            FALSE /* clear */,
                                            sizeof(cairo_rectangle_int_t),
@@ -8935,9 +8739,6 @@ void
 Terminal::draw_rows(VteScreen *screen_,
                               vte::grid::row_t start_row,
                               vte::grid::row_t end_row,
-                              vte::grid::column_t start_column,
-                              vte::grid::column_t end_column,
-                              gint start_x,
                               gint start_y,
                               gint column_width,
                               gint row_height)
@@ -8958,13 +8759,10 @@ Terminal::draw_rows(VteScreen *screen_,
 
         items = g_newa (struct _vte_draw_text_request, m_column_count);
 
-        /* Adjust for the absolute start of row. */
-       start_x -= start_column * column_width;
-
         /* Clear the background. */
         for (row = start_row, y = start_y; row < end_row; row++, y += row_height) {
                row_data = find_row_data(row);
-                i = j = start_column;
+                i = j = 0;
                 /* Walk the line. */
                 do {
                         /* Get the first cell's contents. */
@@ -8973,7 +8771,7 @@ Terminal::draw_rows(VteScreen *screen_,
                         selected = cell_is_selected(i, row);
                         determine_colors(cell, selected, &fore, &back, &deco);
 
-                        while (++j < end_column) {
+                        while (++j < m_column_count) {
                                 /* Retrieve the next cell. */
                                 cell = row_data ? _vte_row_data_get (row_data, j) : nullptr;
                                 /* Resolve attributes to colors where possible and
@@ -8990,7 +8788,7 @@ Terminal::draw_rows(VteScreen *screen_,
                                 rgb_from_index<8, 8, 8>(back, bg);
                                 _vte_draw_fill_rectangle (
                                                 m_draw,
-                                                start_x + i * column_width,
+                                                i * column_width,
                                                 y,
                                                 (j - i) * column_width,
                                                 row_height,
@@ -8999,14 +8797,10 @@ Terminal::draw_rows(VteScreen *screen_,
                         /* We'll need to continue at the first cell which didn't
                          * match the first one in this set. */
                         i = j;
-                } while (i < end_column);
+                } while (i < m_column_count);
         }
 
 
-        /* Render one more column to the left and right, to make sure CJKs are drawn correctly. */
-        start_column = MAX(start_column - 1, 0);
-        end_column = MIN(end_column + 1, m_column_count);
-
         /* Render the text. */
         for (row = start_row, y = start_y; row < end_row; row++, y += row_height) {
                 row_data = find_row_data(row);
@@ -9017,7 +8811,7 @@ Terminal::draw_rows(VteScreen *screen_,
 
                 /* Walk the line. */
                 item_count = 0;
-                for (col = start_column; col < end_column; col++) {
+                for (col = 0; col < m_column_count; col++) {
                         /* Get the character cell's contents. */
                         cell = _vte_row_data_get (row_data, col);
                         if (cell == NULL) {
@@ -9079,7 +8873,7 @@ Terminal::draw_rows(VteScreen *screen_,
                         g_assert_cmpint (item_count, <, m_column_count);
                         items[item_count].c = cell->c;
                         items[item_count].columns = cell->attr.columns();
-                        items[item_count].x = start_x + col * column_width;
+                        items[item_count].x = col * column_width;
                         items[item_count].y = y;
                         item_count++;
                 }
@@ -9133,7 +8927,6 @@ void
 Terminal::paint_area(GdkRectangle const* area)
 {
         vte::grid::row_t row, row_stop;
-        vte::grid::column_t col, col_stop;
 
         row = pixel_to_row(MAX(0, area->y));
         /* Both the value given by MIN() and row_stop are exclusive.
@@ -9144,30 +8937,22 @@ Terminal::paint_area(GdkRectangle const* area)
        if (row_stop <= row) {
                return;
        }
-       col = MAX(0, area->x / m_cell_width);
-       col_stop = MIN((area->width + area->x) / m_cell_width,
-                      m_column_count);
-       if (col_stop <= col) {
-               return;
-       }
        _vte_debug_print (VTE_DEBUG_UPDATES,
                        "paint_area"
                        "       (%d,%d)x(%d,%d) pixels,"
                        " (%ld,%ld)x(%ld,%ld) cells"
                        " [(%ld,%ld)x(%ld,%ld) pixels]\n",
                        area->x, area->y, area->width, area->height,
-                       col, row, col_stop - col, row_stop - row,
-                       col * m_cell_width,
+                        0L, row, m_column_count, row_stop - row,
+                        0L,
                        row * m_cell_height,
-                       (col_stop - col) * m_cell_width,
+                        m_column_count * m_cell_width,
                        (row_stop - row) * m_cell_height);
 
        /* Now we're ready to draw the text.  Iterate over the rows we
         * need to draw. */
        draw_rows(m_screen,
                              row, row_stop,
-                             col, col_stop,
-                             col * m_cell_width,
                              row_to_pixel(row),
                              m_cell_width,
                              m_cell_height);
@@ -10219,10 +10004,7 @@ Terminal::select_text(vte::grid::column_t start_col,
         widget_copy(VTE_SELECTION_PRIMARY, VTE_FORMAT_TEXT);
        emit_selection_changed();
 
-       invalidate_region(MIN (start_col, end_col), MAX (start_col, end_col),
-                          MIN (start_row, end_row), MAX (start_row, end_row),
-                          false);
-
+        invalidate_rows(start_row, end_row);
 }
 
 void
diff --git a/src/vteinternal.hh b/src/vteinternal.hh
index 4c2d09fb..6bb39548 100644
--- a/src/vteinternal.hh
+++ b/src/vteinternal.hh
@@ -671,14 +671,11 @@ public:
                          bool insert,
                          bool invalidate_now);
 
-        void invalidate(vte::grid::span const& s, bool block = false);
+        void invalidate_row(vte::grid::row_t row);
+        void invalidate_rows(vte::grid::row_t row_start,
+                             vte::grid::row_t row_end /* inclusive */);
+        void invalidate(vte::grid::span const& s);
         void invalidate_match_span();
-        void invalidate_cell(vte::grid::column_t column, vte::grid::row_t row);
-        void invalidate_cells(vte::grid::column_t sc, int cc,
-                              vte::grid::row_t sr, int rc);
-        void invalidate_region(vte::grid::column_t sc, vte::grid::column_t ec,
-                               vte::grid::row_t sr, vte::grid::row_t er,
-                               bool block = false);
         void invalidate_selection();
         void invalidate_all();
 
@@ -812,9 +809,6 @@ public:
         void draw_rows(VteScreen *screen,
                        vte::grid::row_t start_row,
                        long row_count,
-                       vte::grid::column_t start_column,
-                       long column_count,
-                       gint start_x,
                        gint start_y,
                        gint column_width,
                        gint row_height);
@@ -823,10 +817,6 @@ public:
         void start_autoscroll();
         void stop_autoscroll();
 
-        void scroll_region (long row,
-                            long count,
-                            long delta);
-
         void connect_pty_read();
         void disconnect_pty_read();
 
diff --git a/src/vteseq.cc b/src/vteseq.cc
index 58a9441b..01488efd 100644
--- a/src/vteseq.cc
+++ b/src/vteseq.cc
@@ -316,8 +316,7 @@ Terminal::clear_current_line()
                 _vte_row_data_fill (rowdata, &m_fill_defaults, m_column_count);
                rowdata->attr.soft_wrapped = 0;
                /* Repaint this row. */
-               invalidate_cells(0, m_column_count,
-                                 m_screen->cursor.row, 1);
+                invalidate_row(m_screen->cursor.row);
        }
 
        /* We've modified the display.  Make a note of it. */
@@ -341,7 +340,7 @@ Terminal::clear_above_current()
                         _vte_row_data_fill (rowdata, &m_fill_defaults, m_column_count);
                        rowdata->attr.soft_wrapped = 0;
                        /* Repaint the row. */
-                       invalidate_cells(0, m_column_count, i, 1);
+                        invalidate_row(i);
                }
        }
        /* We've modified the display.  Make a note of it. */
@@ -377,7 +376,7 @@ Terminal::scroll_text(vte::grid::row_t scroll_amount)
        }
 
        /* Update the display. */
-        scroll_region(start, end - start + 1, scroll_amount);
+        invalidate_rows(start, end);
 
        /* Adjust the scrollbars if necessary. */
         adjust_adjustments();
@@ -679,8 +678,7 @@ Terminal::clear_to_bol()
                }
        }
        /* Repaint this row. */
-        invalidate_cells(0, m_screen->cursor.col+1,
-                         m_screen->cursor.row, 1);
+        invalidate_row(m_screen->cursor.row);
 
        /* We've modified the display.  Make a note of it. */
         m_text_deleted_flag = TRUE;
@@ -735,8 +733,7 @@ Terminal::clear_below_current()
                }
                rowdata->attr.soft_wrapped = 0;
                /* Repaint this row. */
-               invalidate_cells(0, m_column_count,
-                                 i, 1);
+                invalidate_row(i);
        }
 
        /* We've modified the display.  Make a note of it. */
@@ -775,8 +772,7 @@ Terminal::clear_to_eol()
        }
        rowdata->attr.soft_wrapped = 0;
        /* Repaint this row. */
-       invalidate_cells(m_screen->cursor.col, m_column_count - m_screen->cursor.col,
-                         m_screen->cursor.row, 1);
+        invalidate_row(m_screen->cursor.row);
 }
 
 /*
@@ -908,8 +904,7 @@ Terminal::delete_character()
                        }
                         rowdata->attr.soft_wrapped = 0;
                        /* Repaint this row. */
-                        invalidate_cells(col, len - col,
-                                         m_screen->cursor.row, 1);
+                        invalidate_row(m_screen->cursor.row);
                }
        }
 
@@ -967,8 +962,7 @@ Terminal::erase_characters(long count)
                        }
                }
                /* Repaint this row. */
-                invalidate_cells(m_screen->cursor.col, count,
-                                 m_screen->cursor.row, 1);
+                invalidate_row(m_screen->cursor.row);
        }
 
        /* We've modified the display.  Make a note of it. */
@@ -1082,8 +1076,7 @@ Terminal::move_cursor_tab_forward(int count)
                 }
         }
 
-        invalidate_cells(m_screen->cursor.col, newcol - m_screen->cursor.col,
-                         m_screen->cursor.row, 1);
+        invalidate_row(m_screen->cursor.row);
         m_screen->cursor.col = newcol;
 }
 
@@ -1299,7 +1292,7 @@ Terminal::insert_lines(vte::grid::row_t param)
        }
         m_screen->cursor.col = 0;
        /* Update the display. */
-        scroll_region(row, end - row + 1, param);
+        invalidate_rows(row, end);
        /* Adjust the scrollbars if necessary. */
         adjust_adjustments();
        /* We've modified the display.  Make a note of it. */
@@ -1334,7 +1327,7 @@ Terminal::delete_lines(vte::grid::row_t param)
        }
         m_screen->cursor.col = 0;
        /* Update the display. */
-        scroll_region(row, end - row + 1, -param);
+        invalidate_rows(row, end);
        /* Adjust the scrollbars if necessary. */
         adjust_adjustments();
        /* We've modified the display.  Make a note of it. */
@@ -6651,9 +6644,7 @@ Terminal::RI(vte::parser::Sequence const& seq)
                ring_remove(end);
                ring_insert(start, true);
                /* Update the display. */
-               scroll_region(start, end - start + 1, 1);
-                invalidate_cells(0, m_column_count,
-                                 start, 2);
+                invalidate_rows(start, end);
        } else {
                /* Otherwise, just move the cursor up. */
                 m_screen->cursor.row--;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]