From 6bdca50d0b50338f14bc3498179511b6acf7bdab Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Tue, 13 Nov 2007 14:27:29 +0000 Subject: [PATCH] naive port to Cairo. Somebody should check if this isn't better done with 2007-11-13 Michael Natterer * app/widgets/gimpviewrenderervectors.c (gimp_view_renderer_vectors_draw): naive port to Cairo. Somebody should check if this isn't better done with proper curve_to() drawing using the original vectors data instead of interpolation. * app/widgets/gimpviewrenderer.c (gimp_view_renderer_draw): reset clipping before drawing the border because a subclass' draw() might have done additional clipping. svn path=/trunk/; revision=24147 --- ChangeLog | 11 ++++++++++ app/widgets/gimpviewrenderer.c | 10 +++++++++ app/widgets/gimpviewrenderervectors.c | 29 ++++++++++++++------------- 3 files changed, 36 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0182bb0773..805988715d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2007-11-13 Michael Natterer + + * app/widgets/gimpviewrenderervectors.c + (gimp_view_renderer_vectors_draw): naive port to Cairo. Somebody + should check if this isn't better done with proper curve_to() + drawing using the original vectors data instead of interpolation. + + * app/widgets/gimpviewrenderer.c (gimp_view_renderer_draw): reset + clipping before drawing the border because a subclass' draw() + might have done additional clipping. + 2007-11-13 Tor Lillqvist * gimptool-win32.c.in: Some cleanups, more coming. diff --git a/app/widgets/gimpviewrenderer.c b/app/widgets/gimpviewrenderer.c index 3083e92a97..3154201d4e 100644 --- a/app/widgets/gimpviewrenderer.c +++ b/app/widgets/gimpviewrenderer.c @@ -630,6 +630,16 @@ gimp_view_renderer_draw (GimpViewRenderer *renderer, gint height = renderer->height + renderer->border_width; gdouble x, y; + if (renderer->viewable) + { + /* reset clipping because the draw() implementation is + * allowed to do additional clipping + */ + cairo_reset_clip (cr); + gdk_cairo_rectangle (cr, &render_rect); + cairo_clip (cr); + } + cairo_set_line_width (cr, renderer->border_width); cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); gimp_cairo_set_source_color (cr, &renderer->border_color); diff --git a/app/widgets/gimpviewrenderervectors.c b/app/widgets/gimpviewrenderervectors.c index 905a54dcac..abee8bdcf3 100644 --- a/app/widgets/gimpviewrenderervectors.c +++ b/app/widgets/gimpviewrenderervectors.c @@ -81,9 +81,11 @@ gimp_view_renderer_vectors_draw (GimpViewRenderer *renderer, y = area->y + (area->height - renderer->height) / 2; cairo_rectangle (cr, x, y, renderer->width, renderer->height); + cairo_clip_preserve (cr); cairo_fill (cr); - /* FIXME: port vector previews to Cairo */ + cairo_set_line_width (cr, 1.0); + gdk_cairo_set_source_color (cr, &widget->style->black); xscale = (gdouble) GIMP_ITEM (vectors)->width / (gdouble) renderer->width; yscale = (gdouble) GIMP_ITEM (vectors)->height / (gdouble) renderer->height; @@ -100,28 +102,27 @@ gimp_view_renderer_vectors_draw (GimpViewRenderer *renderer, if (! coordinates) continue; -#if 0 if (coordinates->len > 0) { - GdkPoint *points = g_new (GdkPoint, coordinates->len); - gint i; + GimpCoords *coords = &(g_array_index (coordinates, GimpCoords, 0)); + gdouble cx = x + ROUND (coords->x / xscale); + gdouble cy = y + ROUND (coords->y / yscale); + gint i; - for (i = 0; i < coordinates->len; i++) + cairo_move_to (cr, cx, cy); + + for (i = 1; i < coordinates->len; i++) { - GimpCoords *coords; - coords = &(g_array_index (coordinates, GimpCoords, i)); - points[i].x = rect.x + ROUND (coords->x / xscale); - points[i].y = rect.y + ROUND (coords->y / yscale); + cx = x + ROUND (coords->x / xscale) + 0.5; + cy = y + ROUND (coords->y / yscale) + 0.5; + + cairo_line_to (cr, cx, cy); } - gdk_draw_lines (window, widget->style->black_gc, - points, coordinates->len); - - g_free (points); + cairo_stroke (cr); } -#endif g_array_free (coordinates, TRUE); }