When converting from double to fixed, round carefully.
This reduces the matrix representation error after inverting a transformation matrix (although it doesn't eliminate it entirely). Perhaps we should extend Render to include 64-bit floating point transforms...
This commit is contained in:
parent
6d3a9e40a4
commit
97ab0c6eff
|
@ -72,9 +72,9 @@ PictureTransformPoint3d (PictTransformPtr transform,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
result.vector[j] = (xFixed) v;
|
result.vector[j] = (xFixed) v;
|
||||||
}
|
}
|
||||||
|
*vector = result;
|
||||||
if (!result.vector[2])
|
if (!result.vector[2])
|
||||||
return FALSE;
|
return FALSE;
|
||||||
*vector = result;
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -286,7 +286,8 @@ from_doubles (PictTransformPtr t, double m[3][3])
|
||||||
double d = m[j][i];
|
double d = m[j][i];
|
||||||
if (d < -32767.0 || d > 32767.0)
|
if (d < -32767.0 || d > 32767.0)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
t->matrix[j][i] = pixman_double_to_fixed (d);
|
d = d * 65536.0 + 0.5;
|
||||||
|
t->matrix[j][i] = (xFixed) floor (d);
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -294,7 +295,7 @@ from_doubles (PictTransformPtr t, double m[3][3])
|
||||||
static Bool
|
static Bool
|
||||||
invert (double r[3][3], double m[3][3])
|
invert (double r[3][3], double m[3][3])
|
||||||
{
|
{
|
||||||
double det, norm;
|
double det;
|
||||||
int i, j;
|
int i, j;
|
||||||
static int a[3] = { 2, 2, 1 };
|
static int a[3] = { 2, 2, 1 };
|
||||||
static int b[3] = { 1, 0, 0 };
|
static int b[3] = { 1, 0, 0 };
|
||||||
|
|
Loading…
Reference in New Issue