From 258e60f1b76fad21aec9dd412b451da2aa554d7c Mon Sep 17 00:00:00 2001 From: Ell Date: Sun, 28 Jan 2018 15:21:33 -0500 Subject: [PATCH] app: use gimp_transform_polygon() in GimpCanvasBoundary ... so that clipping is done properly. --- app/display/gimpcanvasboundary.c | 65 +++++++++++++++++++++----------- 1 file changed, 43 insertions(+), 22 deletions(-) diff --git a/app/display/gimpcanvasboundary.c b/app/display/gimpcanvasboundary.c index 272308a16b..28b1da992e 100644 --- a/app/display/gimpcanvasboundary.c +++ b/app/display/gimpcanvasboundary.c @@ -29,6 +29,7 @@ #include "display-types.h" #include "core/gimp-cairo.h" +#include "core/gimp-transform-utils.h" #include "core/gimpboundary.h" #include "core/gimpparamspecs.h" @@ -219,35 +220,44 @@ gimp_canvas_boundary_get_property (GObject *object, static void gimp_canvas_boundary_transform (GimpCanvasItem *item, - GimpSegment *segs) + GimpSegment *segs, + gint *n_segs) { GimpCanvasBoundaryPrivate *private = GET_PRIVATE (item); gint i; if (private->transform) { + gint n = 0; + for (i = 0; i < private->n_segs; i++) { - gdouble tx, ty; + GimpVector2 vertices[2]; + GimpVector2 t_vertices[2]; + gint n_t_vertices; - gimp_matrix3_transform_point (private->transform, - private->segs[i].x1, - private->segs[i].y1, - &tx, &ty); - gimp_canvas_item_transform_xy (item, - tx + private->offset_x, - ty + private->offset_y, - &segs[i].x1, &segs[i].y1); + vertices[0] = (GimpVector2) { private->segs[i].x1, private->segs[i].y1 }; + vertices[1] = (GimpVector2) { private->segs[i].x2, private->segs[i].y2 }; - gimp_matrix3_transform_point (private->transform, - private->segs[i].x2, - private->segs[i].y2, - &tx, &ty); - gimp_canvas_item_transform_xy (item, - tx + private->offset_x, - ty + private->offset_y, - &segs[i].x2, &segs[i].y2); + gimp_transform_polygon (private->transform, vertices, 2, FALSE, + t_vertices, &n_t_vertices); + + if (n_t_vertices == 2) + { + gimp_canvas_item_transform_xy (item, + t_vertices[0].x + private->offset_x, + t_vertices[0].y + private->offset_y, + &segs[n].x1, &segs[n].y1); + gimp_canvas_item_transform_xy (item, + t_vertices[1].x + private->offset_x, + t_vertices[1].y + private->offset_y, + &segs[n].x2, &segs[n].y2); + + n++; + } } + + *n_segs = n; } else { @@ -284,6 +294,8 @@ gimp_canvas_boundary_transform (GimpCanvasItem *item, } } } + + *n_segs = private->n_segs; } } @@ -293,12 +305,13 @@ gimp_canvas_boundary_draw (GimpCanvasItem *item, { GimpCanvasBoundaryPrivate *private = GET_PRIVATE (item); GimpSegment *segs; + gint n_segs; segs = g_new0 (GimpSegment, private->n_segs); - gimp_canvas_boundary_transform (item, segs); + gimp_canvas_boundary_transform (item, segs, &n_segs); - gimp_cairo_add_segments (cr, segs, private->n_segs); + gimp_cairo_add_segments (cr, segs, n_segs); _gimp_canvas_item_stroke (item, cr); @@ -311,19 +324,27 @@ gimp_canvas_boundary_get_extents (GimpCanvasItem *item) GimpCanvasBoundaryPrivate *private = GET_PRIVATE (item); cairo_rectangle_int_t rectangle; GimpSegment *segs; + gint n_segs; gint x1, y1, x2, y2; gint i; segs = g_new0 (GimpSegment, private->n_segs); - gimp_canvas_boundary_transform (item, segs); + gimp_canvas_boundary_transform (item, segs, &n_segs); + + if (n_segs == 0) + { + g_free (segs); + + return cairo_region_create (); + } x1 = MIN (segs[0].x1, segs[0].x2); y1 = MIN (segs[0].y1, segs[0].y2); x2 = MAX (segs[0].x1, segs[0].x2); y2 = MAX (segs[0].y1, segs[0].y2); - for (i = 1; i < private->n_segs; i++) + for (i = 1; i < n_segs; i++) { gint x3 = MIN (segs[i].x1, segs[i].x2); gint y3 = MIN (segs[i].y1, segs[i].y2);