Commit 57cd32e9 authored by Aaron Plattner's avatar Aaron Plattner Committed by Keith Packard

xfree86/modes: Make cursor position transform a helper function

When the driver can handle the crtc transform in hardware, it sets
crtc->driverIsPerformingTransform, which turns off both the shadow
layer and the cursor's position-transforming code.  However, some
drivers actually do require the cursor position to still be
transformed in these cases.  Move the cursor position transform into a
helper function that can be called by such drivers.
Signed-off-by: Aaron Plattner's avatarAaron Plattner <aplattner@nvidia.com>
parent 245cb8e9
...@@ -948,6 +948,14 @@ xf86_hide_cursors (ScrnInfoPtr scrn); ...@@ -948,6 +948,14 @@ xf86_hide_cursors (ScrnInfoPtr scrn);
extern _X_EXPORT void extern _X_EXPORT void
xf86_cursors_fini (ScreenPtr screen); xf86_cursors_fini (ScreenPtr screen);
/**
* Transform the cursor's coordinates based on the crtc transform. Normally
* this is done by the server, but if crtc->driverIsPerformingTransform is TRUE,
* then the server does not transform the cursor position automatically.
*/
extern _X_EXPORT void
xf86CrtcTransformCursorPos (xf86CrtcPtr crtc, int *x, int *y);
/* /*
* For overlay video, compute the relevant CRTC and * For overlay video, compute the relevant CRTC and
* clip video to that. * clip video to that.
......
...@@ -337,7 +337,36 @@ xf86_show_cursors (ScrnInfoPtr scrn) ...@@ -337,7 +337,36 @@ xf86_show_cursors (ScrnInfoPtr scrn)
xf86_crtc_show_cursor (crtc); xf86_crtc_show_cursor (crtc);
} }
} }
void xf86CrtcTransformCursorPos (xf86CrtcPtr crtc, int *x, int *y)
{
ScrnInfoPtr scrn = crtc->scrn;
ScreenPtr screen = scrn->pScreen;
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
xf86CursorScreenPtr ScreenPriv =
(xf86CursorScreenPtr)dixLookupPrivate(&screen->devPrivates,
xf86CursorScreenKey);
struct pict_f_vector v;
int dx, dy;
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);
/* 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
*/
xf86_crtc_rotate_coord_back (crtc->rotation, cursor_info->MaxWidth,
cursor_info->MaxHeight, ScreenPriv->HotX,
ScreenPriv->HotY, &dx, &dy);
*x -= dx;
*y -= dy;
}
static void static void
xf86_crtc_set_cursor_position (xf86CrtcPtr crtc, int x, int y) xf86_crtc_set_cursor_position (xf86CrtcPtr crtc, int x, int y)
{ {
...@@ -346,36 +375,12 @@ xf86_crtc_set_cursor_position (xf86CrtcPtr crtc, int x, int y) ...@@ -346,36 +375,12 @@ xf86_crtc_set_cursor_position (xf86CrtcPtr crtc, int x, int y)
xf86CursorInfoPtr cursor_info = xf86_config->cursor_info; xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
DisplayModePtr mode = &crtc->mode; DisplayModePtr mode = &crtc->mode;
Bool in_range; Bool in_range;
int dx, dy;
/* /*
* Transform position of cursor on screen * Transform position of cursor on screen
*/ */
if (crtc->transform_in_use && !crtc->driverIsPerformingTransform) if (crtc->transform_in_use && !crtc->driverIsPerformingTransform)
{ xf86CrtcTransformCursorPos(crtc, &x, &y);
ScreenPtr screen = scrn->pScreen;
xf86CursorScreenPtr ScreenPriv =
(xf86CursorScreenPtr)dixLookupPrivate(&screen->devPrivates,
xf86CursorScreenKey);
struct pict_f_vector v;
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);
/* 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
*/
xf86_crtc_rotate_coord_back (crtc->rotation,
cursor_info->MaxWidth,
cursor_info->MaxHeight,
ScreenPriv->HotX, ScreenPriv->HotY, &dx, &dy);
x -= dx;
y -= dy;
}
else else
{ {
x -= crtc->x; x -= crtc->x;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment