[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