mirror of
https://gitlab.gnome.org/GNOME/gimp
synced 2024-10-22 20:41:43 +00:00
app/core/gimpcoords-interpolate.c applied patch from Alexia Death that
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). svn path=/trunk/; revision=28030
This commit is contained in:
parent
be83d34498
commit
8a28c073f1
|
@ -1,3 +1,10 @@
|
|||
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).
|
||||
|
||||
2009-02-14 Sven Neumann <sven@gimp.org>
|
||||
|
||||
Bug 472644 – Rotate with clipping crops the whole layer
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue