[PATCH] Use transform when computing scanout size of modes
Keith Packard
keithp at keithp.com
Fri Nov 14 14:12:34 PST 2008
Report transformed crtc sizes through RandR and Xinerama. Test screen size
against transformed mode sizes when configuring the Crtc.
---
randr/rrcrtc.c | 72 +++++++++++++++++++++++++++++++-------------------------
1 files changed, 40 insertions(+), 32 deletions(-)
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index e3ba4f8..bae17c5 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -528,30 +528,35 @@ RRCrtcGammaNotify (RRCrtcPtr crtc)
return TRUE; /* not much going on here */
}
-/**
- * Returns the width/height that the crtc scans out from the framebuffer
- */
-void
-RRCrtcGetScanoutSize(RRCrtcPtr crtc, int *width, int *height)
+static void
+RRModeGetScanoutSize (RRModePtr mode, PictTransformPtr transform,
+ int *width, int *height)
{
- if (crtc->mode == NULL) {
+ BoxRec box;
+
+ if (mode == NULL) {
*width = 0;
*height = 0;
return;
}
- switch (crtc->rotation & 0xf) {
- case RR_Rotate_0:
- case RR_Rotate_180:
- *width = crtc->mode->mode.width;
- *height = crtc->mode->mode.height;
- break;
- case RR_Rotate_90:
- case RR_Rotate_270:
- *width = crtc->mode->mode.height;
- *height = crtc->mode->mode.width;
- break;
- }
+ box.x1 = 0;
+ box.y1 = 0;
+ box.x2 = mode->mode.width;
+ box.y2 = mode->mode.height;
+
+ PictureTransformBounds (&box, transform);
+ *width = box.x2 - box.x1;
+ *height = box.y2 - box.y1;
+}
+
+/**
+ * Returns the width/height that the crtc scans out from the framebuffer
+ */
+void
+RRCrtcGetScanoutSize(RRCrtcPtr crtc, int *width, int *height)
+{
+ return RRModeGetScanoutSize (crtc->mode, &crtc->transform, width, height);
}
/*
@@ -1028,14 +1033,18 @@ ProcRRSetCrtcConfig (ClientPtr client)
*/
if (pScrPriv->rrScreenSetSize)
{
- int source_width = mode->mode.width;
- int source_height = mode->mode.height;
+ int source_width;
+ int source_height;
+ PictTransform transform, inverse;
+
+ if (!RRComputeTransform (mode, stuff->rotation,
+ stuff->x, stuff->y,
+ &crtc->client_pending_transform.transform,
+ &crtc->client_pending_transform.inverse,
+ &transform, &inverse))
+ return BadMatch;
- if ((rotation & 0xf) == RR_Rotate_90 || (rotation & 0xf) == RR_Rotate_270)
- {
- source_width = mode->mode.height;
- source_height = mode->mode.width;
- }
+ RRModeGetScanoutSize (mode, &transform, &source_width, &source_height);
if (stuff->x + source_width > pScreen->width)
{
client->errorValue = stuff->x;
@@ -1246,7 +1255,6 @@ transform_filter_encode (ClientPtr client, char *output,
CARD16 *nparamsFilter,
RRTransformPtr transform)
{
- char *output_orig = output;
int nbytes, nparams;
int n;
@@ -1260,17 +1268,17 @@ transform_filter_encode (ClientPtr client, char *output,
*nbytesFilter = nbytes;
*nparamsFilter = nparams;
memcpy (output, transform->filter->name, nbytes);
- output += nbytes;
while ((nbytes & 3) != 0)
- *output++ = 0;
- memcpy (output, transform->params, nparams * sizeof (xFixed));
+ output[nbytes++] = 0;
+ memcpy (output + nbytes, transform->params, nparams * sizeof (xFixed));
if (client->swapped) {
swaps (nbytesFilter, n);
swaps (nparamsFilter, n);
- SwapLongs ((CARD32 *) output, nparams * sizeof (xFixed));
+ SwapLongs ((CARD32 *) (output + nbytes),
+ nparams * sizeof (xFixed));
}
- output += nparams * sizeof (xFixed);
- return output - output_orig;
+ nbytes += nparams * sizeof (xFixed);
+ return nbytes;
}
static void
--
1.5.6.5
More information about the xorg
mailing list