summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAlex Valavanis <valavanisalex@gmail.com>2012-12-30 21:24:42 +0000
committerAlex Valavanis <valavanisalex@gmail.com>2012-12-30 21:24:42 +0000
commitb9d513c8fdea87faf1143fedd53664725e6f59ba (patch)
tree91a4b2c8d451df6fb035423b378c59d6febf2b00 /src
parentTranslations. Ukrainian translation update by Yuri Chornoivan. (diff)
downloadinkscape-b9d513c8fdea87faf1143fedd53664725e6f59ba.tar.gz
inkscape-b9d513c8fdea87faf1143fedd53664725e6f59ba.zip
Speed up canvas item drawing for GTK+ 3
(bzr r11999)
Diffstat (limited to 'src')
-rw-r--r--src/display/sp-canvas.cpp47
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