[PATCH xserver] xf86ScaleAxis: support for high resolution devices

Dan Nicholson dbn.lists at gmail.com
Fri Apr 9 08:41:15 PDT 2010


On Fri, Apr 9, 2010 at 7:51 AM, Benjamin Tissoires <tissoire at cena.fr> wrote:
> High resolution devices was generating integer overflow.
> For instance the wacom Cintiq 21UX has an axis value up to
> 87000. Thus the term (dSx * (Cx - Rxlow)) is greater than
> MAX_INT32.
>
> Using 64bits integer avoids such problem.
>
> Signed-off-by: Philippe Ribet <ribet at cena.fr>
> Signed-off-by: Benjamin Tissoires <tissoire at cena.fr>
> ---
>  hw/xfree86/common/xf86Xinput.c |    6 +++---
>  1 files changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
> index 8229227..80bdd19 100644
> --- a/hw/xfree86/common/xf86Xinput.c
> +++ b/hw/xfree86/common/xf86Xinput.c
> @@ -1172,12 +1172,12 @@ xf86ScaleAxis(int       Cx,
>               int      Rxlow )
>  {
>     int X;
> -    int dSx = Sxhigh - Sxlow;
> -    int dRx = Rxhigh - Rxlow;
> +    int64_t dSx = Sxhigh - Sxlow;
> +    int64_t dRx = Rxhigh - Rxlow;

Not sure, but would you not also need to change the function
parameters to int64_t? I guess you're just avoiding a cast below,
though. Also, could you explicitly include <stdint.h> instead of
getting it implicitly?

>
>     dSx = Sxhigh - Sxlow;

Could you kill this redundant line while you're at it?

>     if (dRx) {
> -       X = ((dSx * (Cx - Rxlow)) / dRx) + Sxlow;
> +       X = (int)(((dSx * (Cx - Rxlow)) / dRx) + Sxlow);
>     }
>     else {
>        X = 0;
> --
> 1.6.6.1

--
Dan


More information about the xorg-devel mailing list