defmin/defmax are screen coords and thus use a min-inclusive, max-exclusive range. device axes ranges are inclusive, so bump the max up by one to get the scaling right.
This fixes off-by-one coordinate errors if the coordinate matrix is used to bind the device to a fraction of the screen. Signed-off-by: Peter Hutterer <[email protected]> --- This patch replaces: dix: use the right range in positionSprite dix: the input matrix must work on pixels, not device ranges dix/devices.c | 4 ++-- dix/getevents.c | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dix/devices.c b/dix/devices.c index fa94a94..7b423de 100644 --- a/dix/devices.c +++ b/dix/devices.c @@ -112,8 +112,8 @@ DeviceSetTransform(DeviceIntPtr dev, float *transform_data) * Transform is the user supplied (affine) transform * InvScale scales coordinates back up into their native range */ - sx = dev->valuator->axes[0].max_value - dev->valuator->axes[0].min_value; - sy = dev->valuator->axes[1].max_value - dev->valuator->axes[1].min_value; + sx = dev->valuator->axes[0].max_value - dev->valuator->axes[0].min_value + 1; + sy = dev->valuator->axes[1].max_value - dev->valuator->axes[1].min_value + 1; /* invscale */ pixman_f_transform_init_scale(&scale, sx, sy); diff --git a/dix/getevents.c b/dix/getevents.c index a4f192c..f946e0a 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -297,11 +297,11 @@ rescaleValuatorAxis(double coord, AxisInfoPtr from, AxisInfoPtr to, if (from && from->min_value < from->max_value) { fmin = from->min_value; - fmax = from->max_value; + fmax = from->max_value + 1; } if (to && to->min_value < to->max_value) { tmin = to->min_value; - tmax = to->max_value; + tmax = to->max_value + 1; } if (fmin == tmin && fmax == tmax) @@ -913,9 +913,9 @@ scale_to_desktop(DeviceIntPtr dev, ValuatorMask *mask, /* scale x&y to desktop coordinates */ *screenx = rescaleValuatorAxis(x, dev->valuator->axes + 0, NULL, - screenInfo.x, screenInfo.width - 1); + screenInfo.x, screenInfo.width); *screeny = rescaleValuatorAxis(y, dev->valuator->axes + 1, NULL, - screenInfo.y, screenInfo.height - 1); + screenInfo.y, screenInfo.height); *devx = x; *devy = y; -- 1.8.1.4 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
