From 97ab0c6eff870b52c0383b63a78cec49059b2545 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Tue, 18 Mar 2008 15:15:40 -0700 Subject: 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... --- render/matrix.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'render') diff --git a/render/matrix.c b/render/matrix.c index 6e502057c..0d5d96267 100644 --- a/render/matrix.c +++ b/render/matrix.c @@ -72,9 +72,9 @@ PictureTransformPoint3d (PictTransformPtr transform, return FALSE; result.vector[j] = (xFixed) v; } + *vector = result; if (!result.vector[2]) return FALSE; - *vector = result; return TRUE; } @@ -286,7 +286,8 @@ from_doubles (PictTransformPtr t, double m[3][3]) double d = m[j][i]; if (d < -32767.0 || d > 32767.0) 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; } @@ -294,7 +295,7 @@ from_doubles (PictTransformPtr t, double m[3][3]) static Bool invert (double r[3][3], double m[3][3]) { - double det, norm; + double det; int i, j; static int a[3] = { 2, 2, 1 }; static int b[3] = { 1, 0, 0 }; -- cgit v1.2.3