From 0ee1072cd93969ce37071942bfe3241ad3e63910 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos Date: Thu, 27 Jun 2013 14:54:50 +0200 Subject: libview: Use a larger damage area to redraw selections Depending on the zoom level the area actually drawn by cairo can be a bit larger than the selected region due to rounding errors or pixel alignment. We use the selected region to build the damage area to invalidate when drawing selections which in many cases is not large enough. This causes that sometimes when removing a selections some small rectangles keep drawn because they are not redrawn. To avoid this we grow the damage area computed from selected regions. origin commit: https://git.gnome.org/browse/evince/commit/?h=gnome-3-10&id=a497fb4 --- libview/ev-view.c | 52 +++++++++++++++++++++++++--------------------------- 1 file changed, 25 insertions(+), 27 deletions(-) (limited to 'libview/ev-view.c') diff --git a/libview/ev-view.c b/libview/ev-view.c index e8f85957..0728bc41 100644 --- a/libview/ev-view.c +++ b/libview/ev-view.c @@ -7603,27 +7603,6 @@ merge_selection_region (EvView *view, * have changed */ region = cairo_region_copy (old_sel->covered_region); cairo_region_union (region, new_sel->covered_region); - - if (cairo_region_is_empty (region)) { - cairo_region_destroy (region); - region = NULL; - } else { - gint num_rectangles = cairo_region_num_rectangles (region); - GdkRectangle r; - - /* We need to make the damage region a little bigger - * because the edges of the old selection might change - */ - cairo_region_get_rectangle (region, 0, &r); - r.x -= 5; - r.width = 5; - cairo_region_union_rectangle (region, &r); - - cairo_region_get_rectangle (region, num_rectangles - 1, &r); - r.x += r.width; - r.width = 5; - cairo_region_union_rectangle (region, &r); - } } } else if (old_sel->covered_region) { region = cairo_region_copy (old_sel->covered_region); @@ -7644,15 +7623,34 @@ merge_selection_region (EvView *view, /* Redraw the damaged region! */ if (region) { - GdkRectangle page_area; - GtkBorder border; + GdkRectangle page_area; + GtkBorder border; + cairo_region_t *damage_region; + gint i, n_rects; ev_view_get_page_extents (view, cur_page, &page_area, &border); - cairo_region_translate (region, - page_area.x + border.left - view->scroll_x, - page_area.y + border.top - view->scroll_y); - gdk_window_invalidate_region (gtk_widget_get_window (GTK_WIDGET (view)), region, TRUE); + + damage_region = cairo_region_create (); + /* Translate the region and grow it 2 pixels because for some zoom levels + * the area actually drawn by cairo is larger than the selected region, due + * to rounding errors or pixel alignment. + */ + n_rects = cairo_region_num_rectangles (region); + for (i = 0; i < n_rects; i++) { + cairo_rectangle_int_t rect; + + cairo_region_get_rectangle (region, i, &rect); + rect.x += page_area.x + border.left - view->scroll_x - 2; + rect.y += page_area.y + border.top - view->scroll_y - 2; + rect.width += 4; + rect.height += 4; + cairo_region_union_rectangle (damage_region, &rect); + } cairo_region_destroy (region); + + gdk_window_invalidate_region (gtk_widget_get_window (GTK_WIDGET (view)), + damage_region, TRUE); + cairo_region_destroy (damage_region); } } -- cgit v1.2.1