From 41790aef4bd2f5ea4f274c7f5a03f85fe94de585 Mon Sep 17 00:00:00 2001 From: Ell Date: Thu, 28 Feb 2019 15:21:40 -0500 Subject: [PATCH] app: fix transform-grid center point for non-affine transforms; use as pivot In GimpToolTransformGrid, use the transformed center-point of the original polygon as the position of the center-point handle, and as a snapping point for the pivot when "cornersnap" is TRUE, instead of using the center-point of the transformed polygon. These two points are different for non-affine transformations. Furthermore, when "use-pivot-handle" is FALSE, use the center- point as the reference point when transforming around the pivot, instead of the pivot itself, which might not be set. In particular, this fixes transformation around the pivot in the perspective tool. Don't explicitly set the center-point as the pivot in the scale tool, since this commit makes it unnecessary. (cherry picked from commit cdc5782b3c0ad94beff4682e67503e86b15a6b78) --- app/display/gimptooltransformgrid.c | 58 +++++++++++++++++++++++------ app/tools/gimpscaletool.c | 12 ++---- 2 files changed, 50 insertions(+), 20 deletions(-) diff --git a/app/display/gimptooltransformgrid.c b/app/display/gimptooltransformgrid.c index 6c150b6130..df162b4a29 100644 --- a/app/display/gimptooltransformgrid.c +++ b/app/display/gimptooltransformgrid.c @@ -801,6 +801,17 @@ transform_is_convex (GimpVector2 *pos) pos[3].x, pos[3].y); } +static gboolean +transform_grid_is_convex (GimpToolTransformGrid *grid) +{ + GimpToolTransformGridPrivate *private = grid->private; + + return gimp_transform_polygon_is_convex (private->tx1, private->ty1, + private->tx2, private->ty2, + private->tx3, private->ty3, + private->tx4, private->ty4); +} + static inline gboolean vectorisnull (GimpVector2 v) { @@ -1309,16 +1320,29 @@ gimp_tool_transform_grid_motion (GimpToolWidget *widget, newpos[3].y = oldpos[3].y = private->prev_ty4; /* put center point in this array too */ - oldpos[4].x = (oldpos[0].x + oldpos[1].x + oldpos[2].x + oldpos[3].x) / 4.; - oldpos[4].y = (oldpos[0].y + oldpos[1].y + oldpos[2].y + oldpos[3].y) / 4.; + oldpos[4].x = private->prev_tcx; + oldpos[4].y = private->prev_tcy; d = vectorsubtract (cur, mouse); newpivot_x = &private->tpx; newpivot_y = &private->tpy; - pivot.x = private->prev_tpx; - pivot.y = private->prev_tpy; + if (private->use_pivot_handle) + { + pivot.x = private->prev_tpx; + pivot.y = private->prev_tpy; + } + else + { + /* when the transform grid doesn't use a pivot handle, use the center + * point as the pivot instead. + */ + pivot.x = private->prev_tcx; + pivot.y = private->prev_tcy; + + fixedpivot = TRUE; + } /* move */ if (handle == GIMP_TRANSFORM_HANDLE_CENTER) @@ -2307,14 +2331,24 @@ gimp_tool_transform_grid_update_box (GimpToolTransformGrid *grid) private->tpx = private->pivot_x; private->tpy = private->pivot_y; - private->tcx = (private->tx1 + - private->tx2 + - private->tx3 + - private->tx4) / 4.0; - private->tcy = (private->ty1 + - private->ty2 + - private->ty3 + - private->ty4) / 4.0; + if (transform_grid_is_convex (grid)) + { + gimp_matrix3_transform_point (&private->transform, + (private->x1 + private->x2) / 2.0, + (private->y1 + private->y2) / 2.0, + &private->tcx, &private->tcy); + } + else + { + private->tcx = (private->tx1 + + private->tx2 + + private->tx3 + + private->tx4) / 4.0; + private->tcy = (private->ty1 + + private->ty2 + + private->ty3 + + private->ty4) / 4.0; + } } static void diff --git a/app/tools/gimpscaletool.c b/app/tools/gimpscaletool.c index 10bbe18a0e..1924541a3e 100644 --- a/app/tools/gimpscaletool.c +++ b/app/tools/gimpscaletool.c @@ -270,8 +270,6 @@ gimp_scale_tool_get_widget (GimpTransformGridTool *tg_tool) tr_tool->y2); g_object_set (widget, - "pivot-x", (tr_tool->x1 + tr_tool->x2) / 2.0, - "pivot-y", (tr_tool->y1 + tr_tool->y2) / 2.0, "inside-function", GIMP_TRANSFORM_FUNCTION_SCALE, "outside-function", GIMP_TRANSFORM_FUNCTION_SCALE, "use-corner-handles", TRUE, @@ -291,12 +289,10 @@ gimp_scale_tool_update_widget (GimpTransformGridTool *tg_tool) g_object_set ( tg_tool->widget, - "x1", (gdouble) tr_tool->x1, - "y1", (gdouble) tr_tool->y1, - "x2", (gdouble) tr_tool->x2, - "y2", (gdouble) tr_tool->y2, - "pivot-x", (tg_tool->trans_info[X0] + tg_tool->trans_info[X1]) / 2.0, - "pivot-y", (tg_tool->trans_info[Y0] + tg_tool->trans_info[Y1]) / 2.0, + "x1", (gdouble) tr_tool->x1, + "y1", (gdouble) tr_tool->y1, + "x2", (gdouble) tr_tool->x2, + "y2", (gdouble) tr_tool->y2, NULL); }