[gimp/gimp-2-10] app: update GimpToolCompass when display is scaled/rotated



commit e13eb13bc40d3f99b5f70523014a1c0b2e9492cc
Author: Ell <ell_se yahoo com>
Date:   Mon Jul 16 04:42:14 2018 -0400

    app: update GimpToolCompass when display is scaled/rotated
    
    In GimpToolCompass (and, as a consequence, in the measure tool),
    update the measured angle when the shell is scaled, rotated, or
    flipped, so that we always satisfy the compass's constrains, and
    render correctly.
    
    (cherry picked from commit a810c6b60b83b17babdbb79c59ef9375e92b6843)

 app/display/gimptoolcompass.c | 40 ++++++++++++++++++++++++++++++++++------
 1 file changed, 34 insertions(+), 6 deletions(-)
---
diff --git a/app/display/gimptoolcompass.c b/app/display/gimptoolcompass.c
index f1cba0d312..6328e8123a 100644
--- a/app/display/gimptoolcompass.c
+++ b/app/display/gimptoolcompass.c
@@ -292,12 +292,20 @@ gimp_tool_compass_constructed (GObject *object)
 {
   GimpToolCompass        *compass = GIMP_TOOL_COMPASS (object);
   GimpToolWidget         *widget  = GIMP_TOOL_WIDGET (object);
+  GimpDisplayShell       *shell   = gimp_tool_widget_get_shell (widget);
   GimpToolCompassPrivate *private = compass->private;
   GimpCanvasGroup        *stroke_group;
   gint                    i;
 
   G_OBJECT_CLASS (parent_class)->constructed (object);
 
+  g_signal_connect_object (shell, "scaled",
+                           G_CALLBACK (gimp_tool_compass_changed),
+                           compass, G_CONNECT_SWAPPED);
+  g_signal_connect_object (shell, "rotated",
+                           G_CALLBACK (gimp_tool_compass_changed),
+                           compass, G_CONNECT_SWAPPED);
+
   stroke_group = gimp_tool_widget_add_stroke_group (widget);
 
   gimp_tool_widget_push_group (widget, stroke_group);
@@ -1069,6 +1077,8 @@ gimp_tool_compass_update_angle (GimpToolCompass        *compass,
   GimpImage              *image   = gimp_display_get_image (shell->display);
   GimpVector2             radius1;
   GimpVector2             radius2;
+  gdouble                 pixel_angle;
+  gdouble                 unit_angle;
   gdouble                 xres;
   gdouble                 yres;
 
@@ -1112,8 +1122,8 @@ gimp_tool_compass_update_angle (GimpToolCompass        *compass,
   radius1 = private->radius1;
   radius2 = private->radius2;
 
-  private->pixel_angle = atan2 (gimp_vector2_cross_product (&radius1, &radius2).x,
-                                gimp_vector2_inner_product (&radius1, &radius2));
+  pixel_angle = atan2 (gimp_vector2_cross_product (&radius1, &radius2).x,
+                       gimp_vector2_inner_product (&radius1, &radius2));
 
   radius1.x /= xres;
   radius1.y /= yres;
@@ -1121,19 +1131,21 @@ gimp_tool_compass_update_angle (GimpToolCompass        *compass,
   radius2.x /= xres;
   radius2.y /= yres;
 
-  private->unit_angle = atan2 (gimp_vector2_cross_product (&radius1, &radius2).x,
-                               gimp_vector2_inner_product (&radius1, &radius2));
+  unit_angle = atan2 (gimp_vector2_cross_product (&radius1, &radius2).x,
+                      gimp_vector2_inner_product (&radius1, &radius2));
 
   if (shell->dot_for_dot)
-    private->display_angle = private->pixel_angle;
+    private->display_angle = pixel_angle;
   else
-    private->display_angle = private->unit_angle;
+    private->display_angle = unit_angle;
 
   if (private->n_points == 2)
     {
       if (! flip && fabs (private->display_angle) > G_PI / 2.0 + EPSILON)
         {
           gimp_tool_compass_update_angle (compass, orientation, TRUE);
+
+          return;
         }
       else if (orientation == GIMP_COMPASS_ORIENTATION_AUTO &&
                fabs (private->display_angle) > G_PI / 4.0 + EPSILON)
@@ -1141,8 +1153,24 @@ gimp_tool_compass_update_angle (GimpToolCompass        *compass,
           gimp_tool_compass_update_angle (compass,
                                           GIMP_COMPASS_ORIENTATION_VERTICAL,
                                           FALSE);
+
+          return;
         }
     }
+
+  if (pixel_angle != private->pixel_angle)
+    {
+      private->pixel_angle = pixel_angle;
+
+      g_object_notify (G_OBJECT (compass), "pixel-angle");
+    }
+
+  if (unit_angle != private->unit_angle)
+    {
+      private->unit_angle = unit_angle;
+
+      g_object_notify (G_OBJECT (compass), "unit-angle");
+    }
 }
 
 


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