gimp r28030 - in trunk: . app/core app/display
- From: neo svn gnome org
- To: svn-commits-list gnome org
- Subject: gimp r28030 - in trunk: . app/core app/display
- Date: Sat, 14 Feb 2009 13:36:28 +0000 (UTC)
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]