mirror of https://github.com/GNOME/gimp.git
app: use gimp_transform_polygon() in GimpCanvasPolygon
... so that clipping is done properly.
This commit is contained in:
parent
1750d97b11
commit
1cae93ac42
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue