Only call Gtk::Widget::queue_draw_area in canvas when item and visible area intersect
authorTim Mayberry <mojofunk@gmail.com>
Sat, 1 Apr 2017 13:33:16 +0000 (23:33 +1000)
committerTim Mayberry <mojofunk@gmail.com>
Sun, 25 Jun 2017 22:40:47 +0000 (08:40 +1000)
Refactor GtkCanvas::request_redraw to use Rect::intersection

libs/canvas/canvas.cc

index baa10f9cf7740f4e6f901b1c7d7bda693afeb887..7415478b6077887d427db291a5053058f2cc331c 100644 (file)
@@ -1197,19 +1197,19 @@ GtkCanvas::request_redraw (Rect const & request)
                return;
        }
 
-       Rect real_area;
-
-       Coord const w = width ();
-       Coord const h = height ();
-
        /* clamp area requested to actual visible window */
 
-       real_area.x0 = max (0.0, min (w, request.x0));
-       real_area.x1 = max (0.0, min (w, request.x1));
-       real_area.y0 = max (0.0, min (h, request.y0));
-       real_area.y1 = max (0.0, min (h, request.y1));
+       Rect real_area = request.intersection (visible_area());
+
+       if (real_area) {
+               if (real_area.width () && real_area.height ()) {
+                       // Item intersects with visible canvas area
+                       queue_draw_area (real_area.x0, real_area.y0, real_area.width(), real_area.height());
+               }
 
-       queue_draw_area (real_area.x0, real_area.y0, real_area.width(), real_area.height());
+       } else {
+               // Item does not intersect with visible canvas area
+       }
 }
 
 /** Called to request that we try to get a particular size for ourselves.