summaryrefslogtreecommitdiff
path: root/src/XrrCrtc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/XrrCrtc.c')
-rw-r--r--src/XrrCrtc.c156
1 files changed, 156 insertions, 0 deletions
diff --git a/src/XrrCrtc.c b/src/XrrCrtc.c
index 5e5c813..5b952e4 100644
--- a/src/XrrCrtc.c
+++ b/src/XrrCrtc.c
@@ -270,3 +270,159 @@ XRRFreeGamma (XRRCrtcGamma *crtc_gamma)
{
Xfree (crtc_gamma);
}
+
+/* Version 1.3 additions */
+
+void
+XRRSetCrtcTransform (Display *dpy,
+ RRCrtc crtc,
+ XTransform *transform,
+ XTransform *inverse)
+{
+ XExtDisplayInfo *info = XRRFindDisplay(dpy);
+ xRRSetCrtcTransformReq *req;
+
+ RRSimpleCheckExtension (dpy, info);
+
+ LockDisplay(dpy);
+ GetReq (RRSetCrtcTransform, req);
+ req->reqType = info->codes->major_opcode;
+ req->randrReqType = X_RRSetCrtcTransform;
+ req->crtc = crtc;
+
+ req->transform.matrix11 = transform->matrix[0][0];
+ req->transform.matrix12 = transform->matrix[0][1];
+ req->transform.matrix13 = transform->matrix[0][2];
+ req->transform.matrix21 = transform->matrix[1][0];
+ req->transform.matrix22 = transform->matrix[1][1];
+ req->transform.matrix23 = transform->matrix[1][2];
+ req->transform.matrix31 = transform->matrix[2][0];
+ req->transform.matrix32 = transform->matrix[2][1];
+ req->transform.matrix33 = transform->matrix[2][2];
+
+ req->inverse.matrix11 = inverse->matrix[0][0];
+ req->inverse.matrix12 = inverse->matrix[0][1];
+ req->inverse.matrix13 = inverse->matrix[0][2];
+ req->inverse.matrix21 = inverse->matrix[1][0];
+ req->inverse.matrix22 = inverse->matrix[1][1];
+ req->inverse.matrix23 = inverse->matrix[1][2];
+ req->inverse.matrix31 = inverse->matrix[2][0];
+ req->inverse.matrix32 = inverse->matrix[2][1];
+ req->inverse.matrix33 = inverse->matrix[2][2];
+
+ UnlockDisplay (dpy);
+ SyncHandle ();
+}
+
+#define CrtcTransformExtra (SIZEOF(xRRGetCrtcTransformReply) - 32)
+
+static const xRenderTransform identity = {
+ 0x10000, 0, 0,
+ 0, 0x10000, 0,
+ 0, 0, 0x10000,
+};
+
+static Bool
+_XRRHasTransform (int major, int minor)
+{
+ return major > 1 || (major == 1 && minor >= 3);
+}
+
+Status
+XRRGetCrtcTransform (Display *dpy,
+ RRCrtc crtc,
+ XTransform *pendingTransform,
+ XTransform *pendingInverse,
+ XTransform *currentTransform,
+ XTransform *currentInverse)
+{
+ XExtDisplayInfo *info = XRRFindDisplay(dpy);
+ XRandRInfo *xrri;
+ xRRGetCrtcTransformReply rep;
+ xRRGetCrtcTransformReq *req;
+ int major_version, minor_version;
+
+ RRCheckExtension (dpy, info, False);
+
+ if (!XRRQueryVersion (dpy, &major_version, &minor_version) ||
+ !_XRRHasTransform (major_version, minor_version))
+ {
+ /* For pre-1.3 servers, just report identity matrices everywhere */
+ rep.pendingTransform = identity;
+ rep.pendingInverse = identity;
+ rep.currentTransform = identity;
+ rep.currentInverse = identity;
+ }
+ else
+ {
+ LockDisplay (dpy);
+ GetReq (RRGetCrtcTransform, req);
+ req->reqType = info->codes->major_opcode;
+ req->randrReqType = X_RRGetCrtcTransform;
+ req->crtc = crtc;
+
+ if (!_XReply (dpy, (xReply *) &rep, CrtcTransformExtra >> 2, xFalse))
+ {
+ rep.pendingTransform = identity;
+ rep.pendingInverse = identity;
+ rep.currentTransform = identity;
+ rep.currentInverse = identity;
+ }
+ UnlockDisplay (dpy);
+ SyncHandle ();
+ }
+
+ if (pendingTransform)
+ {
+ pendingTransform->matrix[0][0] = rep.pendingTransform.matrix11;
+ pendingTransform->matrix[0][1] = rep.pendingTransform.matrix12;
+ pendingTransform->matrix[0][2] = rep.pendingTransform.matrix13;
+ pendingTransform->matrix[1][0] = rep.pendingTransform.matrix21;
+ pendingTransform->matrix[1][1] = rep.pendingTransform.matrix22;
+ pendingTransform->matrix[1][2] = rep.pendingTransform.matrix23;
+ pendingTransform->matrix[2][0] = rep.pendingTransform.matrix31;
+ pendingTransform->matrix[2][1] = rep.pendingTransform.matrix32;
+ pendingTransform->matrix[2][2] = rep.pendingTransform.matrix33;
+ }
+
+ if (pendingInverse)
+ {
+ pendingInverse->matrix[0][0] = rep.pendingInverse.matrix11;
+ pendingInverse->matrix[0][1] = rep.pendingInverse.matrix12;
+ pendingInverse->matrix[0][2] = rep.pendingInverse.matrix13;
+ pendingInverse->matrix[1][0] = rep.pendingInverse.matrix21;
+ pendingInverse->matrix[1][1] = rep.pendingInverse.matrix22;
+ pendingInverse->matrix[1][2] = rep.pendingInverse.matrix23;
+ pendingInverse->matrix[2][0] = rep.pendingInverse.matrix31;
+ pendingInverse->matrix[2][1] = rep.pendingInverse.matrix32;
+ pendingInverse->matrix[2][2] = rep.pendingInverse.matrix33;
+ }
+
+ if (currentTransform)
+ {
+ currentTransform->matrix[0][0] = rep.currentTransform.matrix11;
+ currentTransform->matrix[0][1] = rep.currentTransform.matrix12;
+ currentTransform->matrix[0][2] = rep.currentTransform.matrix13;
+ currentTransform->matrix[1][0] = rep.currentTransform.matrix21;
+ currentTransform->matrix[1][1] = rep.currentTransform.matrix22;
+ currentTransform->matrix[1][2] = rep.currentTransform.matrix23;
+ currentTransform->matrix[2][0] = rep.currentTransform.matrix31;
+ currentTransform->matrix[2][1] = rep.currentTransform.matrix32;
+ currentTransform->matrix[2][2] = rep.currentTransform.matrix33;
+ }
+
+ if (currentInverse)
+ {
+ currentInverse->matrix[0][0] = rep.currentInverse.matrix11;
+ currentInverse->matrix[0][1] = rep.currentInverse.matrix12;
+ currentInverse->matrix[0][2] = rep.currentInverse.matrix13;
+ currentInverse->matrix[1][0] = rep.currentInverse.matrix21;
+ currentInverse->matrix[1][1] = rep.currentInverse.matrix22;
+ currentInverse->matrix[1][2] = rep.currentInverse.matrix23;
+ currentInverse->matrix[2][0] = rep.currentInverse.matrix31;
+ currentInverse->matrix[2][1] = rep.currentInverse.matrix32;
+ currentInverse->matrix[2][2] = rep.currentInverse.matrix33;
+ }
+
+ return True;
+}