summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garcia Campos <[email protected]>2013-06-27 14:54:50 +0200
committerraveit65 <[email protected]>2017-09-06 18:25:34 +0200
commit0ee1072cd93969ce37071942bfe3241ad3e63910 (patch)
tree34b6efbd81358eab9c3a8d60a8f0db6073c48c6c
parent88d064b76c75c2d33b744c9d18e094dcb47d7c97 (diff)
downloadatril-0ee1072cd93969ce37071942bfe3241ad3e63910.tar.bz2
atril-0ee1072cd93969ce37071942bfe3241ad3e63910.tar.xz
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
-rw-r--r--libview/ev-view.c52
1 files changed, 25 insertions, 27 deletions
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);
}
}