| Message ID | 20130426052831.GA10128@yabbi.bne.redhat.com |
|---|---|
| State | Accepted |
| Headers | show |
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;
On Fri, Apr 26, 2013 at 03:28:31PM +1000, Peter Hutterer wrote: > 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 <peter.hutterer@who-t.net> > --- > This patch replaces: > dix: use the right range in positionSprite > dix: the input matrix must work on pixels, not device ranges .. and it's still not correct as the XI valuators are off now. Cheers, Peter > > 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 >
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 <peter.hutterer@who-t.net> --- 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(-)