[gimp] app: use a GimpToolHandleGrid in GimpHandleTransformTool



commit 38c9ee9e930bd482fab2f6f16915d30b888e82ce
Author: Michael Natterer <mitch gimp org>
Date:   Mon Jun 19 01:22:13 2017 +0200

    app: use a GimpToolHandleGrid in GimpHandleTransformTool

 app/tools/gimphandletransformtool.c |  757 +++++++----------------------------
 app/tools/gimphandletransformtool.h |    1 -
 2 files changed, 154 insertions(+), 604 deletions(-)
---
diff --git a/app/tools/gimphandletransformtool.c b/app/tools/gimphandletransformtool.c
index 8e59902..5432ac6 100644
--- a/app/tools/gimphandletransformtool.c
+++ b/app/tools/gimphandletransformtool.c
@@ -17,8 +17,6 @@
 
 #include "config.h"
 
-#include <string.h>
-
 #include <gegl.h>
 #include <gtk/gtk.h>
 
@@ -35,8 +33,8 @@
 #include "widgets/gimphelp-ids.h"
 #include "widgets/gimpwidgets-utils.h"
 
-#include "display/gimpcanvasitem.h"
 #include "display/gimpdisplay.h"
+#include "display/gimptoolhandlegrid.h"
 #include "display/gimptoolgui.h"
 
 #include "gimphandletransformoptions.h"
@@ -84,59 +82,26 @@ enum
 
 /*  local function prototypes  */
 
-static void   gimp_handle_transform_tool_button_press  (GimpTool              *tool,
-                                                        const GimpCoords      *coords,
-                                                        guint32                time,
-                                                        GdkModifierType        state,
-                                                        GimpButtonPressType    press_type,
-                                                        GimpDisplay           *display);
-static void   gimp_handle_transform_tool_button_release (GimpTool              *tool,
-                                                         const GimpCoords      *coords,
-                                                         guint32                time,
-                                                         GdkModifierType        state,
-                                                         GimpButtonReleaseType    release_type,
-                                                         GimpDisplay           *display);
-static void   gimp_handle_transform_tool_modifier_key   (GimpTool              *tool,
-                                                         GdkModifierType        key,
-                                                         gboolean               press,
-                                                         GdkModifierType        state,
-                                                         GimpDisplay           *display);
-
-static void   gimp_handle_transform_tool_dialog         (GimpTransformTool  *tr_tool);
-static void   gimp_handle_transform_tool_dialog_update  (GimpTransformTool  *tr_tool);
-static void   gimp_handle_transform_tool_prepare        (GimpTransformTool  *tr_tool);
-static void   gimp_handle_transform_tool_motion         (GimpTransformTool  *tr_tool);
-static void   gimp_handle_transform_tool_recalc_matrix  (GimpTransformTool  *tr_tool,
-                                                         GimpToolWidget     *widget);
-static gchar *gimp_handle_transform_tool_get_undo_desc  (GimpTransformTool  *tr_tool);
-static TransformAction
-              gimp_handle_transform_tool_pick_function  (GimpTransformTool  *tr_tool,
-                                                         const GimpCoords   *coords,
-                                                         GdkModifierType     state,
-                                                         GimpDisplay        *display);
-static void   gimp_handle_transform_tool_cursor_update  (GimpTransformTool  *tr_tool,
-                                                         GimpCursorType     *cursor,
-                                                         GimpCursorModifier *modifier);
-static void   gimp_handle_transform_tool_draw_gui       (GimpTransformTool  *tr_tool);
-
-static gboolean       is_handle_position_valid          (GimpTransformTool  *tr_tool,
-                                                         gint                active_handle);
-static void           handle_micro_move                 (GimpTransformTool *tr_tool,
-                                                         gint               active_handle);
-static inline gdouble calc_angle                        (gdouble  ax,
-                                                         gdouble  ay,
-                                                         gdouble  bx,
-                                                         gdouble  by);
-static inline gdouble calc_len                          (gdouble  a,
-                                                         gdouble  b);
-static inline gdouble calc_lineintersect_ratio          (gdouble  p1x,
-                                                         gdouble  p1y,
-                                                         gdouble  p2x,
-                                                         gdouble  p2y,
-                                                         gdouble  q1x,
-                                                         gdouble  q1y,
-                                                         gdouble  q2x,
-                                                         gdouble  q2y);
+static void   gimp_handle_transform_tool_modifier_key   (GimpTool          *tool,
+                                                         GdkModifierType    key,
+                                                         gboolean           press,
+                                                         GdkModifierType    state,
+                                                         GimpDisplay       *display);
+static void   gimp_handle_transform_tool_options_notify (GimpTool          *tool,
+                                                         GimpToolOptions   *options,
+                                                         const GParamSpec  *pspec);
+
+static void   gimp_handle_transform_tool_dialog         (GimpTransformTool *tr_tool);
+static void   gimp_handle_transform_tool_dialog_update  (GimpTransformTool *tr_tool);
+static void   gimp_handle_transform_tool_prepare        (GimpTransformTool *tr_tool);
+static GimpToolWidget *
+              gimp_handle_transform_tool_get_widget     (GimpTransformTool *tr_tool);
+static void   gimp_handle_transform_tool_recalc_matrix  (GimpTransformTool *tr_tool,
+                                                         GimpToolWidget    *widget);
+static gchar *gimp_handle_transform_tool_get_undo_desc  (GimpTransformTool *tr_tool);
+
+static void   gimp_handle_transform_tool_widget_changed (GimpToolWidget    *widget,
+                                                         GimpTransformTool *tr_tool);
 
 
 G_DEFINE_TYPE (GimpHandleTransformTool, gimp_handle_transform_tool,
@@ -173,19 +138,15 @@ gimp_handle_transform_tool_class_init (GimpHandleTransformToolClass *klass)
   GimpToolClass          *tool_class  = GIMP_TOOL_CLASS (klass);
   GimpTransformToolClass *trans_class = GIMP_TRANSFORM_TOOL_CLASS (klass);
 
-  tool_class->button_press   = gimp_handle_transform_tool_button_press;
-  tool_class->button_release = gimp_handle_transform_tool_button_release;
   tool_class->modifier_key   = gimp_handle_transform_tool_modifier_key;
+  tool_class->options_notify = gimp_handle_transform_tool_options_notify;
 
   trans_class->dialog        = gimp_handle_transform_tool_dialog;
   trans_class->dialog_update = gimp_handle_transform_tool_dialog_update;
   trans_class->prepare       = gimp_handle_transform_tool_prepare;
-  trans_class->motion        = gimp_handle_transform_tool_motion;
+  trans_class->get_widget    = gimp_handle_transform_tool_get_widget;
   trans_class->recalc_matrix = gimp_handle_transform_tool_recalc_matrix;
   trans_class->get_undo_desc = gimp_handle_transform_tool_get_undo_desc;
-  trans_class->pick_function = gimp_handle_transform_tool_pick_function;
-  trans_class->cursor_update = gimp_handle_transform_tool_cursor_update;
-  trans_class->draw_gui      = gimp_handle_transform_tool_draw_gui;
 }
 
 static void
@@ -195,171 +156,12 @@ gimp_handle_transform_tool_init (GimpHandleTransformTool *ht_tool)
 
   tr_tool->progress_text    = _("Handle transformation");
   tr_tool->use_grid         = TRUE;
-
   tr_tool->does_perspective = TRUE;
 
   ht_tool->saved_handle_mode = GIMP_HANDLE_MODE_ADD_TRANSFORM;
 }
 
 static void
-gimp_handle_transform_tool_button_press (GimpTool            *tool,
-                                         const GimpCoords    *coords,
-                                         guint32              time,
-                                         GdkModifierType      state,
-                                         GimpButtonPressType  press_type,
-                                         GimpDisplay         *display)
-{
-  GimpHandleTransformTool    *ht      = GIMP_HANDLE_TRANSFORM_TOOL (tool);
-  GimpTransformTool          *tr_tool = GIMP_TRANSFORM_TOOL (tool);
-  GimpHandleTransformOptions *options;
-  gint                        n_handles;
-  gint                        active_handle;
-
-  options = GIMP_HANDLE_TRANSFORM_TOOL_GET_OPTIONS (tr_tool);
-
-  GIMP_TOOL_CLASS (parent_class)->button_press (tool, coords, time, state,
-                                                press_type, display);
-
-  n_handles     = (gint) tr_tool->trans_info[N_HANDLES];
-  active_handle = tr_tool->function - TRANSFORM_HANDLE_N;
-
-  switch (options->handle_mode)
-    {
-    case GIMP_HANDLE_MODE_ADD_TRANSFORM:
-      if (n_handles < 4 && tr_tool->function == TRANSFORM_HANDLE_NONE)
-        {
-          /* add handle */
-
-          GimpMatrix3 matrix;
-
-          gimp_draw_tool_pause (GIMP_DRAW_TOOL (tool));
-
-          active_handle = n_handles;
-
-          tr_tool->trans_info[X0 + 2 * active_handle] = coords->x;
-          tr_tool->trans_info[Y0 + 2 * active_handle] = coords->y;
-          tr_tool->trans_info[N_HANDLES]++;
-
-          if (! is_handle_position_valid (tr_tool, active_handle))
-            {
-              handle_micro_move (tr_tool, active_handle);
-            }
-
-          /* handle was added, calculate new original position */
-          matrix = tr_tool->transform;
-          gimp_matrix3_invert (&matrix);
-          gimp_matrix3_transform_point (&matrix,
-                                        tr_tool->trans_info[X0 + 2 * active_handle],
-                                        tr_tool->trans_info[Y0 + 2 * active_handle],
-                                        &tr_tool->trans_info[OX0 + 2 * active_handle],
-                                        &tr_tool->trans_info[OY0 + 2 * active_handle]);
-
-          /*  this is disgusting: we put the new handle's coordinates
-           *  into the prev_trans_info array, because our motion
-           *  handler needs them for doing the actual transform; we
-           *  can only do this because the values will be ignored by
-           *  anything but our motion handler because we don't
-           *  increase the N_HANDLES value in prev_trans_info.
-           */
-          (*tr_tool->prev_trans_info)[X0 + 2 * active_handle] = tr_tool->trans_info[X0 + 2 * active_handle];
-          (*tr_tool->prev_trans_info)[Y0 + 2 * active_handle] = tr_tool->trans_info[Y0 + 2 * active_handle];
-
-          (*tr_tool->prev_trans_info)[OX0 + 2 * active_handle] = tr_tool->trans_info[OX0 + 2 * 
active_handle];
-          (*tr_tool->prev_trans_info)[OY0 + 2 * active_handle] = tr_tool->trans_info[OY0 + 2 * 
active_handle];
-
-          gimp_draw_tool_resume (GIMP_DRAW_TOOL (tool));
-
-          tr_tool->function = TRANSFORM_HANDLE_N + active_handle;
-        }
-      break;
-
-    case GIMP_HANDLE_MODE_MOVE:
-      /* check for valid position and calculating of OX0...OY3 is
-       * done on button release
-       */
-
-      /* move handles without changing the transformation matrix */
-      ht->matrix_recalculation = FALSE;
-      break;
-
-    case GIMP_HANDLE_MODE_REMOVE:
-      if (n_handles > 0      &&
-          active_handle >= 0 &&
-          active_handle < 4)
-        {
-          /* remove handle */
-
-          gdouble tempx  = tr_tool->trans_info[X0  + 2 * active_handle];
-          gdouble tempy  = tr_tool->trans_info[Y0  + 2 * active_handle];
-          gdouble tempox = tr_tool->trans_info[OX0 + 2 * active_handle];
-          gdouble tempoy = tr_tool->trans_info[OY0 + 2 * active_handle];
-          gint    i;
-
-          n_handles--;
-          tr_tool->trans_info[N_HANDLES]--;
-
-          for (i = active_handle; i < n_handles; i++)
-            {
-              tr_tool->trans_info[X0  + 2 * i] = tr_tool->trans_info[X1  + 2 * i];
-              tr_tool->trans_info[Y0  + 2 * i] = tr_tool->trans_info[Y1  + 2 * i];
-              tr_tool->trans_info[OX0 + 2 * i] = tr_tool->trans_info[OX1 + 2 * i];
-              tr_tool->trans_info[OY0 + 2 * i] = tr_tool->trans_info[OY1 + 2 * i];
-            }
-
-          tr_tool->trans_info[X0  + 2 * n_handles] = tempx;
-          tr_tool->trans_info[Y0  + 2 * n_handles] = tempy;
-          tr_tool->trans_info[OX0 + 2 * n_handles] = tempox;
-          tr_tool->trans_info[OY0 + 2 * n_handles] = tempoy;
-        }
-      break;
-    }
-}
-
-static void
-gimp_handle_transform_tool_button_release (GimpTool              *tool,
-                                           const GimpCoords      *coords,
-                                           guint32                time,
-                                           GdkModifierType        state,
-                                           GimpButtonReleaseType  release_type,
-                                           GimpDisplay           *display)
-{
-  GimpHandleTransformTool    *ht      = GIMP_HANDLE_TRANSFORM_TOOL (tool);
-  GimpTransformTool          *tr_tool = GIMP_TRANSFORM_TOOL (tool);
-  GimpHandleTransformOptions *options;
-  gint                        active_handle;
-
-  options = GIMP_HANDLE_TRANSFORM_TOOL_GET_OPTIONS (tr_tool);
-
-  active_handle = tr_tool->function - TRANSFORM_HANDLE_N;
-
-  if (options->handle_mode == GIMP_HANDLE_MODE_MOVE &&
-      active_handle >= 0 &&
-      active_handle < 4)
-    {
-      GimpMatrix3 matrix;
-
-      if (! is_handle_position_valid (tr_tool, active_handle))
-        {
-          handle_micro_move (tr_tool, active_handle);
-        }
-
-      /* handle was moved, calculate new original position */
-      matrix = tr_tool->transform;
-      gimp_matrix3_invert (&matrix);
-      gimp_matrix3_transform_point (&matrix,
-                                    tr_tool->trans_info[X0 + 2 * active_handle],
-                                    tr_tool->trans_info[Y0 + 2 * active_handle],
-                                    &tr_tool->trans_info[OX0 + 2 * active_handle],
-                                    &tr_tool->trans_info[OY0 + 2 * active_handle]);
-    }
-
-  ht->matrix_recalculation = TRUE;
-
-  GIMP_TOOL_CLASS (parent_class)->button_release (tool, coords, time,
-                                                  state, release_type, display);
-}
-
-static void
 gimp_handle_transform_tool_modifier_key (GimpTool        *tool,
                                          GdkModifierType  key,
                                          gboolean         press,
@@ -404,7 +206,9 @@ gimp_handle_transform_tool_modifier_key (GimpTool        *tool,
 
   if (handle_mode != options->handle_mode)
     {
-      g_object_set (options, "handle-mode", handle_mode, NULL);
+      g_object_set (options,
+                    "handle-mode", handle_mode,
+                    NULL);
     }
 
   GIMP_TOOL_CLASS (parent_class)->modifier_key (tool, key, press,
@@ -412,6 +216,23 @@ gimp_handle_transform_tool_modifier_key (GimpTool        *tool,
 }
 
 static void
+gimp_handle_transform_tool_options_notify (GimpTool         *tool,
+                                           GimpToolOptions  *options,
+                                           const GParamSpec *pspec)
+{
+  GimpTransformTool          *tr_tool    = GIMP_TRANSFORM_TOOL (tool);
+  GimpHandleTransformOptions *ht_options = GIMP_HANDLE_TRANSFORM_OPTIONS (options);
+
+  if (! strcmp (pspec->name, "handle-mode"))
+    {
+      if (tr_tool->widget)
+        g_object_set (tr_tool->widget,
+                      "handle-mode", ht_options->handle_mode,
+                      NULL);
+    }
+}
+
+static void
 gimp_handle_transform_tool_dialog (GimpTransformTool *tr_tool)
 {
   GimpHandleTransformTool *ht_tool = GIMP_HANDLE_TRANSFORM_TOOL (tr_tool);
@@ -468,10 +289,8 @@ gimp_handle_transform_tool_dialog_update (GimpTransformTool *tr_tool)
 }
 
 static void
-gimp_handle_transform_tool_prepare (GimpTransformTool  *tr_tool)
+gimp_handle_transform_tool_prepare (GimpTransformTool *tr_tool)
 {
-  GimpHandleTransformTool *ht_tool = GIMP_HANDLE_TRANSFORM_TOOL (tr_tool);
-
   tr_tool->trans_info[X0]        = (gdouble) tr_tool->x1;
   tr_tool->trans_info[Y0]        = (gdouble) tr_tool->y1;
   tr_tool->trans_info[X1]        = (gdouble) tr_tool->x2;
@@ -489,146 +308,98 @@ gimp_handle_transform_tool_prepare (GimpTransformTool  *tr_tool)
   tr_tool->trans_info[OX3]       = (gdouble) tr_tool->x2;
   tr_tool->trans_info[OY3]       = (gdouble) tr_tool->y2;
   tr_tool->trans_info[N_HANDLES] = 0;
-
-  ht_tool->matrix_recalculation = TRUE;
 }
 
-static void
-gimp_handle_transform_tool_motion (GimpTransformTool *tr_tool)
+static GimpToolWidget *
+gimp_handle_transform_tool_get_widget (GimpTransformTool *tr_tool)
 {
-  GimpHandleTransformOptions *options;
-  gint                        n_handles;
-  gint                        active_handle;
-
-  options = GIMP_HANDLE_TRANSFORM_TOOL_GET_OPTIONS (tr_tool);
-
-  n_handles     = (gint) tr_tool->trans_info[N_HANDLES];
-  active_handle = tr_tool->function - TRANSFORM_HANDLE_N;
-
-  if (active_handle >= 0 && active_handle < 4)
-    {
-      if (options->handle_mode == GIMP_HANDLE_MODE_MOVE)
-        {
-          tr_tool->trans_info[X0 + 2 * active_handle] += tr_tool->curx - tr_tool->lastx;
-          tr_tool->trans_info[Y0 + 2 * active_handle] += tr_tool->cury - tr_tool->lasty;
-
-          /* check for valid position and calculating of OX0...OY3 is
-           * done on button release hopefully this makes the code run
-           * faster Moving could be even faster if there was caching
-           * for the image preview
-           */
-        }
-      else if (options->handle_mode == GIMP_HANDLE_MODE_ADD_TRANSFORM)
-        {
-          gdouble angle, angle_sin, angle_cos, scale;
-          gdouble fixed_handles_x[3];
-          gdouble fixed_handles_y[3];
-          gdouble oldpos_x[4], oldpos_y[4];
-          gdouble newpos_x[4], newpos_y[4];
-          gint    i, j;
-
-          for (i = 0, j = 0; i < 4; i++)
-            {
-              /* Find all visible handles that are not being moved */
-              if (i < n_handles && i != active_handle)
-                {
-                  fixed_handles_x[j] = tr_tool->trans_info[X0 + i * 2];
-                  fixed_handles_y[j] = tr_tool->trans_info[Y0 + i * 2];
-                  j++;
-                }
-
-              newpos_x[i] = oldpos_x[i] = (*tr_tool->prev_trans_info)[X0 + i * 2];
-              newpos_y[i] = oldpos_y[i] = (*tr_tool->prev_trans_info)[Y0 + i * 2];
-            }
-
-          newpos_x[active_handle] = oldpos_x[active_handle] + tr_tool->curx - tr_tool->mousex;
-          newpos_y[active_handle] = oldpos_y[active_handle] + tr_tool->cury - tr_tool->mousey;
-
-          switch (n_handles)
-            {
-            case 1:
-              /* move */
-              for (i = 1; i < 4; i++)
-                {
-                  newpos_x[i] = oldpos_x[i] + tr_tool->curx - tr_tool->mousex;
-                  newpos_y[i] = oldpos_y[i] + tr_tool->cury - tr_tool->mousey;
-                }
-              break;
-
-            case 2:
-              /* rotate and keep-aspect-scale */
-              scale = calc_len (newpos_x[active_handle] - fixed_handles_x[0],
-                                newpos_y[active_handle] - fixed_handles_y[0])
-                / calc_len (oldpos_x[active_handle] - fixed_handles_x[0],
-                            oldpos_y[active_handle] - fixed_handles_y[0]);
-
-              angle = calc_angle (oldpos_x[active_handle] - fixed_handles_x[0],
-                                  oldpos_y[active_handle] - fixed_handles_y[0],
-                                  newpos_x[active_handle] - fixed_handles_x[0],
-                                  newpos_y[active_handle] - fixed_handles_y[0]);
-
-              angle_sin = sin (angle);
-              angle_cos = cos (angle);
-
-              for (i = 2; i < 4; i++)
-                {
-                  newpos_x[i] = fixed_handles_x[0]
-                    + scale * (angle_cos * (oldpos_x[i]-fixed_handles_x[0])
-                               + angle_sin * (oldpos_y[i]-fixed_handles_y[0]) );
-                  newpos_y[i] = fixed_handles_y[0]
-                    + scale * (-angle_sin * (oldpos_x[i]-fixed_handles_x[0])
-                               + angle_cos * (oldpos_y[i]-fixed_handles_y[0]) );
-                }
-              break;
-
-            case 3:
-              /* shear and non-aspect-scale */
-              scale = calc_lineintersect_ratio (oldpos_x[3], oldpos_y[3],
-                                                oldpos_x[active_handle], oldpos_y[active_handle],
-                                                fixed_handles_x[0], fixed_handles_y[0],
-                                                fixed_handles_x[1], fixed_handles_y[1]);
-
-              newpos_x[3] = oldpos_x[3] + scale * (tr_tool->curx - tr_tool->mousex);
-              newpos_y[3] = oldpos_y[3] + scale * (tr_tool->cury - tr_tool->mousey);
-              break;
-            }
-
-          for (i = 0; i < 4; i++)
-            {
-              tr_tool->trans_info[X0 + 2 * i] = newpos_x[i];
-              tr_tool->trans_info[Y0 + 2 * i] = newpos_y[i];
-            }
-        }
-    }
+  GimpTool             *tool    = GIMP_TOOL (tr_tool);
+  GimpTransformOptions *options = GIMP_TRANSFORM_TOOL_GET_OPTIONS (tr_tool);
+  GimpDisplayShell     *shell   = gimp_display_get_shell (tool->display);
+  GimpToolWidget       *widget;
+
+  widget = gimp_tool_handle_grid_new (shell,
+                                      tr_tool->x1,
+                                      tr_tool->y1,
+                                      tr_tool->x2,
+                                      tr_tool->y2);
+
+  g_object_set (widget,
+                "n-handles", (gint) tr_tool->trans_info[N_HANDLES],
+                "orig-x1",   tr_tool->trans_info[OX0],
+                "orig-y1",   tr_tool->trans_info[OY0],
+                "orig-x2",   tr_tool->trans_info[OX1],
+                "orig-y2",   tr_tool->trans_info[OY1],
+                "orig-x3",   tr_tool->trans_info[OX2],
+                "orig-y3",   tr_tool->trans_info[OY2],
+                "orig-x4",   tr_tool->trans_info[OX3],
+                "orig-y4",   tr_tool->trans_info[OY3],
+                "trans-x1",  tr_tool->trans_info[X0],
+                "trans-y1",  tr_tool->trans_info[Y0],
+                "trans-x2",  tr_tool->trans_info[X1],
+                "trans-y2",  tr_tool->trans_info[Y1],
+                "trans-x3",  tr_tool->trans_info[X2],
+                "trans-y3",  tr_tool->trans_info[Y2],
+                "trans-x4",  tr_tool->trans_info[X3],
+                "trans-y4",  tr_tool->trans_info[Y3],
+                NULL);
+
+  g_object_set (widget,
+                "guide-type", options->grid_type,
+                "n-guides",   options->grid_size,
+                NULL);
+
+  g_signal_connect (widget, "changed",
+                    G_CALLBACK (gimp_handle_transform_tool_widget_changed),
+                    tr_tool);
+
+  return widget;
 }
 
 static void
 gimp_handle_transform_tool_recalc_matrix (GimpTransformTool *tr_tool,
                                           GimpToolWidget    *widget)
 {
-  GimpHandleTransformTool *ht_tool = GIMP_HANDLE_TRANSFORM_TOOL (tr_tool);
-
-  if (ht_tool->matrix_recalculation)
-    {
-      gimp_matrix3_identity (&tr_tool->transform);
-      gimp_transform_matrix_handles (&tr_tool->transform,
-                                     tr_tool->trans_info[OX0],
-                                     tr_tool->trans_info[OY0],
-                                     tr_tool->trans_info[OX1],
-                                     tr_tool->trans_info[OY1],
-                                     tr_tool->trans_info[OX2],
-                                     tr_tool->trans_info[OY2],
-                                     tr_tool->trans_info[OX3],
-                                     tr_tool->trans_info[OY3],
-                                     tr_tool->trans_info[X0],
-                                     tr_tool->trans_info[Y0],
-                                     tr_tool->trans_info[X1],
-                                     tr_tool->trans_info[Y1],
-                                     tr_tool->trans_info[X2],
-                                     tr_tool->trans_info[Y2],
-                                     tr_tool->trans_info[X3],
-                                     tr_tool->trans_info[Y3]);
-    }
+  gimp_matrix3_identity (&tr_tool->transform);
+  gimp_transform_matrix_handles (&tr_tool->transform,
+                                 tr_tool->trans_info[OX0],
+                                 tr_tool->trans_info[OY0],
+                                 tr_tool->trans_info[OX1],
+                                 tr_tool->trans_info[OY1],
+                                 tr_tool->trans_info[OX2],
+                                 tr_tool->trans_info[OY2],
+                                 tr_tool->trans_info[OX3],
+                                 tr_tool->trans_info[OY3],
+                                 tr_tool->trans_info[X0],
+                                 tr_tool->trans_info[Y0],
+                                 tr_tool->trans_info[X1],
+                                 tr_tool->trans_info[Y1],
+                                 tr_tool->trans_info[X2],
+                                 tr_tool->trans_info[Y2],
+                                 tr_tool->trans_info[X3],
+                                 tr_tool->trans_info[Y3]);
+
+  if (widget)
+    g_object_set (widget,
+                  "transform", &tr_tool->transform,
+                  "n-handles", (gint) tr_tool->trans_info[N_HANDLES],
+                  "orig-x1",   tr_tool->trans_info[OX0],
+                  "orig-y1",   tr_tool->trans_info[OY0],
+                  "orig-x2",   tr_tool->trans_info[OX1],
+                  "orig-y2",   tr_tool->trans_info[OY1],
+                  "orig-x3",   tr_tool->trans_info[OX2],
+                  "orig-y3",   tr_tool->trans_info[OY2],
+                  "orig-x4",   tr_tool->trans_info[OX3],
+                  "orig-y4",   tr_tool->trans_info[OY3],
+                  "trans-x1",  tr_tool->trans_info[X0],
+                  "trans-y1",  tr_tool->trans_info[Y0],
+                  "trans-x2",  tr_tool->trans_info[X1],
+                  "trans-y2",  tr_tool->trans_info[Y1],
+                  "trans-x3",  tr_tool->trans_info[X2],
+                  "trans-y3",  tr_tool->trans_info[Y2],
+                  "trans-x4",  tr_tool->trans_info[X3],
+                  "trans-y4",  tr_tool->trans_info[Y3],
+                  NULL);
 }
 
 static gchar *
@@ -637,253 +408,33 @@ gimp_handle_transform_tool_get_undo_desc (GimpTransformTool *tr_tool)
   return g_strdup (C_("undo-type", "Handle transform"));
 }
 
-static TransformAction
-gimp_handle_transform_tool_pick_function (GimpTransformTool *tr_tool,
-                                          const GimpCoords  *coords,
-                                          GdkModifierType    state,
-                                          GimpDisplay       *display)
-{
-  TransformAction i;
-
-  for (i = TRANSFORM_HANDLE_N; i < TRANSFORM_HANDLE_N + 4; i++)
-    {
-      if (tr_tool->handles[i] &&
-          gimp_canvas_item_hit (tr_tool->handles[i], coords->x, coords->y))
-        {
-          return i;
-        }
-    }
-
-  return TRANSFORM_HANDLE_NONE;
-}
-
-static void
-gimp_handle_transform_tool_cursor_update (GimpTransformTool  *tr_tool,
-                                          GimpCursorType     *cursor,
-                                          GimpCursorModifier *modifier)
-{
-  GimpHandleTransformOptions *options;
-  GimpToolCursorType          tool_cursor = GIMP_TOOL_CURSOR_NONE;
-
-  options = GIMP_HANDLE_TRANSFORM_TOOL_GET_OPTIONS (tr_tool);
-
-  *cursor   = GIMP_CURSOR_CROSSHAIR_SMALL;
-  *modifier = GIMP_CURSOR_MODIFIER_NONE;
-
-  /* do not show modifiers when the tool isn't active */
-  if (! gimp_draw_tool_is_active (GIMP_DRAW_TOOL (tr_tool)))
-    return;
-
-  switch (options->handle_mode)
-    {
-    case GIMP_HANDLE_MODE_ADD_TRANSFORM:
-      if (tr_tool->function > TRANSFORM_HANDLE_NONE)
-        {
-          switch ((gint) tr_tool->trans_info[N_HANDLES])
-            {
-            case 1:
-              tool_cursor = GIMP_TOOL_CURSOR_MOVE;
-              break;
-            case 2:
-              tool_cursor = GIMP_TOOL_CURSOR_ROTATE;
-              break;
-            case 3:
-              tool_cursor = GIMP_TOOL_CURSOR_SHEAR;
-              break;
-            case 4:
-              tool_cursor = GIMP_TOOL_CURSOR_PERSPECTIVE;
-              break;
-            }
-        }
-      else
-        {
-          if ((gint) tr_tool->trans_info[N_HANDLES] < 4)
-            *modifier = GIMP_CURSOR_MODIFIER_PLUS;
-          else
-            *modifier = GIMP_CURSOR_MODIFIER_BAD;
-        }
-      break;
-
-    case GIMP_HANDLE_MODE_MOVE:
-      if (tr_tool->function > TRANSFORM_HANDLE_NONE)
-        *modifier = GIMP_CURSOR_MODIFIER_MOVE;
-      else
-        *modifier = GIMP_CURSOR_MODIFIER_BAD;
-      break;
-
-    case GIMP_HANDLE_MODE_REMOVE:
-      if (tr_tool->function > TRANSFORM_HANDLE_NONE)
-        *modifier = GIMP_CURSOR_MODIFIER_MINUS;
-      else
-        *modifier = GIMP_CURSOR_MODIFIER_BAD;
-      break;
-    }
-
-  gimp_tool_control_set_tool_cursor (GIMP_TOOL (tr_tool)->control,
-                                     tool_cursor);
-}
-
 static void
-gimp_handle_transform_tool_draw_gui (GimpTransformTool *tr_tool)
-{
-  GimpDrawTool *draw_tool = GIMP_DRAW_TOOL (tr_tool);
-  gint          i;
-
-#if 0
-  /* show additional points for debugging */
-  for (i = tr_tool->trans_info[N_HANDLES]; i < 4; i++)
-    {
-      gimp_draw_tool_add_handle (draw_tool,
-                                 GIMP_HANDLE_FILLED_CIRCLE,
-                                 tr_tool->trans_info[X0 + 2 * i],
-                                 tr_tool->trans_info[Y0 + 2 * i],
-                                 GIMP_TOOL_HANDLE_SIZE_CIRCLE,
-                                 GIMP_TOOL_HANDLE_SIZE_CIRCLE,
-                                 GIMP_HANDLE_ANCHOR_CENTER);
-      gimp_draw_tool_add_handle (draw_tool,
-                                 GIMP_HANDLE_FILLED_DIAMOND,
-                                 tr_tool->trans_info[OX0 + 2 * i],
-                                 tr_tool->trans_info[OY0 + 2 * i],
-                                 GIMP_TOOL_HANDLE_SIZE_CIRCLE,
-                                 GIMP_TOOL_HANDLE_SIZE_CIRCLE,
-                                 GIMP_HANDLE_ANCHOR_CENTER);
-      }
-
-  for (i = 0; i < tr_tool->trans_info[N_HANDLES]; i++)
-    {
-      tr_tool->handles[TRANSFORM_HANDLE_N + i] =
-        gimp_draw_tool_add_handle (draw_tool,
-                                   GIMP_HANDLE_DIAMOND,
-                                   tr_tool->trans_info[OX0 + 2 * i],
-                                   tr_tool->trans_info[OY0 + 2 * i],
-                                   GIMP_TOOL_HANDLE_SIZE_CIRCLE,
-                                   GIMP_TOOL_HANDLE_SIZE_CIRCLE,
-                                   GIMP_HANDLE_ANCHOR_CENTER);
-    }
-#endif
-
-  for (i = 0; i < tr_tool->trans_info[N_HANDLES]; i++)
-    {
-      tr_tool->handles[TRANSFORM_HANDLE_N + i] =
-        gimp_draw_tool_add_handle (draw_tool,
-                                   GIMP_HANDLE_CIRCLE,
-                                   tr_tool->trans_info[X0 + 2 * i],
-                                   tr_tool->trans_info[Y0 + 2 * i],
-                                   GIMP_TOOL_HANDLE_SIZE_CIRCLE,
-                                   GIMP_TOOL_HANDLE_SIZE_CIRCLE,
-                                   GIMP_HANDLE_ANCHOR_CENTER);
-    }
-}
-
-/* check if a handle is not on the connection line of two other handles */
-static gboolean
-is_handle_position_valid (GimpTransformTool *tr_tool,
-                          gint               active_handle)
+gimp_handle_transform_tool_widget_changed (GimpToolWidget    *widget,
+                                           GimpTransformTool *tr_tool)
 {
-  gint i, j, k;
-
-  for (i = 0; i < 2; i++)
-    {
-      for (j = i + 1; j < 3; j++)
-        {
-          for (k = j + 1; i < 4; i++)
-            {
-              if (active_handle == i ||
-                  active_handle == j ||
-                  active_handle == k)
-                {
-                  if ((tr_tool->trans_info[X0 + 2 * i] -
-                       tr_tool->trans_info[X0 + 2 * j]) *
-                      (tr_tool->trans_info[Y0 + 2 * j] -
-                       tr_tool->trans_info[Y0 + 2 * k]) ==
-
-                      (tr_tool->trans_info[X0 + 2 * j] -
-                       tr_tool->trans_info[X0 + 2 * k]) *
-                      (tr_tool->trans_info[Y0 + 2 * i] -
-                       tr_tool->trans_info[Y0 + 2 * j]))
-                    {
-                      return FALSE;
-                    }
-                }
-            }
-        }
-    }
-
-  return TRUE;
-}
-
-/* three handles on a line causes problems.
- * Let's move the new handle around a bit to find a better position */
-static void
-handle_micro_move (GimpTransformTool *tr_tool,
-                   gint               active_handle)
-{
-  gdouble posx = tr_tool->trans_info[X0 + 2 * active_handle];
-  gdouble posy = tr_tool->trans_info[Y0 + 2 * active_handle];
-  gdouble dx, dy;
-
-  for (dx = -0.1; dx < 0.11; dx += 0.1)
-    {
-      tr_tool->trans_info[X0 + 2 * active_handle] = posx + dx;
-
-      for (dy = -0.1; dy < 0.11; dy += 0.1)
-        {
-          tr_tool->trans_info[Y0 + 2 * active_handle] = posy + dy;
-
-          if (is_handle_position_valid (tr_tool, active_handle))
-            {
-              return;
-            }
-        }
-    }
-}
-
-/* finds the clockwise angle between the vectors given, 0-2π */
-static inline gdouble
-calc_angle (gdouble ax,
-            gdouble ay,
-            gdouble bx,
-            gdouble by)
-{
-  gdouble angle;
-  gdouble direction;
-  gdouble length = sqrt ((ax * ax + ay * ay) * (bx * bx + by * by));
-
-  angle = acos ((ax * bx + ay * by) / length);
-  direction = ax * by - ay * bx;
-
-  return ((direction < 0) ? angle : 2 * G_PI - angle);
-}
-
-static inline gdouble
-calc_len  (gdouble a,
-           gdouble b)
-{
-  return sqrt (a * a + b * b);
-}
-
-
-/* imagine two lines, one through the points p1 and p2, the other one
- * through the points q1 and q2. Find the intersection point r.
- * Calculate (distance p1 to r)/(distance p2 to r)
- */
-static inline gdouble
-calc_lineintersect_ratio (gdouble p1x, gdouble p1y,
-                          gdouble p2x, gdouble p2y,
-                          gdouble q1x, gdouble q1y,
-                          gdouble q2x, gdouble q2y)
-{
-  gdouble denom, u;
-
-  denom = (q2y - q1y) * (p2x - p1x) - (q2x - q1x) * (p2y - p1y);
-  if (denom == 0.0)
-    {
-      /* u is infinite, so u/(u-1) is 1 */
-      return 1.0;
-    }
-
-  u = (q2y - q1y) * (q1x - p1x) - (q1y - p1y) * (q2x - q1x);
-  u /= denom;
-
-  return u / (u - 1);
+  gint n_handles;
+
+  g_object_get (widget,
+                "n-handles", &n_handles,
+                "orig-x1",   &tr_tool->trans_info[OX0],
+                "orig-y1",   &tr_tool->trans_info[OY0],
+                "orig-x2",   &tr_tool->trans_info[OX1],
+                "orig-y2",   &tr_tool->trans_info[OY1],
+                "orig-x3",   &tr_tool->trans_info[OX2],
+                "orig-y3",   &tr_tool->trans_info[OY2],
+                "orig-x4",   &tr_tool->trans_info[OX3],
+                "orig-y4",   &tr_tool->trans_info[OY3],
+                "trans-x1",  &tr_tool->trans_info[X0],
+                "trans-y1",  &tr_tool->trans_info[Y0],
+                "trans-x2",  &tr_tool->trans_info[X1],
+                "trans-y2",  &tr_tool->trans_info[Y1],
+                "trans-x3",  &tr_tool->trans_info[X2],
+                "trans-y3",  &tr_tool->trans_info[Y2],
+                "trans-x4",  &tr_tool->trans_info[X3],
+                "trans-y4",  &tr_tool->trans_info[Y3],
+                NULL);
+
+  tr_tool->trans_info[N_HANDLES] = n_handles;
+
+  gimp_transform_tool_recalc_matrix (tr_tool, NULL);
 }
diff --git a/app/tools/gimphandletransformtool.h b/app/tools/gimphandletransformtool.h
index df6157e..5e9b860 100644
--- a/app/tools/gimphandletransformtool.h
+++ b/app/tools/gimphandletransformtool.h
@@ -40,7 +40,6 @@ struct _GimpHandleTransformTool
   GimpTransformTool        parent_instance;
 
   GtkWidget               *label[3][3];
-  gboolean                 matrix_recalculation;
 
   GimpTransformHandleMode  saved_handle_mode;
 };


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