[PATCH libinput 07/11] evdev: switch to a normalized transformation matrix

Hans de Goede hdegoede at redhat.com
Fri Aug 29 06:01:17 PDT 2014


Hi,

On 08/29/2014 02:04 AM, Peter Hutterer wrote:
> 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 <peter.hutterer at who-t.net>
>>> ---
>>>  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.

Ah the is_identity and and init_identity are done on different matrices, I missed that,
in that case this is:

Reviewed-by: Hans de Goede <hdegoede at redhat.com>

Regards,

Hans


More information about the wayland-devel mailing list