summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2014-03-04 08:15:35 -0500
committerPaul Davis <paul@linuxaudiosystems.com>2014-03-04 21:58:16 -0500
commitfee026c5ef7107d5d594159f5ece5917041591f7 (patch)
tree836a13f964f3d3a03b4b7c9c45f3b4e986fecb05
parent1c839ed541812f3867a31ff0f8a077a688784c51 (diff)
break down GdkEventExpose into distinct rectangles for canvas expose rather than drawing the entire region as a single rect
-rw-r--r--libs/canvas/canvas.cc15
1 files changed, 13 insertions, 2 deletions
diff --git a/libs/canvas/canvas.cc b/libs/canvas/canvas.cc
index 7a1c9ed1f8..72ad4ab035 100644
--- a/libs/canvas/canvas.cc
+++ b/libs/canvas/canvas.cc
@@ -607,9 +607,20 @@ bool
GtkCanvas::on_expose_event (GdkEventExpose* ev)
{
Cairo::RefPtr<Cairo::Context> cairo_context = get_window()->create_cairo_context ();
- Rect area (ev->area.x, ev->area.y, ev->area.x + ev->area.width, ev->area.y + ev->area.height);
- render (area, cairo_context);
+ /* break into regions */
+
+ GdkRectangle *rects;
+ gint n_rects;
+
+ gdk_region_get_rectangles (ev->region, &rects, &n_rects);
+
+ for (gint i = 0; i < n_rects; ++i) {
+ Rect area (rects[i].x, rects[i].y, rects[i].x + rects[i].width, rects[i].y + rects[i].height);
+ render (area, cairo_context);
+ }
+
+ g_free (rects);
return true;
}