gimp r28030 - in trunk: . app/core app/display



Author: neo
Date: Sat Feb 14 13:36:28 2009
New Revision: 28030
URL: http://svn.gnome.org/viewvc/gimp?rev=28030&view=rev

Log:
2009-02-14  Sven Neumann  <sven gimp org>

	* app/core/gimpcoords-interpolate.c
	* app/display/gimpdisplayshell-coords.c: applied patch from 
Alexia
	Death that fixes issues with the new stroke direction code
	(bug #520078).



Modified:
   trunk/ChangeLog
   trunk/app/core/gimpcoords-interpolate.c
   trunk/app/display/gimpdisplayshell-coords.c

Modified: trunk/app/core/gimpcoords-interpolate.c
==============================================================================
--- trunk/app/core/gimpcoords-interpolate.c	(original)
+++ trunk/app/core/gimpcoords-interpolate.c	Sat Feb 14 13:36:28 2009
@@ -228,6 +228,8 @@
 {
   gdouble     delta_x, delta_y;
   gdouble     distance;
+  gdouble     dir_step;
+  gdouble     delta_dir;
   gint        num_points;
   gint        n;
 
@@ -236,8 +238,8 @@
   GimpCoords  end_coords;
   GimpCoords  future_coords;
 
-  delta_x        = catmul_pt3.x - catmul_pt2.x;
-  delta_y        = catmul_pt3.y - catmul_pt2.y;
+  delta_x = catmul_pt3.x - catmul_pt2.x;
+  delta_y = catmul_pt3.y - catmul_pt2.y;
 
   /* Catmull-Rom interpolation requires 4 points.
    * Two endpoints plus one more at each end.
@@ -252,50 +254,56 @@
 
   num_points = distance / precision;
 
-  for (n = 1; n <=num_points; n++)
+  delta_dir = end_coords.direction - start_coords.direction;
+
+  if (delta_dir <= -0.5)
+    delta_dir += 1.0;
+  else if (delta_dir >= 0.5)
+    delta_dir -= 1.0;
+
+  dir_step =  delta_dir / num_points;
+
+  for (n = 1; n <= num_points; n++)
     {
-      GimpCoords res_coords;
-      GimpCoords last_coords;
+      GimpCoords coords;
       gdouble    velocity;
-      gdouble    delta_x;
-      gdouble    delta_y;
       gdouble    p = (gdouble) n / num_points;
 
-      res_coords.x =
+      coords.x =
         gimp_coords_get_catmull_spline_point (p,
                                               past_coords.x,
                                               start_coords.x,
                                               end_coords.x,
                                               future_coords.x);
 
-      res_coords.y =
+      coords.y =
         gimp_coords_get_catmull_spline_point (p,
                                               past_coords.y,
                                               start_coords.y,
                                               end_coords.y,
                                               future_coords.y);
 
-      res_coords.pressure =
+      coords.pressure =
         gimp_coords_get_catmull_spline_point (p,
                                               past_coords.pressure,
                                               start_coords.pressure,
                                               end_coords.pressure,
                                               future_coords.pressure);
 
-      res_coords.xtilt =
+      coords.xtilt =
         gimp_coords_get_catmull_spline_point (p,
                                               past_coords.xtilt,
                                               start_coords.xtilt,
                                               end_coords.xtilt,
                                               future_coords.xtilt);
-      res_coords.ytilt =
+      coords.ytilt =
         gimp_coords_get_catmull_spline_point (p,
                                               past_coords.ytilt,
                                               start_coords.ytilt,
                                               end_coords.ytilt,
                                               future_coords.ytilt);
 
-      res_coords.wheel =
+      coords.wheel =
         gimp_coords_get_catmull_spline_point (p,
                                               past_coords.wheel,
                                               start_coords.wheel,
@@ -307,29 +315,14 @@
                                                        start_coords.velocity,
                                                        end_coords.velocity,
                                                        future_coords.velocity);
-      res_coords.velocity = CLAMP (velocity, 0.0, 1.0);
+      coords.velocity = CLAMP (velocity, 0.0, 1.0);
+
+      coords.direction = start_coords.direction + dir_step * n;
 
-      if (n > 1)
-        last_coords = g_array_index (*ret_coords, GimpCoords, n - 2);
-      else
-        last_coords = start_coords;
-
-      delta_x = last_coords.x - res_coords.x;
-      delta_y = last_coords.y - res_coords.y;
-
-      if (delta_x == 0)
-        {
-          res_coords.direction = last_coords.direction;
-        }
-      else
-        {
-          res_coords.direction = atan ((- delta_y) / delta_x) / (2 * G_PI);
-
-          if (delta_x < 0.0)
-            res_coords.direction = res_coords.direction + 0.5;
-        }
+      while (coords.direction > 1.0)
+        coords.direction -= 1.0;
 
-      g_array_append_val (*ret_coords, res_coords);
+      g_array_append_val (*ret_coords, coords);
 
       if (ret_params)
         g_array_append_val (*ret_params, p);

Modified: trunk/app/display/gimpdisplayshell-coords.c
==============================================================================
--- trunk/app/display/gimpdisplayshell-coords.c	(original)
+++ trunk/app/display/gimpdisplayshell-coords.c	Sat Feb 14 13:36:28 2009
@@ -219,11 +219,13 @@
                                gdouble           inertia_factor,
                                guint32           time)
 {
-  gdouble  delta_time = 0.001;
-  gdouble  delta_x    = 0.0;
-  gdouble  delta_y    = 0.0;
-  gdouble  distance   = 1.0;
-  gboolean event_fill = (inertia_factor > 0);
+  gdouble  delta_time  = 0.001;
+  gdouble  delta_x     = 0.0;
+  gdouble  delta_y     = 0.0;
+  gdouble  dir_delta_x = 0.0;
+  gdouble  dir_delta_y = 0.0;
+  gdouble  distance    = 1.0;
+  gboolean event_fill  = (inertia_factor > 0);
 
   /* Smoothing causes problems with cursor tracking
    * when zoomed above screen resolution so we need to supress it.
@@ -291,26 +293,74 @@
           /* Speed needs upper limit */
           coords->velocity = MIN (coords->velocity, 1.0);
         }
+      if ((fabs (delta_x) > 1.5) && (fabs (delta_y) > 1.5))
+        {
+          dir_delta_x = delta_x;
+          dir_delta_y = delta_y;
+        }
+      else
+        {
+          gint x = 3;
+
+          while (((fabs (dir_delta_x) < 1.5) ||
+                  (fabs (dir_delta_y) < 1.5)) && (x >= 0))
+            {
+              const GimpCoords old_event = g_array_index (shell->event_history,
+                                                          GimpCoords, x);
 
-      if (delta_x == 0.0)
+              dir_delta_x = old_event.x - coords->x;
+              dir_delta_y = old_event.y - coords->y;
+
+              x--;
+            }
+        }
+
+      if (dir_delta_x == 0.0)
         {
-          coords->direction = shell->last_coords.direction;
+          if (dir_delta_y >= 0.0)
+            coords->direction = 0.5;
+          else if (dir_delta_y < 0.0)
+            coords->direction = 0.0;
+          else coords->direction = shell->last_coords.direction;
         }
       else
         {
-          coords->direction = atan ((- 1.0 * delta_y) / delta_x) / (2 * G_PI);
-          if (delta_x < 0.0)
+          coords->direction = atan ((- 1.0 * dir_delta_y) /
+                                    dir_delta_x) / (2 * G_PI);
+
+          if (dir_delta_x > 0.0)
             coords->direction = coords->direction + 0.5;
         }
 
-       delta_dir = coords->direction - shell->last_coords.direction;
+      while (coords->direction > 1.0)
+        coords->direction -= 1.0;
+
+      while (coords->direction < 0.0)
+        coords->direction += 1.0;
+
+      delta_dir = coords->direction - shell->last_coords.direction;
+
+      if ((fabs (delta_dir) > 0.5) && (delta_dir < 0.0))
+        {
+          coords->direction = (0.5 * coords->direction +
+                               0.5 * (shell->last_coords.direction - 1.0));
+        }
+      else if ((fabs (delta_dir) > 0.5) && (delta_dir > 0.0))
+        {
+          coords->direction = (0.5 * coords->direction +
+                               0.5 * (shell->last_coords.direction + 1.0));
+        }
+      else
+        {
+          coords->direction = (0.5 * coords->direction +
+                               0.5 * shell->last_coords.direction);
+        }
+
+      while (coords->direction > 1.0)
+        coords->direction -= 1.0;
 
-       if ((fabs (delta_dir) > 0.5) && (delta_dir < 0.0))
-         coords->direction = 0.3 * coords->direction + 0.7 * (shell->last_coords.direction - 1.0);
-       else if ((fabs (delta_dir) > 0.5) && (delta_dir > 0.0))
-         coords->direction = 0.3 * coords->direction + 0.7 * (shell->last_coords.direction + 1.0);
-       else
-         coords->direction = 0.3 * coords->direction + 0.7 * shell->last_coords.direction;
+      while (coords->direction < 0.0)
+        coords->direction += 1.0;
 
       /* High speed -> less smooth*/
       inertia_factor *= (1 - coords->velocity);



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