From 8a28c073f1562099e8d89ee420009bfa3ceab339 Mon Sep 17 00:00:00 2001 From: Sven Neumann Date: Sat, 14 Feb 2009 13:36:28 +0000 Subject: [PATCH] app/core/gimpcoords-interpolate.c applied patch from Alexia Death that 2009-02-14 Sven Neumann * 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). svn path=/trunk/; revision=28030 --- ChangeLog | 7 +++ app/core/gimpcoords-interpolate.c | 59 +++++++++---------- app/display/gimpdisplayshell-coords.c | 84 +++++++++++++++++++++------ 3 files changed, 100 insertions(+), 50 deletions(-) diff --git a/ChangeLog b/ChangeLog index ab76c12e4d..54b9d1de20 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2009-02-14 Sven Neumann + + * 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). + 2009-02-14 Sven Neumann Bug 472644 – Rotate with clipping crops the whole layer diff --git a/app/core/gimpcoords-interpolate.c b/app/core/gimpcoords-interpolate.c index 4b06f502c3..2a4259b615 100644 --- a/app/core/gimpcoords-interpolate.c +++ b/app/core/gimpcoords-interpolate.c @@ -228,6 +228,8 @@ gimp_coords_interpolate_catmull (const GimpCoords catmul_pt1, { gdouble delta_x, delta_y; gdouble distance; + gdouble dir_step; + gdouble delta_dir; gint num_points; gint n; @@ -236,8 +238,8 @@ gimp_coords_interpolate_catmull (const GimpCoords catmul_pt1, 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 @@ gimp_coords_interpolate_catmull (const GimpCoords catmul_pt1, 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 @@ gimp_coords_interpolate_catmull (const GimpCoords catmul_pt1, 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); - if (n > 1) - last_coords = g_array_index (*ret_coords, GimpCoords, n - 2); - else - last_coords = start_coords; + coords.direction = start_coords.direction + dir_step * n; - delta_x = last_coords.x - res_coords.x; - delta_y = last_coords.y - res_coords.y; + while (coords.direction > 1.0) + coords.direction -= 1.0; - 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; - } - - 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); diff --git a/app/display/gimpdisplayshell-coords.c b/app/display/gimpdisplayshell-coords.c index 2d6f5621f8..eb74eca6fd 100644 --- a/app/display/gimpdisplayshell-coords.c +++ b/app/display/gimpdisplayshell-coords.c @@ -219,11 +219,13 @@ gimp_display_shell_eval_event (GimpDisplayShell *shell, 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 @@ gimp_display_shell_eval_event (GimpDisplayShell *shell, /* Speed needs upper limit */ coords->velocity = MIN (coords->velocity, 1.0); } - - if (delta_x == 0.0) + if ((fabs (delta_x) > 1.5) && (fabs (delta_y) > 1.5)) { - coords->direction = shell->last_coords.direction; + dir_delta_x = delta_x; + dir_delta_y = delta_y; } else { - coords->direction = atan ((- 1.0 * delta_y) / delta_x) / (2 * G_PI); - if (delta_x < 0.0) + 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); + + dir_delta_x = old_event.x - coords->x; + dir_delta_y = old_event.y - coords->y; + + x--; + } + } + + if (dir_delta_x == 0.0) + { + 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 * 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; - 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; + + 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; + + while (coords->direction < 0.0) + coords->direction += 1.0; /* High speed -> less smooth*/ inertia_factor *= (1 - coords->velocity);