gimp r25816 - in trunk: . app/display app/paint app/tools



Author: mitch
Date: Mon May 26 19:52:09 2008
New Revision: 25816
URL: http://svn.gnome.org/viewvc/gimp?rev=25816&view=rev

Log:
2008-05-26  Michael Natterer  <mitch gimp org>

	Applied modified patch from Alexia Death. Addresses bug #534770:

	* app/paint/gimppaintoptions.[ch]: add properties for scaling
	the effects of pressure, velocity and hardness and honor them
	in the various get_dynamic_foo() functions.

	(gimp_paint_options_get_dynamic_size): look at
	pressure_options->size again, that code got lost in one of the
	earlier patches.

	* app/tools/gimppaintoptions-gui.c: add GimpScaleButtons to the
	table for the new properties.

	* app/display/gimpdisplayshell-coords.c: don't let "velocity"
	reach 1.0, use 0.9999 instead.



Modified:
   trunk/ChangeLog
   trunk/app/display/gimpdisplayshell-coords.c
   trunk/app/paint/gimppaintoptions.c
   trunk/app/paint/gimppaintoptions.h
   trunk/app/tools/gimppaintoptions-gui.c

Modified: trunk/app/display/gimpdisplayshell-coords.c
==============================================================================
--- trunk/app/display/gimpdisplayshell-coords.c	(original)
+++ trunk/app/display/gimpdisplayshell-coords.c	Mon May 26 19:52:09 2008
@@ -279,8 +279,8 @@
                               coords->velocity *
                               MIN (SMOOTH_FACTOR, coords->velocity));
 
-          /* Speed needs upper limit */
-          coords->velocity = MIN (coords->velocity, 1.0);
+          /* Speed needs upper limit but allowing it to be 1.0 is no good in tools*/
+          coords->velocity = MIN (coords->velocity, 0.9999);
         }
       /* High speed -> less smooth*/
       inertia_factor *= (1 - coords->velocity);

Modified: trunk/app/paint/gimppaintoptions.c
==============================================================================
--- trunk/app/paint/gimppaintoptions.c	(original)
+++ trunk/app/paint/gimppaintoptions.c	Mon May 26 19:52:09 2008
@@ -46,6 +46,7 @@
 #define DEFAULT_PRESSURE_SIZE         FALSE
 #define DEFAULT_PRESSURE_INVERSE_SIZE FALSE
 #define DEFAULT_PRESSURE_COLOR        FALSE
+#define DEFAULT_PRESSURE_PRESCALE     1.0
 
 #define DEFAULT_VELOCITY_OPACITY      FALSE
 #define DEFAULT_VELOCITY_HARDNESS     FALSE
@@ -53,6 +54,7 @@
 #define DEFAULT_VELOCITY_SIZE         TRUE
 #define DEFAULT_VELOCITY_INVERSE_SIZE FALSE
 #define DEFAULT_VELOCITY_COLOR        FALSE
+#define DEFAULT_VELOCITY_PRESCALE     1.0
 
 #define DEFAULT_RANDOM_OPACITY        FALSE
 #define DEFAULT_RANDOM_HARDNESS       FALSE
@@ -60,6 +62,7 @@
 #define DEFAULT_RANDOM_SIZE           FALSE
 #define DEFAULT_RANDOM_INVERSE_SIZE   FALSE
 #define DEFAULT_RANDOM_COLOR          FALSE
+#define DEFAULT_RANDOM_PRESCALE       1.0
 
 #define DEFAULT_USE_FADE              FALSE
 #define DEFAULT_FADE_LENGTH           100.0
@@ -92,6 +95,7 @@
   PROP_PRESSURE_SIZE,
   PROP_PRESSURE_INVERSE_SIZE,
   PROP_PRESSURE_COLOR,
+  PROP_PRESSURE_PRESCALE,
 
   PROP_VELOCITY_OPACITY,
   PROP_VELOCITY_HARDNESS,
@@ -99,6 +103,7 @@
   PROP_VELOCITY_SIZE,
   PROP_VELOCITY_INVERSE_SIZE,
   PROP_VELOCITY_COLOR,
+  PROP_VELOCITY_PRESCALE,
 
   PROP_RANDOM_OPACITY,
   PROP_RANDOM_HARDNESS,
@@ -106,6 +111,7 @@
   PROP_RANDOM_SIZE,
   PROP_RANDOM_INVERSE_SIZE,
   PROP_RANDOM_COLOR,
+  PROP_RANDOM_PRESCALE,
 
   PROP_USE_FADE,
   PROP_FADE_LENGTH,
@@ -142,8 +148,11 @@
                                                     GParamSpec   *pspec);
 
 static gdouble gimp_paint_options_get_dynamics_mix (gdouble       mix1,
+                                                    gdouble       mix1_scale,
                                                     gdouble       mix2,
-                                                    gdouble       mix3);
+                                                    gdouble       mix2_scale,
+                                                    gdouble       mix3,
+                                                    gdouble       mix3_scale);
 
 
 G_DEFINE_TYPE (GimpPaintOptions, gimp_paint_options, GIMP_TYPE_TOOL_OPTIONS)
@@ -211,6 +220,10 @@
                                     "pressure-inverse-size", NULL,
                                     DEFAULT_PRESSURE_INVERSE_SIZE,
                                     GIMP_PARAM_STATIC_STRINGS);
+  GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_PRESSURE_PRESCALE,
+                                   "pressure-prescale", NULL,
+                                   0.0, 1.0, DEFAULT_PRESSURE_PRESCALE,
+                                   GIMP_PARAM_STATIC_STRINGS);
 
   GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_VELOCITY_OPACITY,
                                     "velocity-opacity", NULL,
@@ -236,6 +249,10 @@
                                     "velocity-inverse-size", NULL,
                                     DEFAULT_VELOCITY_INVERSE_SIZE,
                                     GIMP_PARAM_STATIC_STRINGS);
+  GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_VELOCITY_PRESCALE,
+                                   "velocity-prescale", NULL,
+                                   0.0, 1.0, DEFAULT_VELOCITY_PRESCALE,
+                                   GIMP_PARAM_STATIC_STRINGS);
 
   GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_RANDOM_OPACITY,
                                     "random-opacity", NULL,
@@ -261,6 +278,10 @@
                                     "random-inverse-size", NULL,
                                     DEFAULT_RANDOM_INVERSE_SIZE,
                                     GIMP_PARAM_STATIC_STRINGS);
+  GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_RANDOM_PRESCALE,
+                                   "random-prescale", NULL,
+                                   0.0, 1.0, DEFAULT_RANDOM_PRESCALE,
+                                   GIMP_PARAM_STATIC_STRINGS);
 
   GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_USE_FADE,
                                     "use-fade", NULL,
@@ -426,6 +447,9 @@
     case PROP_PRESSURE_COLOR:
       pressure_options->color = g_value_get_boolean (value);
       break;
+    case PROP_PRESSURE_PRESCALE:
+      pressure_options->prescale = g_value_get_double (value);
+      break;
 
     case PROP_VELOCITY_OPACITY:
       velocity_options->opacity = g_value_get_boolean (value);
@@ -445,6 +469,9 @@
     case PROP_VELOCITY_COLOR:
       velocity_options->color = g_value_get_boolean (value);
       break;
+    case PROP_VELOCITY_PRESCALE:
+      velocity_options->prescale = g_value_get_double (value);
+      break;
 
     case PROP_RANDOM_OPACITY:
       random_options->opacity = g_value_get_boolean (value);
@@ -464,6 +491,9 @@
     case PROP_RANDOM_COLOR:
       random_options->color = g_value_get_boolean (value);
       break;
+    case PROP_RANDOM_PRESCALE:
+      random_options->prescale = g_value_get_double (value);
+      break;
 
     case PROP_USE_FADE:
       fade_options->use_fade = g_value_get_boolean (value);
@@ -577,6 +607,9 @@
     case PROP_PRESSURE_COLOR:
       g_value_set_boolean (value, pressure_options->color);
       break;
+    case PROP_PRESSURE_PRESCALE:
+      g_value_set_double (value, pressure_options->prescale);
+      break;
 
     case PROP_VELOCITY_OPACITY:
       g_value_set_boolean (value, velocity_options->opacity);
@@ -596,6 +629,9 @@
     case PROP_VELOCITY_COLOR:
       g_value_set_boolean (value, velocity_options->color);
       break;
+    case PROP_VELOCITY_PRESCALE:
+      g_value_set_double (value, velocity_options->prescale);
+      break;
 
     case PROP_RANDOM_OPACITY:
       g_value_set_boolean (value, random_options->opacity);
@@ -615,6 +651,9 @@
     case PROP_RANDOM_COLOR:
       g_value_set_boolean (value, random_options->color);
       break;
+    case PROP_RANDOM_PRESCALE:
+      g_value_set_double (value, random_options->prescale);
+      break;
 
     case PROP_USE_FADE:
       g_value_set_boolean (value, fade_options->use_fade);
@@ -899,34 +938,44 @@
  */
 static gdouble
 gimp_paint_options_get_dynamics_mix (gdouble mix1,
+                                     gdouble mix1_scale,
                                      gdouble mix2,
-                                     gdouble mix3)
+                                     gdouble mix2_scale,
+                                     gdouble mix3,
+                                     gdouble mix3_scale)
 {
-  gdouble mixpv = 0.0;
-  gint    dyn   = 0;
+  gdouble scale_sum = 0.0;
+  gdouble result    = 1.0;
+
+  if (mix1 >= 0.0)
+    {
+      scale_sum += fabs (mix1_scale);
+    }
+  else mix1 = 0.0;
 
-  if (mix1 >= 0)
+  if (mix2 >= 0.0)
     {
-      mixpv += mix1;
-      dyn++;
+      scale_sum += fabs (mix2_scale);
     }
+  else mix2 = 0.0;
 
-  if (mix2 >= 0)
+  if (mix3 >= 0.0)
     {
-      mixpv += mix2;
-      dyn++;
+      scale_sum += fabs (mix3_scale);
     }
+  else mix3 = 0.0;
 
-  if (mix3 >= 0)
+  if (scale_sum > 0.0)
     {
-      mixpv += mix3;
-      dyn++;
+      result = (mix1 * mix1_scale) / scale_sum +
+               (mix2 * mix2_scale) / scale_sum +
+               (mix3 * mix3_scale) / scale_sum;
     }
 
-  if (dyn == 0)
-    return 1.0;
-  else
-    return mixpv / (gdouble) dyn;
+  if (result < 0.0)
+    result = 1.0 + result;
+
+  return MAX (0.0, result);
 }
 
 gdouble
@@ -952,10 +1001,16 @@
 
       if (paint_options->velocity_options->opacity)
         velocity = GIMP_PAINT_VELOCITY_SCALE * (1 - coords->velocity);
+
       if (paint_options->random_options->opacity)
         random = coords->random;
 
-      opacity = gimp_paint_options_get_dynamics_mix (pressure, velocity, random);
+      opacity = gimp_paint_options_get_dynamics_mix (pressure,
+                                                     paint_options->pressure_options->prescale,
+                                                     velocity,
+                                                     paint_options->velocity_options->prescale,
+                                                     random,
+                                                     paint_options->random_options->prescale);
     }
 
   return opacity;
@@ -967,7 +1022,7 @@
                                      gboolean          use_pressure,
                                      gboolean          use_dynamics)
 {
-  gdouble scale =  1.0;
+  gdouble scale = 1.0;
 
   if (use_dynamics)
     {
@@ -975,7 +1030,11 @@
       gdouble velocity = -1.0;
       gdouble random   = -1.0;
 
-      if (paint_options->pressure_options->inverse_size)
+      if (paint_options->pressure_options->size && use_pressure)
+        {
+          pressure = coords->pressure;
+        }
+      else if (paint_options->pressure_options->inverse_size && use_pressure)
         {
           pressure = 1.0 - 0.9 * coords->pressure;
         }
@@ -998,7 +1057,12 @@
           random = coords->random;
         }
 
-      scale = gimp_paint_options_get_dynamics_mix (pressure, velocity, random);
+      scale = gimp_paint_options_get_dynamics_mix (pressure,
+                                                   paint_options->pressure_options->prescale,
+                                                   velocity,
+                                                   paint_options->velocity_options->prescale,
+                                                   random,
+                                                   paint_options->random_options->prescale);
 
       if (scale < 1 / 64.0)
         scale = 1 / 8.0;
@@ -1039,7 +1103,12 @@
       if (paint_options->random_options->rate)
         random = coords->random;
 
-      rate = gimp_paint_options_get_dynamics_mix (pressure, velocity, random);
+      rate = gimp_paint_options_get_dynamics_mix (pressure,
+                                                  paint_options->pressure_options->prescale,
+                                                  velocity,
+                                                  paint_options->velocity_options->prescale,
+                                                  random,
+                                                  paint_options->random_options->prescale);
     }
 
   return rate;
@@ -1073,7 +1142,12 @@
       if (paint_options->random_options->color)
         random = coords->random;
 
-      color = gimp_paint_options_get_dynamics_mix (pressure, velocity, random);
+      color = gimp_paint_options_get_dynamics_mix (pressure,
+                                                   paint_options->pressure_options->prescale,
+                                                   velocity,
+                                                   paint_options->velocity_options->prescale,
+                                                   random,
+                                                   paint_options->random_options->prescale);
     }
 
   return color;
@@ -1106,7 +1180,12 @@
       if (paint_options->random_options->hardness)
         random = coords->random;
 
-      hardness = gimp_paint_options_get_dynamics_mix (pressure, velocity, random);
+      hardness = gimp_paint_options_get_dynamics_mix (pressure,
+                                                      paint_options->pressure_options->prescale,
+                                                      velocity,
+                                                      paint_options->velocity_options->prescale,
+                                                      random,
+                                                      paint_options->random_options->prescale);
     }
 
   return hardness;

Modified: trunk/app/paint/gimppaintoptions.h
==============================================================================
--- trunk/app/paint/gimppaintoptions.h	(original)
+++ trunk/app/paint/gimppaintoptions.h	Mon May 26 19:52:09 2008
@@ -43,6 +43,7 @@
   gboolean  size;
   gboolean  inverse_size;
   gboolean  color;
+  gdouble   prescale;
 };
 
 struct _GimpFadeOptions

Modified: trunk/app/tools/gimppaintoptions-gui.c
==============================================================================
--- trunk/app/tools/gimppaintoptions-gui.c	(original)
+++ trunk/app/tools/gimppaintoptions-gui.c	Mon May 26 19:52:09 2008
@@ -204,7 +204,7 @@
       gtk_container_add (GTK_CONTAINER (frame), inner_frame);
       gtk_widget_show (inner_frame);
 
-      table = gtk_table_new (4, n_dynamics + 1, FALSE);
+      table = gtk_table_new (4, n_dynamics + 2, FALSE);
       gtk_container_add (GTK_CONTAINER (inner_frame), table);
       gtk_widget_show (table);
 
@@ -411,6 +411,7 @@
   GObject   *config = G_OBJECT (paint_options);
   GtkWidget *button;
   gint       column = 1;
+  GtkWidget *scalebutton;
 
   if (tool_has_opacity_dynamics (tool_type))
     {
@@ -466,6 +467,11 @@
                         labels[column - 1]);
       column++;
     }
+
+   scalebutton = gimp_prop_scale_button_new (config, "pressure-prescale");
+   gtk_table_attach (table, scalebutton, column, column + 1, row, row + 1,
+                    GTK_SHRINK, GTK_SHRINK, 0, 0);
+   gtk_widget_show (scalebutton);
 }
 
 static void
@@ -474,8 +480,9 @@
                       GtkTable         *table,
                       gint              row)
 {
-  GObject *config = G_OBJECT (paint_options);
-  gint     column = 1;
+  GObject   *config = G_OBJECT (paint_options);
+  gint       column = 1;
+  GtkWidget *scalebutton;
 
   if (tool_has_opacity_dynamics (tool_type))
     {
@@ -506,6 +513,11 @@
       dynamics_check_button_new (config, "velocity-color",
                                  table, column++, row);
     }
+
+  scalebutton = gimp_prop_scale_button_new (config, "velocity-prescale");
+  gtk_table_attach (table, scalebutton, column, column + 1, row, row + 1,
+                    GTK_SHRINK, GTK_SHRINK, 0, 0);
+  gtk_widget_show (scalebutton);
 }
 
 static void
@@ -514,8 +526,9 @@
                     GtkTable         *table,
                     gint              row)
 {
-  GObject*config = G_OBJECT (paint_options);
-  gint    column = 1;
+  GObject   *config = G_OBJECT (paint_options);
+  gint       column = 1;
+  GtkWidget *scalebutton;
 
   if (tool_has_opacity_dynamics (tool_type))
     {
@@ -546,6 +559,11 @@
       dynamics_check_button_new (config, "random-color",
                                  table, column++, row);
     }
+
+   scalebutton = gimp_prop_scale_button_new (config, "random-prescale");
+   gtk_table_attach (table, scalebutton, column, column + 1, row, row + 1,
+                    GTK_SHRINK, GTK_SHRINK, 0, 0);
+   gtk_widget_show (scalebutton);
 }
 
 static GtkWidget *



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