From a05a3d77490e30b4410045e0e685f8da8628a302 Mon Sep 17 00:00:00 2001 From: Alex Valavanis Date: Fri, 28 Dec 2012 01:51:10 +0000 Subject: Implement GTK+ 3 drawing for zoom correction ruler in preferences dialog (bzr r11995) --- src/display/sp-canvas.cpp | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) (limited to 'src/display') diff --git a/src/display/sp-canvas.cpp b/src/display/sp-canvas.cpp index 536c54609..af9647c9b 100644 --- a/src/display/sp-canvas.cpp +++ b/src/display/sp-canvas.cpp @@ -2203,16 +2203,12 @@ gint SPCanvasImpl::handleExpose(GtkWidget *widget, GdkEventExpose *event) return FALSE; } -#if GTK_CHECK_VERSION(3,0,0) - int n_rects = cairo_region_num_rectangles(event->region); -#else int n_rects = 0; GdkRectangle *rects = NULL; gdk_region_get_rectangles(event->region, &rects, &n_rects); if(rects == NULL) return FALSE; -#endif if (n_rects == 0) { @@ -2221,23 +2217,15 @@ gint SPCanvasImpl::handleExpose(GtkWidget *widget, GdkEventExpose *event) else { for (int i = 0; i < n_rects; i++) { -#if GTK_CHECK_VERSION(3,0,0) - cairo_rectangle_int_t rectangle; - cairo_region_get_rectangle(event->region, i, &rectangle); -#else - GdkRectangle rectangle = rects[i]; -#endif + GdkRectangle rectangle = rects[i]; Geom::IntRect r = Geom::IntRect::from_xywh( - rectangle.x + canvas->x0, rectangle.y + canvas->y0, - rectangle.width, rectangle.height); + rectangle.x + canvas->x0, rectangle.y + canvas->y0, + rectangle.width, rectangle.height); canvas->requestRedraw(r.left(), r.top(), r.right(), r.bottom()); } -#if !GTK_CHECK_VERSION(3,0,0) - g_free (rects); -#endif return FALSE; } } -- cgit v1.2.3 From b9d513c8fdea87faf1143fedd53664725e6f59ba Mon Sep 17 00:00:00 2001 From: Alex Valavanis Date: Sun, 30 Dec 2012 21:24:42 +0000 Subject: Speed up canvas item drawing for GTK+ 3 (bzr r11999) --- src/display/sp-canvas.cpp | 47 ++++++++++++++++++++--------------------------- 1 file changed, 20 insertions(+), 27 deletions(-) (limited to 'src/display') diff --git a/src/display/sp-canvas.cpp b/src/display/sp-canvas.cpp index af9647c9b..eb51860ab 100644 --- a/src/display/sp-canvas.cpp +++ b/src/display/sp-canvas.cpp @@ -291,7 +291,7 @@ public: #if GTK_CHECK_VERSION(3,0,0) static gboolean handleDraw(GtkWidget *widget, cairo_t *cr); #else - static gint handleExpose(GtkWidget *widget, GdkEventExpose *event); + static gboolean handleExpose(GtkWidget *widget, GdkEventExpose *event); #endif /** @@ -2178,23 +2178,24 @@ void SPCanvas::endForcedFullRedraws() } #if GTK_CHECK_VERSION(3,0,0) - -//TODO: This could probably be done much more efficiently gboolean SPCanvasImpl::handleDraw(GtkWidget *widget, cairo_t *cr) { SPCanvas *canvas = SP_CANVAS(widget); - gint width = gtk_widget_get_allocated_width(widget); - gint height = gtk_widget_get_allocated_height(widget); - Geom::IntRect r = Geom::IntRect::from_xywh( - canvas->x0, canvas->y0, - width, height); + cairo_rectangle_list_t *rects = cairo_copy_clip_rectangle_list(cr); + + for (int i = 0; i < rects->num_rectangles; i++) { + cairo_rectangle_t rectangle = rects->rectangles[i]; - canvas->requestRedraw(r.left(), r.top(), r.right(), r.bottom()); + Geom::IntRect r = Geom::IntRect::from_xywh(rectangle.x + canvas->x0, rectangle.y + canvas->y0, + rectangle.width, rectangle.height); + + canvas->requestRedraw(r.left(), r.top(), r.right(), r.bottom()); + } return FALSE; } #else -gint SPCanvasImpl::handleExpose(GtkWidget *widget, GdkEventExpose *event) +gboolean SPCanvasImpl::handleExpose(GtkWidget *widget, GdkEventExpose *event) { SPCanvas *canvas = SP_CANVAS(widget); @@ -2208,26 +2209,18 @@ gint SPCanvasImpl::handleExpose(GtkWidget *widget, GdkEventExpose *event) gdk_region_get_rectangles(event->region, &rects, &n_rects); if(rects == NULL) - return FALSE; - - if (n_rects == 0) - { return FALSE; - } - else - { - for (int i = 0; i < n_rects; i++) { - GdkRectangle rectangle = rects[i]; - - Geom::IntRect r = Geom::IntRect::from_xywh( - rectangle.x + canvas->x0, rectangle.y + canvas->y0, - rectangle.width, rectangle.height); + + for (int i = 0; i < n_rects; i++) { + GdkRectangle rectangle = rects[i]; + + Geom::IntRect r = Geom::IntRect::from_xywh(rectangle.x + canvas->x0, rectangle.y + canvas->y0, + rectangle.width, rectangle.height); - canvas->requestRedraw(r.left(), r.top(), r.right(), r.bottom()); - } - - return FALSE; + canvas->requestRedraw(r.left(), r.top(), r.right(), r.bottom()); } + + return FALSE; } #endif -- cgit v1.2.3