[gimp] Bug 753412 - New Canvas rotation feature rotates brush.



commit eded91e118852434e4647d45b95d7c2ce0eb5053
Author: Ell <ell_se yahoo com>
Date:   Fri Dec 22 16:59:13 2017 -0500

    Bug 753412 - New Canvas rotation feature rotates brush.
    
    Replace the "lock brush size to zoom" paint option with a "lock
    brush to view" option, which links the entire brush transform to
    the view transform, so that the brush remains invariant in display
    space under scaling, rotation, and reflection.

 app/core/core-types.h                    |    4 +-
 app/core/gimpbrush.c                     |    6 +-
 app/core/gimpcoords-interpolate.c        |    6 ++-
 app/core/gimpdynamicsoutput.c            |   15 +++++-
 app/display/gimpdisplayshell-transform.c |    8 +++-
 app/paint/gimpbrushcore.c                |   15 +++++-
 app/paint/gimppaintoptions.c             |   71 +++++++++++++++---------------
 app/paint/gimppaintoptions.h             |    3 +-
 app/paint/gimpsmudge.c                   |    2 +-
 app/tools/gimppaintoptions-gui.c         |    5 +-
 10 files changed, 83 insertions(+), 52 deletions(-)
---
diff --git a/app/core/core-types.h b/app/core/core-types.h
index 9ba95a4..a7f6f33 100644
--- a/app/core/core-types.h
+++ b/app/core/core-types.h
@@ -249,8 +249,10 @@ struct _GimpCoords
   gdouble  wheel;
   gdouble  velocity;
   gdouble  direction;
-  gdouble  xscale; /* the view scale */
+  gdouble  xscale;  /* the view scale                */
   gdouble  yscale;
+  gdouble  angle;   /* the view rotation angle       */
+  gboolean reflect; /* whether the view is reflected */
   gboolean extended;
 };
 
diff --git a/app/core/gimpbrush.c b/app/core/gimpbrush.c
index 354824a..ac998d5 100644
--- a/app/core/gimpbrush.c
+++ b/app/core/gimpbrush.c
@@ -582,9 +582,9 @@ gimp_brush_transform_size (GimpBrush     *brush,
   g_return_if_fail (width != NULL);
   g_return_if_fail (height != NULL);
 
-  if (scale        == 1.0 &&
-      aspect_ratio == 0.0 &&
-      ((angle == 0.0) || (angle == 0.5) || (angle == 1.0)))
+  if (scale             == 1.0 &&
+      aspect_ratio      == 0.0 &&
+      fmod (angle, 0.5) == 0.0)
     {
       *width  = gimp_temp_buf_get_width  (brush->priv->mask);
       *height = gimp_temp_buf_get_height (brush->priv->mask);
diff --git a/app/core/gimpcoords-interpolate.c b/app/core/gimpcoords-interpolate.c
index 276e713..5859718 100644
--- a/app/core/gimpcoords-interpolate.c
+++ b/app/core/gimpcoords-interpolate.c
@@ -324,8 +324,10 @@ gimp_coords_interpolate_catmull (const GimpCoords   catmul_pt1,
 
       coords.direction = coords.direction - floor (coords.direction);
 
-      coords.xscale = end_coords.xscale;
-      coords.yscale = end_coords.yscale;
+      coords.xscale  = end_coords.xscale;
+      coords.yscale  = end_coords.yscale;
+      coords.angle   = end_coords.angle;
+      coords.reflect = end_coords.reflect;
 
       g_array_append_val (*ret_coords, coords);
 
diff --git a/app/core/gimpdynamicsoutput.c b/app/core/gimpdynamicsoutput.c
index 1389643..48c23db 100644
--- a/app/core/gimpdynamicsoutput.c
+++ b/app/core/gimpdynamicsoutput.c
@@ -553,8 +553,19 @@ gimp_dynamics_output_get_angular_value (GimpDynamicsOutput *output,
 
   if (private->use_direction)
     {
-      total += gimp_curve_map_value (private->direction_curve,
-                                     coords->direction);
+      gdouble angle = gimp_curve_map_value (private->direction_curve,
+                                            coords->direction);
+
+      if (options->brush_lock_to_view)
+        {
+          if (coords->reflect)
+            angle = 0.5 - angle;
+
+          angle -= coords->angle;
+          angle  = fmod (fmod (angle, 1.0) + 1.0, 1.0);
+        }
+
+      total += angle;
       factors++;
     }
 
diff --git a/app/display/gimpdisplayshell-transform.c b/app/display/gimpdisplayshell-transform.c
index 84918ab..8155c04 100644
--- a/app/display/gimpdisplayshell-transform.c
+++ b/app/display/gimpdisplayshell-transform.c
@@ -613,9 +613,13 @@ gimp_display_shell_untransform_coords (GimpDisplayShell *shell,
   image_coords->x /= shell->scale_x;
   image_coords->y /= shell->scale_y;
 
-  image_coords->xscale = shell->scale_x;
-  image_coords->yscale = shell->scale_y;
+  image_coords->xscale  = shell->scale_x;
+  image_coords->yscale  = shell->scale_y;
+  image_coords->angle   = shell->rotate_angle / 360.0;
+  image_coords->reflect = shell->flip_horizontally ^ shell->flip_vertically;
 
+  if (shell->flip_vertically)
+    image_coords->angle += 0.5;
 }
 
 /**
diff --git a/app/paint/gimpbrushcore.c b/app/paint/gimpbrushcore.c
index ba33089..5d192b0 100644
--- a/app/paint/gimpbrushcore.c
+++ b/app/paint/gimpbrushcore.c
@@ -326,7 +326,7 @@ gimp_brush_core_pre_paint (GimpPaintCore    *paint_core,
                                                       paint_options,
                                                       fade_point);
 
-              if (paint_options->brush_zoom &&
+              if (paint_options->brush_lock_to_view &&
                   MAX (current_coords.xscale, current_coords.yscale) > 0)
                 {
                   scale /= MAX (current_coords.xscale, current_coords.yscale);
@@ -740,6 +740,8 @@ gimp_brush_core_interpolate (GimpPaintCore    *paint_core,
       current_coords.direction = temp_direction;
       current_coords.xscale    = last_coords.xscale;
       current_coords.yscale    = last_coords.yscale;
+      current_coords.angle     = last_coords.angle;
+      current_coords.reflect   = last_coords.reflect;
 
       if (core->jitter > 0.0)
         {
@@ -790,6 +792,8 @@ gimp_brush_core_interpolate (GimpPaintCore    *paint_core,
   current_coords.velocity = last_coords.velocity + delta_velocity;
   current_coords.xscale   = last_coords.xscale;
   current_coords.yscale   = last_coords.yscale;
+  current_coords.angle    = last_coords.angle;
+  current_coords.reflect  = last_coords.reflect;
 
   gimp_paint_core_set_current_coords (paint_core, &current_coords);
   gimp_paint_core_set_last_coords (paint_core, &current_coords);
@@ -1500,7 +1504,8 @@ gimp_brush_core_eval_transform_dynamics (GimpBrushCore     *core,
 
       core->scale = paint_options->brush_size / max_side;
 
-      if (paint_options->brush_zoom && MAX (coords->xscale, coords->yscale) > 0)
+      if (paint_options->brush_lock_to_view &&
+          MAX (coords->xscale, coords->yscale) > 0)
         {
           core->scale /= MAX (coords->xscale, coords->yscale);
 
@@ -1519,6 +1524,12 @@ gimp_brush_core_eval_transform_dynamics (GimpBrushCore     *core,
   core->reflect      = FALSE;
   core->hardness     = paint_options->brush_hardness;
 
+  if (paint_options->brush_lock_to_view)
+    {
+      core->angle   += coords->angle;
+      core->reflect  = coords->reflect;
+    }
+
   if (! GIMP_IS_DYNAMICS (core->dynamics))
     return;
 
diff --git a/app/paint/gimppaintoptions.c b/app/paint/gimppaintoptions.c
index e44f4bd..7d94998 100644
--- a/app/paint/gimppaintoptions.c
+++ b/app/paint/gimppaintoptions.c
@@ -40,15 +40,20 @@
 
 
 #define DEFAULT_BRUSH_SIZE              20.0
-#define DEFAULT_BRUSH_ZOOM              FALSE
-
 #define DEFAULT_BRUSH_ASPECT_RATIO      0.0
 #define DEFAULT_BRUSH_ANGLE             0.0
 #define DEFAULT_BRUSH_SPACING           0.1
-
 #define DEFAULT_BRUSH_HARDNESS          1.0 /* Generated brushes have their own */
 #define DEFAULT_BRUSH_FORCE             0.5
 
+#define DEFAULT_BRUSH_LINK_SIZE         TRUE
+#define DEFAULT_BRUSH_LINK_ASPECT_RATIO TRUE
+#define DEFAULT_BRUSH_LINK_ANGLE        TRUE
+#define DEFAULT_BRUSH_LINK_SPACING      TRUE
+#define DEFAULT_BRUSH_LINK_HARDNESS     TRUE
+
+#define DEFAULT_BRUSH_LOCK_TO_VIEW      FALSE
+
 #define DEFAULT_APPLICATION_MODE        GIMP_PAINT_CONSTANT
 #define DEFAULT_HARD                    FALSE
 
@@ -73,12 +78,6 @@
 #define DEFAULT_SMOOTHING_QUALITY       20
 #define DEFAULT_SMOOTHING_FACTOR        50
 
-#define DEFAULT_BRUSH_LINK_SIZE         TRUE
-#define DEFAULT_BRUSH_LINK_ASPECT_RATIO TRUE
-#define DEFAULT_BRUSH_LINK_ANGLE        TRUE
-#define DEFAULT_BRUSH_LINK_SPACING      TRUE
-#define DEFAULT_BRUSH_LINK_HARDNESS     TRUE
-
 enum
 {
   PROP_0,
@@ -88,13 +87,20 @@ enum
   PROP_USE_APPLICATOR, /* temp debug */
 
   PROP_BRUSH_SIZE,
-  PROP_BRUSH_ZOOM,
   PROP_BRUSH_ASPECT_RATIO,
   PROP_BRUSH_ANGLE,
   PROP_BRUSH_SPACING,
   PROP_BRUSH_HARDNESS,
   PROP_BRUSH_FORCE,
 
+  PROP_BRUSH_LINK_SIZE,
+  PROP_BRUSH_LINK_ASPECT_RATIO,
+  PROP_BRUSH_LINK_ANGLE,
+  PROP_BRUSH_LINK_SPACING,
+  PROP_BRUSH_LINK_HARDNESS,
+
+  PROP_BRUSH_LOCK_TO_VIEW,
+
   PROP_APPLICATION_MODE,
   PROP_HARD,
 
@@ -121,13 +127,7 @@ enum
 
   PROP_USE_SMOOTHING,
   PROP_SMOOTHING_QUALITY,
-  PROP_SMOOTHING_FACTOR,
-
-  PROP_BRUSH_LINK_SIZE,
-  PROP_BRUSH_LINK_ASPECT_RATIO,
-  PROP_BRUSH_LINK_ANGLE,
-  PROP_BRUSH_LINK_SPACING,
-  PROP_BRUSH_LINK_HARDNESS
+  PROP_SMOOTHING_FACTOR
 };
 
 
@@ -193,13 +193,6 @@ gimp_paint_options_class_init (GimpPaintOptionsClass *klass)
                            1.0, GIMP_BRUSH_MAX_SIZE, DEFAULT_BRUSH_SIZE,
                            GIMP_PARAM_STATIC_STRINGS);
 
-  GIMP_CONFIG_PROP_BOOLEAN (object_class, PROP_BRUSH_ZOOM,
-                            "brush-zoom",
-                            _("Brush Zoom"),
-                            _("Link brush size with canvas zoom"),
-                            DEFAULT_BRUSH_ZOOM,
-                            GIMP_PARAM_STATIC_STRINGS);
-
   GIMP_CONFIG_PROP_DOUBLE (object_class, PROP_BRUSH_ASPECT_RATIO,
                            "brush-aspect-ratio",
                            _("Aspect Ratio"),
@@ -270,6 +263,13 @@ gimp_paint_options_class_init (GimpPaintOptionsClass *klass)
                             DEFAULT_BRUSH_LINK_HARDNESS,
                             GIMP_PARAM_STATIC_STRINGS);
 
+  GIMP_CONFIG_PROP_BOOLEAN (object_class, PROP_BRUSH_LOCK_TO_VIEW,
+                            "brush-lock-to-view",
+                            _("Lock brush to view"),
+                            _("Keep brush appearance fixed realtive to the view"),
+                            DEFAULT_BRUSH_LOCK_TO_VIEW,
+                            GIMP_PARAM_STATIC_STRINGS);
+
   GIMP_CONFIG_PROP_ENUM (object_class, PROP_APPLICATION_MODE,
                          "application-mode",
                          _("Incremental"),
@@ -493,10 +493,6 @@ gimp_paint_options_set_property (GObject      *object,
       options->brush_size = g_value_get_double (value);
       break;
 
-    case PROP_BRUSH_ZOOM:
-      options->brush_zoom = g_value_get_boolean (value);
-      break;
-
     case PROP_BRUSH_ASPECT_RATIO:
       options->brush_aspect_ratio = g_value_get_double (value);
       break;
@@ -537,6 +533,10 @@ gimp_paint_options_set_property (GObject      *object,
       options->brush_link_hardness = g_value_get_boolean (value);
       break;
 
+    case PROP_BRUSH_LOCK_TO_VIEW:
+      options->brush_lock_to_view = g_value_get_boolean (value);
+      break;
+
     case PROP_APPLICATION_MODE:
       options->application_mode = g_value_get_enum (value);
       break;
@@ -653,10 +653,6 @@ gimp_paint_options_get_property (GObject    *object,
       g_value_set_double (value, options->brush_size);
       break;
 
-    case PROP_BRUSH_ZOOM:
-      g_value_set_boolean (value, options->brush_zoom);
-      break;
-
     case PROP_BRUSH_ASPECT_RATIO:
       g_value_set_double (value, options->brush_aspect_ratio);
       break;
@@ -697,6 +693,10 @@ gimp_paint_options_get_property (GObject    *object,
       g_value_set_boolean (value, options->brush_link_hardness);
       break;
 
+    case PROP_BRUSH_LOCK_TO_VIEW:
+      g_value_set_boolean (value, options->brush_lock_to_view);
+      break;
+
     case PROP_APPLICATION_MODE:
       g_value_set_enum (value, options->application_mode);
       break;
@@ -1110,7 +1110,6 @@ gimp_paint_options_copy_brush_props (GimpPaintOptions *src,
                                      GimpPaintOptions *dest)
 {
   gdouble  brush_size;
-  gboolean brush_zoom;
   gdouble  brush_angle;
   gdouble  brush_aspect_ratio;
   gdouble  brush_spacing;
@@ -1123,12 +1122,13 @@ gimp_paint_options_copy_brush_props (GimpPaintOptions *src,
   gboolean brush_link_spacing;
   gboolean brush_link_hardness;
 
+  gboolean brush_lock_to_view;
+
   g_return_if_fail (GIMP_IS_PAINT_OPTIONS (src));
   g_return_if_fail (GIMP_IS_PAINT_OPTIONS (dest));
 
   g_object_get (src,
                 "brush-size",              &brush_size,
-                "brush-zoom",              &brush_zoom,
                 "brush-angle",             &brush_angle,
                 "brush-aspect-ratio",      &brush_aspect_ratio,
                 "brush-spacing",           &brush_spacing,
@@ -1139,11 +1139,11 @@ gimp_paint_options_copy_brush_props (GimpPaintOptions *src,
                 "brush-link-aspect-ratio", &brush_link_aspect_ratio,
                 "brush-link-spacing",      &brush_link_spacing,
                 "brush-link-hardness",     &brush_link_hardness,
+                "brush-lock-to-view",      &brush_lock_to_view,
                 NULL);
 
   g_object_set (dest,
                 "brush-size",              brush_size,
-                "brush-zoom",              brush_zoom,
                 "brush-angle",             brush_angle,
                 "brush-aspect-ratio",      brush_aspect_ratio,
                 "brush-spacing",           brush_spacing,
@@ -1154,6 +1154,7 @@ gimp_paint_options_copy_brush_props (GimpPaintOptions *src,
                 "brush-link-aspect-ratio", brush_link_aspect_ratio,
                 "brush-link-spacing",      brush_link_spacing,
                 "brush-link-hardness",     brush_link_hardness,
+                "brush-lock-to-view",      brush_lock_to_view,
                 NULL);
 }
 
diff --git a/app/paint/gimppaintoptions.h b/app/paint/gimppaintoptions.h
index bdf00f6..6ae02c0 100644
--- a/app/paint/gimppaintoptions.h
+++ b/app/paint/gimppaintoptions.h
@@ -85,7 +85,6 @@ struct _GimpPaintOptions
   GimpBrush                *brush; /* weak-refed storage for the GUI */
 
   gdouble                   brush_size;
-  gboolean                  brush_zoom;
   gdouble                   brush_angle;
   gdouble                   brush_aspect_ratio;
   gdouble                   brush_spacing;
@@ -98,6 +97,8 @@ struct _GimpPaintOptions
   gboolean                  brush_link_spacing;
   gboolean                  brush_link_hardness;
 
+  gboolean                  brush_lock_to_view;
+
   GimpPaintApplicationMode  application_mode;
   GimpPaintApplicationMode  application_mode_save;
 
diff --git a/app/paint/gimpsmudge.c b/app/paint/gimpsmudge.c
index f414ef5..b15da03 100644
--- a/app/paint/gimpsmudge.c
+++ b/app/paint/gimpsmudge.c
@@ -488,7 +488,7 @@ gimp_smudge_accumulator_size (GimpPaintOptions *paint_options,
   gdouble max_view_scale = 1.0;
   gdouble max_brush_size;
 
-  if (paint_options->brush_zoom)
+  if (paint_options->brush_lock_to_view)
     max_view_scale = MAX (coords->xscale, coords->yscale);
 
   max_brush_size = MIN (paint_options->brush_size / max_view_scale,
diff --git a/app/tools/gimppaintoptions-gui.c b/app/tools/gimppaintoptions-gui.c
index 42f1852..6be8656 100644
--- a/app/tools/gimppaintoptions-gui.c
+++ b/app/tools/gimppaintoptions-gui.c
@@ -253,13 +253,12 @@ gimp_paint_options_gui (GimpToolOptions *tool_options)
       gtk_widget_show (frame);
     }
 
-  /*  the "Link size to zoom" toggle  */
+  /*  the "Lock brush to view" toggle  */
   if (g_type_is_a (tool_type, GIMP_TYPE_BRUSH_TOOL))
     {
       GtkWidget *button;
 
-      button = gimp_prop_check_button_new (config, "brush-zoom",
-                                           _("Lock brush size to zoom"));
+      button = gimp_prop_check_button_new (config, "brush-lock-to-view", NULL);
       gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
       gtk_widget_show (button);
     }


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