mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2025-12-27 11:40:06 +01:00
rotation: fix cursor and overlap of one pixel.
Commit77c7a64e88was introduced to fix a cursor off by one on Intel hw, however it also move the whole crtc into an off by one position and you could see gnom-eshell overlapping. This commit reverts that and instead fixes the cursor hotspot translation to work like pixman does. We add 0.5 to the cursor vector before translating, and floor the value afterwards. Thanks to Soeren (ssp) for pointing out where the real problem was after explaning how pixman translates points. Signed-off-by: Dave Airlie <airlied@redhat.com> Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Keith Packard <keithp@keithp.com> (cherry picked from commit80d1a548d6)
This commit is contained in:
parent
ffbdba0319
commit
a1095c1372
2 changed files with 20 additions and 17 deletions
|
|
@ -327,10 +327,13 @@ xf86_crtc_set_cursor_position (xf86CrtcPtr crtc, int x, int y)
|
|||
xf86CursorScreenKey);
|
||||
struct pict_f_vector v;
|
||||
|
||||
v.v[0] = x + ScreenPriv->HotX; v.v[1] = y + ScreenPriv->HotY; v.v[2] = 1;
|
||||
v.v[0] = (x + ScreenPriv->HotX) + 0.5;
|
||||
v.v[1] = (y + ScreenPriv->HotY) + 0.5;
|
||||
v.v[2] = 1;
|
||||
pixman_f_transform_point (&crtc->f_framebuffer_to_crtc, &v);
|
||||
x = floor (v.v[0] + 0.5);
|
||||
y = floor (v.v[1] + 0.5);
|
||||
/* cursor will have 0.5 added to it already so floor is sufficent */
|
||||
x = floor (v.v[0]);
|
||||
y = floor (v.v[1]);
|
||||
/*
|
||||
* Transform position of cursor upper left corner
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -185,21 +185,21 @@ RRTransformCompute (int x,
|
|||
break;
|
||||
case RR_Rotate_90:
|
||||
f_rot_cos = 0; f_rot_sin = 1;
|
||||
f_rot_dx = height-1; f_rot_dy = 0;
|
||||
f_rot_dx = height; f_rot_dy = 0;
|
||||
rot_cos = F ( 0); rot_sin = F ( 1);
|
||||
rot_dx = F (height-1); rot_dy = F (0);
|
||||
rot_dx = F ( height); rot_dy = F (0);
|
||||
break;
|
||||
case RR_Rotate_180:
|
||||
f_rot_cos = -1; f_rot_sin = 0;
|
||||
f_rot_dx = width - 1; f_rot_dy = height - 1;
|
||||
f_rot_dx = width; f_rot_dy = height;
|
||||
rot_cos = F (-1); rot_sin = F ( 0);
|
||||
rot_dx = F (width-1); rot_dy = F ( height-1);
|
||||
rot_dx = F (width); rot_dy = F ( height);
|
||||
break;
|
||||
case RR_Rotate_270:
|
||||
f_rot_cos = 0; f_rot_sin = -1;
|
||||
f_rot_dx = 0; f_rot_dy = width-1;
|
||||
f_rot_dx = 0; f_rot_dy = width;
|
||||
rot_cos = F ( 0); rot_sin = F (-1);
|
||||
rot_dx = F ( 0); rot_dy = F ( width-1);
|
||||
rot_dx = F ( 0); rot_dy = F ( width);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -222,11 +222,11 @@ RRTransformCompute (int x,
|
|||
f_scale_x = -1;
|
||||
scale_x = F(-1);
|
||||
if (rotation & (RR_Rotate_0|RR_Rotate_180)) {
|
||||
f_scale_dx = width-1;
|
||||
scale_dx = F(width-1);
|
||||
f_scale_dx = width;
|
||||
scale_dx = F(width);
|
||||
} else {
|
||||
f_scale_dx = height-1;
|
||||
scale_dx = F(height-1);
|
||||
f_scale_dx = height;
|
||||
scale_dx = F(height);
|
||||
}
|
||||
}
|
||||
if (rotation & RR_Reflect_Y)
|
||||
|
|
@ -234,11 +234,11 @@ RRTransformCompute (int x,
|
|||
f_scale_y = -1;
|
||||
scale_y = F(-1);
|
||||
if (rotation & (RR_Rotate_0|RR_Rotate_180)) {
|
||||
f_scale_dy = height-1;
|
||||
scale_dy = F(height-1);
|
||||
f_scale_dy = height;
|
||||
scale_dy = F(height);
|
||||
} else {
|
||||
f_scale_dy = width-1;
|
||||
scale_dy = F(width-1);
|
||||
f_scale_dy = width;
|
||||
scale_dy = F(width);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue