[PATCH 1/2] xrandr: Use rounding when converting from float to fixed point matrix

Siarhei Siamashka siarhei.siamashka at gmail.com
Wed Aug 20 20:31:06 PDT 2014


This prevents unnecessary accuracy loss when the '--transform' option
is used. Also the preparation of a transformation matrix is now moved
to its own separate function.

Signed-off-by: Siarhei Siamashka <siarhei.siamashka at gmail.com>
---
 xrandr.c | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)

diff --git a/xrandr.c b/xrandr.c
index 366f6dc..5ba8c00 100644
--- a/xrandr.c
+++ b/xrandr.c
@@ -463,6 +463,18 @@ mode_width (XRRModeInfo *mode_info, Rotation rotation)
     }
 }
 
+static void
+make_fixed_point_matrix (XTransform *transform, double matrix[3][3])
+{
+    /* XDoubleToFixed does not provide correct rounding, so use a workaround */
+    double fixed_1 = XDoubleToFixed (1);
+    int k, l;
+
+    for (k = 0; k < 3; k++)
+	for (l = 0; l < 3; l++)
+	    transform->matrix[k][l] = floor (matrix[k][l] * fixed_1 + 0.5);
+}
+
 static Bool
 transform_point (XTransform *transform, double *xp, double *yp)
 {
@@ -2908,7 +2920,6 @@ main (int argc, char **argv)
 	}
 	if (!strcmp ("--transform", argv[i])) {
 	    double  transform[3][3];
-	    int	    k, l;
 	    if (!config_output) argerr ("%s must be used after --output\n", argv[i]);
 	    if (++i >= argc) argerr ("%s requires an argument\n", argv[i-1]);
 	    init_transform (&config_output->transform);
@@ -2921,10 +2932,7 @@ main (int argc, char **argv)
 		    != 9)
 		    argerr ("failed to parse '%s' as a transformation\n", argv[i]);
 		init_transform (&config_output->transform);
-		for (k = 0; k < 3; k++)
-		    for (l = 0; l < 3; l++) {
-			config_output->transform.transform.matrix[k][l] = XDoubleToFixed (transform[k][l]);
-		    }
+		make_fixed_point_matrix(&config_output->transform.transform, transform);
 		config_output->transform.filter = "bilinear";
 		config_output->transform.nparams = 0;
 		config_output->transform.params = NULL;
-- 
1.8.3.2



More information about the xorg-devel mailing list