[gimp] Bug 753412 - New Canvas rotation feature rotates brush.
- From: N/A <ell src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] Bug 753412 - New Canvas rotation feature rotates brush.
- Date: Fri, 22 Dec 2017 22:52:57 +0000 (UTC)
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, ¤t_coords);
gimp_paint_core_set_last_coords (paint_core, ¤t_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]