app: use gimp_transform_polygon() in GimpCanvasPolygon

... so that clipping is done properly.
This commit is contained in:
Ell 2018-02-03 05:28:48 -05:00
parent 1750d97b11
commit 1cae93ac42
1 changed files with 59 additions and 17 deletions

View File

@ -28,6 +28,7 @@
#include "display-types.h" #include "display-types.h"
#include "core/gimp-transform-utils.h"
#include "core/gimpparamspecs.h" #include "core/gimpparamspecs.h"
#include "gimpcanvaspolygon.h" #include "gimpcanvaspolygon.h"
@ -230,23 +231,23 @@ gimp_canvas_polygon_get_property (GObject *object,
static void static void
gimp_canvas_polygon_transform (GimpCanvasItem *item, gimp_canvas_polygon_transform (GimpCanvasItem *item,
GimpVector2 *points) GimpVector2 *points,
gint *n_points)
{ {
GimpCanvasPolygonPrivate *private = GET_PRIVATE (item); GimpCanvasPolygonPrivate *private = GET_PRIVATE (item);
gint i; gint i;
if (private->transform) if (private->transform)
{ {
for (i = 0; i < private->n_points; i++) gimp_transform_polygon (private->transform,
{ private->points, private->n_points, FALSE,
gdouble tx, ty; points, n_points);
gimp_matrix3_transform_point (private->transform, for (i = 0; i < *n_points; i++)
private->points[i].x, {
private->points[i].y,
&tx, &ty);
gimp_canvas_item_transform_xy_f (item, gimp_canvas_item_transform_xy_f (item,
tx, ty, points[i].x,
points[i].y,
&points[i].x, &points[i].x,
&points[i].y); &points[i].y);
@ -267,6 +268,8 @@ gimp_canvas_polygon_transform (GimpCanvasItem *item,
points[i].x = floor (points[i].x) + 0.5; points[i].x = floor (points[i].x) + 0.5;
points[i].y = floor (points[i].y) + 0.5; points[i].y = floor (points[i].y) + 0.5;
} }
*n_points = private->n_points;
} }
} }
@ -276,18 +279,31 @@ gimp_canvas_polygon_draw (GimpCanvasItem *item,
{ {
GimpCanvasPolygonPrivate *private = GET_PRIVATE (item); GimpCanvasPolygonPrivate *private = GET_PRIVATE (item);
GimpVector2 *points; GimpVector2 *points;
gint n_points;
gint i; gint i;
if (! private->points) if (! private->points)
return; return;
points = g_new0 (GimpVector2, private->n_points); n_points = private->n_points;
gimp_canvas_polygon_transform (item, points); if (private->transform)
n_points = 3 * n_points / 2;
points = g_new0 (GimpVector2, n_points);
gimp_canvas_polygon_transform (item, points, &n_points);
if (n_points < 2)
{
g_free (points);
return;
}
cairo_move_to (cr, points[0].x, points[0].y); cairo_move_to (cr, points[0].x, points[0].y);
for (i = 1; i < private->n_points; i++) for (i = 1; i < n_points; i++)
{ {
cairo_line_to (cr, points[i].x, points[i].y); cairo_line_to (cr, points[i].x, points[i].y);
} }
@ -306,22 +322,35 @@ gimp_canvas_polygon_get_extents (GimpCanvasItem *item)
GimpCanvasPolygonPrivate *private = GET_PRIVATE (item); GimpCanvasPolygonPrivate *private = GET_PRIVATE (item);
cairo_rectangle_int_t rectangle; cairo_rectangle_int_t rectangle;
GimpVector2 *points; GimpVector2 *points;
gint n_points;
gint x1, y1, x2, y2; gint x1, y1, x2, y2;
gint i; gint i;
if (! private->points) if (! private->points)
return NULL; return NULL;
points = g_new0 (GimpVector2, private->n_points); n_points = private->n_points;
gimp_canvas_polygon_transform (item, points); if (private->transform)
n_points = 3 * n_points / 2;
points = g_new0 (GimpVector2, n_points);
gimp_canvas_polygon_transform (item, points, &n_points);
if (n_points < 2)
{
g_free (points);
return NULL;
}
x1 = floor (points[0].x - 1.5); x1 = floor (points[0].x - 1.5);
y1 = floor (points[0].y - 1.5); y1 = floor (points[0].y - 1.5);
x2 = x1 + 3; x2 = x1 + 3;
y2 = y1 + 3; y2 = y1 + 3;
for (i = 1; i < private->n_points; i++) for (i = 1; i < n_points; i++)
{ {
gint x3 = floor (points[i].x - 1.5); gint x3 = floor (points[i].x - 1.5);
gint y3 = floor (points[i].y - 1.5); gint y3 = floor (points[i].y - 1.5);
@ -351,6 +380,7 @@ gimp_canvas_polygon_hit (GimpCanvasItem *item,
{ {
GimpCanvasPolygonPrivate *private = GET_PRIVATE (item); GimpCanvasPolygonPrivate *private = GET_PRIVATE (item);
GimpVector2 *points; GimpVector2 *points;
gint n_points;
gdouble tx, ty; gdouble tx, ty;
cairo_surface_t *surface; cairo_surface_t *surface;
cairo_t *cr; cairo_t *cr;
@ -362,9 +392,21 @@ gimp_canvas_polygon_hit (GimpCanvasItem *item,
gimp_canvas_item_transform_xy_f (item, x, y, &tx, &ty); gimp_canvas_item_transform_xy_f (item, x, y, &tx, &ty);
points = g_new0 (GimpVector2, private->n_points); n_points = private->n_points;
gimp_canvas_polygon_transform (item, points); if (private->transform)
n_points = 3 * n_points / 2;
points = g_new0 (GimpVector2, n_points);
gimp_canvas_polygon_transform (item, points, &n_points);
if (n_points < 2)
{
g_free (points);
return FALSE;
}
surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, 1, 1); surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, 1, 1);
cr = cairo_create (surface); cr = cairo_create (surface);