mirror of
https://github.com/brl/mutter.git
synced 2024-11-25 17:40:40 -05:00
actor: Fix transforming stage point when scale is less than 1
The commit 6cd24faaa5
(actor: Clean up
transform_stage_point()) changed the validation of the transformation
matrix to ignore the fraction part of the determinant. This caused
clutter_actor_transform_stage_point() to fail and return FALSE for
actors which scale was less than 1.
Previously the validation was ('det' being a float):
det = (RQ[0][0] * ST[0][0])
+ (RQ[0][1] * ST[0][1])
+ (RQ[0][2] * ST[0][2]);
if (!det)
return FALSE;
Semantically, the if statement expression '!det' is equivalent to
'det == 0', i.e. 'det == 0.0f'. Post cleanup patches, 'det' was turned
into a double, and the if statement was changed to:
if (CLUTTER_NEARBYINT (det) == 0)
return FALSE;
which, different from before, rounds the determinant to the nearest
integer value, meaning determinant in the range (-0.5, 0.5) would be
considered invalid.
This patch reverts this part to the old behavior, while, because of the
inexact nature of floating point arithmetics, allowing a bit more liberal
meaning of "equals to 0" than '== 0.0'.
https://bugzilla.gnome.org/show_bug.cgi?id=754766
This commit is contained in:
parent
63813ad398
commit
5d83260b19
@ -15190,7 +15190,7 @@ clutter_actor_transform_stage_point (ClutterActor *self,
|
||||
dy2 = v[2].y - v[3].y;
|
||||
|
||||
det = DET (dx1, dx2, dy1, dy2);
|
||||
if (CLUTTER_NEARBYINT (det) == 0)
|
||||
if (fabs (det) <= DBL_EPSILON)
|
||||
return FALSE;
|
||||
|
||||
RQ[0][2] = DET (px, dx2, py, dy2) / det;
|
||||
@ -15236,7 +15236,7 @@ clutter_actor_transform_stage_point (ClutterActor *self,
|
||||
det = (RQ[0][0] * ST[0][0])
|
||||
+ (RQ[0][1] * ST[0][1])
|
||||
+ (RQ[0][2] * ST[0][2]);
|
||||
if (CLUTTER_NEARBYINT (det) == 0)
|
||||
if (fabs (det) <= DBL_EPSILON)
|
||||
return FALSE;
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user