diff options
| author | Alex Valavanis <valavanisalex@gmail.com> | 2012-12-30 21:24:42 +0000 |
|---|---|---|
| committer | Alex Valavanis <valavanisalex@gmail.com> | 2012-12-30 21:24:42 +0000 |
| commit | b9d513c8fdea87faf1143fedd53664725e6f59ba (patch) | |
| tree | 91a4b2c8d451df6fb035423b378c59d6febf2b00 /src/display/sp-canvas.cpp | |
| parent | Translations. Ukrainian translation update by Yuri Chornoivan. (diff) | |
| download | inkscape-b9d513c8fdea87faf1143fedd53664725e6f59ba.tar.gz inkscape-b9d513c8fdea87faf1143fedd53664725e6f59ba.zip | |
Speed up canvas item drawing for GTK+ 3
(bzr r11999)
Diffstat (limited to 'src/display/sp-canvas.cpp')
| -rw-r--r-- | src/display/sp-canvas.cpp | 47 |
1 files changed, 20 insertions, 27 deletions
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 |
