Issue #2090 - Crash when using transform tools
In GimpTransformGridTool, avoid producing non-finite coordinate
and angle values. In particular, this fixes a crash in
gimp_transform_grid_tool_get_cursor() as a result of a NaN angle
value being converted to a negative integer, hitting an assert.
(cherry picked from commit be7906c05c
)
This commit is contained in:
@ -887,11 +887,11 @@ calcangle (GimpVector2 a,
|
|||||||
|
|
||||||
length = norm (a) * norm (b);
|
length = norm (a) * norm (b);
|
||||||
|
|
||||||
angle = acos (dotprod (a, b)/length);
|
angle = acos (SAFE_CLAMP (dotprod (a, b) / length, -1.0, +1.0));
|
||||||
angle2 = b.y;
|
angle2 = b.y;
|
||||||
b.y = -b.x;
|
b.y = -b.x;
|
||||||
b.x = angle2;
|
b.x = angle2;
|
||||||
angle2 = acos (dotprod (a, b)/length);
|
angle2 = acos (SAFE_CLAMP (dotprod (a, b) / length, -1.0, +1.0));
|
||||||
|
|
||||||
return ((angle2 > G_PI / 2.0) ? angle : 2.0 * G_PI - angle);
|
return ((angle2 > G_PI / 2.0) ? angle : 2.0 * G_PI - angle);
|
||||||
}
|
}
|
||||||
@ -1750,12 +1750,6 @@ gimp_tool_transform_grid_motion (GimpToolWidget *widget,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
*x[i] = newpos[i].x;
|
|
||||||
*y[i] = newpos[i].y;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* this will have been set to TRUE if an operation used the pivot in
|
/* this will have been set to TRUE if an operation used the pivot in
|
||||||
* addition to being a user option
|
* addition to being a user option
|
||||||
*/
|
*/
|
||||||
@ -1768,6 +1762,22 @@ gimp_tool_transform_grid_motion (GimpToolWidget *widget,
|
|||||||
pivot = vectoradd (pivot, delta);
|
pivot = vectoradd (pivot, delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* make sure the new coordinates are valid */
|
||||||
|
for (i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
if (! isfinite (newpos[i].x) || ! isfinite (newpos[i].y))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! isfinite (pivot.x) || ! isfinite (pivot.y))
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
*x[i] = newpos[i].x;
|
||||||
|
*y[i] = newpos[i].y;
|
||||||
|
}
|
||||||
|
|
||||||
/* set unconditionally: if options get toggled during operation, we
|
/* set unconditionally: if options get toggled during operation, we
|
||||||
* have to move pivot back
|
* have to move pivot back
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user