[PATCH v5 xserver 5/7] xf86Cursor: Fix xf86_crtc_rotate_coord_back using width/height wrongly
Hans de Goede
hdegoede at redhat.com
Wed Sep 7 11:43:22 UTC 2016
Hi,
On 07-09-16 03:21, Michel Dänzer wrote:
> On 06/09/16 08:31 PM, Hans De Goede wrote:
>> xf86_crtc_rotate_coord_back should be the exact inverse operation of
>> xf86_crtc_rotate_coord, but when calculating x / y for 90 / 270 degrees
>> rotation it was using height to calculate x / width to calculate y,
>> instead of the otherway around.
>
> I think it's correct as is. It's certainly symmetrical with
> xf86_crtc_rotate_coord.
Actually no, it is not symmetrical, it uses width to calculate y and
height to calculate x, where as xf86_crtc_rotate_coord uses
width when calculating x and height when calculating y as one would
expect.
Let me walk you through the steps I took when creating this patch:
First lets call xf86_crtc_rotate_coord, with 270 degree rotation,
then we do:
case RR_Rotate_270:
t = x_dst;
x_dst = y_dst;
y_dst = width - t - 1;
And now lets only look at y_dst, y_dst is:
y_dst = width - t - 1;
and t is the original x_dst (which we want to get back in xf86_crtc_rotate_coord_back)
so y_dst is:
y_dst = width - orig_x_dst - 1;
And now lets look at the 270 degree case in xf86_crtc_rotate_coord_back
(original version before my patch):
case RR_Rotate_270:
t = x_dst;
x_dst = height - y_dst - 1;
y_dst = t;
y_dst here is the result of xf86_crtc_rotate_coord (the _back
version is supposed to undo the normal version), so we
can substitute y_dst with the y_dst calculation from
the normal xf86_crtc_rotate_coord when trying to get back
the orginal x_dst, resulting in:
x_dst = height - y_dst - 1;
Becoming:
x_dst = height - (width - orig_x_dst - 1) - 1;
Remove the ():
x_dst = height - width + orig_x_dst + 1 - 1;
Remove + 1 - 1:
x_dst = height - width + orig_x_dst;
So iow before my patch xf86_crtc_rotate_coord is not
properly undoing xf86_crtc_rotate. With my patch this
becomes:
x_dst = width - width + orig_x_dst;
Which can be simplified to:
x_dst = orig_x_dst;
Which is as it should be.
>> This was likely not noticed before since xf86_crtc_rotate_coord_back
>> until now was only used with cursor_info->MaxWidth and
>> cursor_info->MaxHeight, which are usally the same.
>
> I'd say it's kind of the other way around:
> xf86_crtc_transform_cursor_position just happens to still work with your
> change because usually cursor_info->MaxWidth == cursor_info->MaxHeight .
I could be wrong, but I don't think so, see above.
Regards,
Hans
More information about the xorg-devel
mailing list