On Thu, Aug 28, 2014 at 03:07:26PM +0200, Hans de Goede wrote:
> Hi,
> 
> On 08/27/2014 06:31 AM, Peter Hutterer wrote:
> > The big change here is the requirement to have the translation component in 
> > a
> > device-normalized coordinate space. Without that, we cannot reliably rotate 
> > as
> > the coordinate space is effectively unknown and may differ between the axes.
> > This affects any rotation matrix or translation matrix, pure scale matrices
> > were working just fine since they're unit-less.
> > 
> > Requiring the matrix in device-normalized space makes it possible for 
> > libinput
> > to rotate or otherwise handle the matrix independent of the screen 
> > resolution.
> > The rotation matrix is documented in a bit more detail to make it easier for
> > users to figure it out.
> > 
> > This changes the definition of the WL_CALIBRATION property (which is 
> > currently
> > broken).
> > 
> > Signed-off-by: Peter Hutterer <[email protected]>
> > ---
> >  src/evdev.c    | 71 
> > +++++++++++++++++++++++++++++++++++++++++++++++-----------
> >  src/evdev.h    |  2 +-
> >  src/libinput.h | 26 +++++++++++++++++++++
> >  3 files changed, 85 insertions(+), 14 deletions(-)
> > 
> > diff --git a/src/evdev.c b/src/evdev.c
> > index a029887..4cd3cfa 100644
> > --- a/src/evdev.c
> > +++ b/src/evdev.c
> > @@ -150,20 +150,10 @@ evdev_device_led_update(struct evdev_device *device, 
> > enum libinput_led leds)
> >  static void
> >  transform_absolute(struct evdev_device *device, int32_t *x, int32_t *y)
> >  {
> > -   int32_t tx, ty;
> > -
> >     if (!device->abs.apply_calibration)
> >             return;
> >  
> > -   tx = *x * device->abs.calibration[0] +
> > -           *y * device->abs.calibration[1] +
> > -           device->abs.calibration[2];
> > -
> > -   ty = *x * device->abs.calibration[3] +
> > -           *y * device->abs.calibration[4] +
> > -           device->abs.calibration[5];
> > -   *x = tx;
> > -   *y = ty;
> > +   matrix_mult_vec(&device->abs.calibration, x, y);
> >  }
> >  
> >  static inline double
> > @@ -913,6 +903,8 @@ evdev_device_create(struct libinput_seat *seat,
> >     device->pending_event = EVDEV_NONE;
> >     device->devname = libevdev_get_name(device->evdev);
> >  
> > +   matrix_init_identity(&device->abs.calibration);
> > +
> >     if (evdev_configure_device(device) == -1)
> >             goto err;
> >  
> > @@ -986,8 +978,61 @@ void
> >  evdev_device_calibrate(struct evdev_device *device,
> >                    const float calibration[6])
> >  {
> > -   device->abs.apply_calibration = 1;
> > -   memcpy(device->abs.calibration, calibration, sizeof 
> > device->abs.calibration);
> > +   struct matrix scale,
> > +                 translate,
> > +                 transform;
> > +   double sx, sy;
> > +
> > +   matrix_from_farray6(&transform, calibration);
> > +   device->abs.apply_calibration = !matrix_is_identity(&transform);
> > +
> > +   if (!device->abs.apply_calibration) {
> > +           matrix_init_identity(&device->abs.calibration);
> 
> Erm, "!device->abs.apply_calibration" == "!!matrix_is_identity(&transform)" ==
> "matrix_is_identity(&transform)", so your initializing the matrix to identity
> here when it already is identity.

not quite. the matrix may have been set by previous calibration setting
(either by the caller or by the udev property). Now a caller sets the matrix
to the identity matrix.

it's technically not needed since we have the separate apply_calibration
toggle but I'd rather have the matrix in a known good state than in whatever
it was before.

Cheers,
   Peter
_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to