rotation: fix cursor and overlap of one pixel.
Commit77c7a64e88
was 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
06fda4d3c8
commit
6892697640
|
@ -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…
Reference in New Issue