[gimp] app: in Unified Transform tool, avoid moving pivot when locked



commit d7c995153dc7a06ec2f86d3eac1130ae1c2948d6
Author: Ell <ell_se yahoo com>
Date:   Mon Apr 27 16:49:13 2020 +0300

    app: in Unified Transform tool, avoid moving pivot when locked
    
    In GimpUnifiedTransfomTool, avoid moving the pivot when
    readjusting, and when the transform directions are linked, if the
    pivot is locked.

 app/tools/gimpunifiedtransformtool.c | 75 +++++++++++++++++++++++++++---------
 1 file changed, 56 insertions(+), 19 deletions(-)
---
diff --git a/app/tools/gimpunifiedtransformtool.c b/app/tools/gimpunifiedtransformtool.c
index 9957f4ccb3..85682bbc38 100644
--- a/app/tools/gimpunifiedtransformtool.c
+++ b/app/tools/gimpunifiedtransformtool.c
@@ -60,6 +60,8 @@ enum
 
 static void             gimp_unified_transform_tool_matrix_to_info (GimpTransformGridTool    *tg_tool,
                                                                     const GimpMatrix3        *transform);
+static void             gimp_unified_transform_tool_apply_info     (GimpTransformGridTool    *tg_tool,
+                                                                    const TransInfo           info);
 static void             gimp_unified_transform_tool_prepare        (GimpTransformGridTool    *tg_tool);
 static void             gimp_unified_transform_tool_readjust       (GimpTransformGridTool    *tg_tool);
 static GimpToolWidget * gimp_unified_transform_tool_get_widget     (GimpTransformGridTool    *tg_tool);
@@ -101,6 +103,7 @@ gimp_unified_transform_tool_class_init (GimpUnifiedTransformToolClass *klass)
   GimpGenericTransformToolClass *generic_class = GIMP_GENERIC_TRANSFORM_TOOL_CLASS (klass);
 
   tg_class->matrix_to_info      = gimp_unified_transform_tool_matrix_to_info;
+  tg_class->apply_info          = gimp_unified_transform_tool_apply_info;
   tg_class->prepare             = gimp_unified_transform_tool_prepare;
   tg_class->readjust            = gimp_unified_transform_tool_readjust;
   tg_class->get_widget          = gimp_unified_transform_tool_get_widget;
@@ -122,18 +125,23 @@ static void
 gimp_unified_transform_tool_matrix_to_info (GimpTransformGridTool *tg_tool,
                                             const GimpMatrix3     *transform)
 {
-  GimpTransformTool *tr_tool = GIMP_TRANSFORM_TOOL (tg_tool);
-  GimpMatrix3        transfer;
+  GimpTransformTool        *tr_tool    = GIMP_TRANSFORM_TOOL (tg_tool);
+  GimpTransformGridOptions *tg_options = GIMP_TRANSFORM_GRID_TOOL_GET_OPTIONS (tg_tool);
+
+  if (! tg_options->fixedpivot)
+    {
+      GimpMatrix3 transfer;
 
-  gimp_transform_grid_tool_info_to_matrix (tg_tool, &transfer);
-  gimp_matrix3_invert (&transfer);
-  gimp_matrix3_mult (transform, &transfer);
+      gimp_transform_grid_tool_info_to_matrix (tg_tool, &transfer);
+      gimp_matrix3_invert (&transfer);
+      gimp_matrix3_mult (transform, &transfer);
 
-  gimp_matrix3_transform_point (&transfer,
-                                tg_tool->trans_info[PIVOT_X],
-                                tg_tool->trans_info[PIVOT_Y],
-                                &tg_tool->trans_info[PIVOT_X],
-                                &tg_tool->trans_info[PIVOT_Y]);
+      gimp_matrix3_transform_point (&transfer,
+                                    tg_tool->trans_info[PIVOT_X],
+                                    tg_tool->trans_info[PIVOT_Y],
+                                    &tg_tool->trans_info[PIVOT_X],
+                                    &tg_tool->trans_info[PIVOT_Y]);
+    }
 
   gimp_matrix3_transform_point (transform,
                                 tr_tool->x1,
@@ -157,6 +165,31 @@ gimp_unified_transform_tool_matrix_to_info (GimpTransformGridTool *tg_tool,
                                 &tg_tool->trans_info[Y3]);
 }
 
+static void
+gimp_unified_transform_tool_apply_info (GimpTransformGridTool *tg_tool,
+                                        const TransInfo        info)
+{
+  GimpTransformGridOptions *tg_options = GIMP_TRANSFORM_GRID_TOOL_GET_OPTIONS (tg_tool);
+
+  tg_tool->trans_info[X0] = info[X0];
+  tg_tool->trans_info[Y0] = info[Y0];
+
+  tg_tool->trans_info[X1] = info[X1];
+  tg_tool->trans_info[Y1] = info[Y1];
+
+  tg_tool->trans_info[X2] = info[X2];
+  tg_tool->trans_info[Y2] = info[Y2];
+
+  tg_tool->trans_info[X3] = info[X3];
+  tg_tool->trans_info[Y3] = info[Y3];
+
+  if (! tg_options->fixedpivot)
+    {
+      tg_tool->trans_info[PIVOT_X] = info[PIVOT_X];
+      tg_tool->trans_info[PIVOT_Y] = info[PIVOT_Y];
+    }
+}
+
 static void
 gimp_unified_transform_tool_prepare (GimpTransformGridTool *tg_tool)
 {
@@ -180,11 +213,12 @@ gimp_unified_transform_tool_prepare (GimpTransformGridTool *tg_tool)
 static void
 gimp_unified_transform_tool_readjust (GimpTransformGridTool *tg_tool)
 {
-  GimpTool         *tool  = GIMP_TOOL (tg_tool);
-  GimpDisplayShell *shell = gimp_display_get_shell (tool->display);
-  gdouble           x;
-  gdouble           y;
-  gdouble           r;
+  GimpTool                 *tool       = GIMP_TOOL (tg_tool);
+  GimpTransformGridOptions *tg_options = GIMP_TRANSFORM_GRID_TOOL_GET_OPTIONS (tg_tool);
+  GimpDisplayShell         *shell      = gimp_display_get_shell (tool->display);
+  gdouble                   x;
+  gdouble                   y;
+  gdouble                   r;
 
   x = shell->disp_width  / 2.0;
   y = shell->disp_height / 2.0;
@@ -192,10 +226,13 @@ gimp_unified_transform_tool_readjust (GimpTransformGridTool *tg_tool)
            GIMP_TOOL_TRANSFORM_GRID_MAX_HANDLE_SIZE / 2.0,
            GIMP_TOOL_TRANSFORM_GRID_MAX_HANDLE_SIZE / 2.0);
 
-  gimp_display_shell_untransform_xy_f (shell,
-                                       x, y,
-                                       &tg_tool->trans_info[PIVOT_X],
-                                       &tg_tool->trans_info[PIVOT_Y]);
+  if (! tg_options->fixedpivot)
+    {
+      gimp_display_shell_untransform_xy_f (shell,
+                                           x, y,
+                                           &tg_tool->trans_info[PIVOT_X],
+                                           &tg_tool->trans_info[PIVOT_Y]);
+    }
 
   gimp_display_shell_untransform_xy_f (shell,
                                        x - r, y - r,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]