diff options
author | Keith Packard <keithp@keithp.com> | 2008-03-15 00:33:30 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2008-03-15 00:33:30 -0700 |
commit | a6e5fa4ceb72795380496fcfe62c083866791dc1 (patch) | |
tree | 1fc0527defc350d0215aebf0e85def2cda8d24c9 | |
parent | 2a5fb0e58ed6ee1ff1f0ff00b5bf5b2623991132 (diff) |
Support CRTC Transform filters
XRRGetCrtcTransform now returns a giant struct containing all of the
transform and filter data.
XRRSetCrtcTransform now accepts filter parameters.
-rw-r--r-- | include/X11/extensions/Xrandr.h | 29 | ||||
-rw-r--r-- | src/XrrCrtc.c | 191 |
2 files changed, 140 insertions, 80 deletions
diff --git a/include/X11/extensions/Xrandr.h b/include/X11/extensions/Xrandr.h index 4112b39..32171f9 100644 --- a/include/X11/extensions/Xrandr.h +++ b/include/X11/extensions/Xrandr.h @@ -378,17 +378,34 @@ void XRRSetCrtcTransform (Display *dpy, RRCrtc crtc, XTransform *transform, - XTransform *inverse); + XTransform *inverse, + char *filter, + XFixed *params, + int nparams); + +typedef struct _XRRCrtcTransformAttributes { + XTransform pendingTransform; + XTransform pendingInverse; + char *pendingFilter; + int pendingNparams; + XFixed *pendingParams; + XTransform currentTransform; + XTransform currentInverse; + char *currentFilter; + int currentNparams; + XFixed *currentParams; +} XRRCrtcTransformAttributes; +/* + * Get current crtc transforms and filters. + * Pass *attributes to XFree to free + */ Status XRRGetCrtcTransform (Display *dpy, RRCrtc crtc, - XTransform *pendingTransform, - XTransform *pendingInverse, - XTransform *currentTransform, - XTransform *currentInverse); + XRRCrtcTransformAttributes **attributes); -/* +/* * intended to take RRScreenChangeNotify, or * ConfigureNotify (on the root window) * returns 1 if it is an event type it understands, 0 if not diff --git a/src/XrrCrtc.c b/src/XrrCrtc.c index 5b952e4..8bca1b1 100644 --- a/src/XrrCrtc.c +++ b/src/XrrCrtc.c @@ -273,14 +273,52 @@ XRRFreeGamma (XRRCrtcGamma *crtc_gamma) /* Version 1.3 additions */ +static void +XTransform_from_xRenderTransform (XTransform *x, + xRenderTransform *render) +{ + x->matrix[0][0] = render->matrix11; + x->matrix[0][1] = render->matrix12; + x->matrix[0][2] = render->matrix13; + + x->matrix[1][0] = render->matrix21; + x->matrix[1][1] = render->matrix22; + x->matrix[1][2] = render->matrix23; + + x->matrix[2][0] = render->matrix31; + x->matrix[2][1] = render->matrix32; + x->matrix[2][2] = render->matrix33; +} + +static void +xRenderTransform_from_XTransform (xRenderTransform *render, + XTransform *x) +{ + render->matrix11 = x->matrix[0][0]; + render->matrix12 = x->matrix[0][1]; + render->matrix13 = x->matrix[0][2]; + + render->matrix21 = x->matrix[1][0]; + render->matrix22 = x->matrix[1][1]; + render->matrix23 = x->matrix[1][2]; + + render->matrix31 = x->matrix[2][0]; + render->matrix32 = x->matrix[2][1]; + render->matrix33 = x->matrix[2][2]; +} + void XRRSetCrtcTransform (Display *dpy, RRCrtc crtc, XTransform *transform, - XTransform *inverse) + XTransform *inverse, + char *filter, + XFixed *params, + int nparams) { XExtDisplayInfo *info = XRRFindDisplay(dpy); xRRSetCrtcTransformReq *req; + int nbytes = strlen (filter); RRSimpleCheckExtension (dpy, info); @@ -290,26 +328,14 @@ XRRSetCrtcTransform (Display *dpy, 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]; - + xRenderTransform_from_XTransform (&req->transform, transform); + xRenderTransform_from_XTransform (&req->inverse, inverse); + + req->nbytesFilter = nbytes; + req->length += ((nbytes + 3) >> 2) + nparams; + Data (dpy, filter, nbytes); + Data32 (dpy, params, nparams << 2); + UnlockDisplay (dpy); SyncHandle (); } @@ -331,16 +357,18 @@ _XRRHasTransform (int major, int minor) Status XRRGetCrtcTransform (Display *dpy, RRCrtc crtc, - XTransform *pendingTransform, - XTransform *pendingInverse, - XTransform *currentTransform, - XTransform *currentInverse) + XRRCrtcTransformAttributes **attributes) { XExtDisplayInfo *info = XRRFindDisplay(dpy); XRandRInfo *xrri; xRRGetCrtcTransformReply rep; xRRGetCrtcTransformReq *req; int major_version, minor_version; + XRRCrtcTransformAttributes *attr; + char *extra = NULL, *e; + int p; + + *attributes = NULL; RRCheckExtension (dpy, info, False); @@ -350,8 +378,12 @@ XRRGetCrtcTransform (Display *dpy, /* For pre-1.3 servers, just report identity matrices everywhere */ rep.pendingTransform = identity; rep.pendingInverse = identity; + rep.pendingNbytesFilter = 0; + rep.pendingNparamsFilter = 0; rep.currentTransform = identity; rep.currentInverse = identity; + rep.currentNbytesFilter = 0; + rep.currentNparamsFilter = 0; } else { @@ -365,64 +397,75 @@ XRRGetCrtcTransform (Display *dpy, { rep.pendingTransform = identity; rep.pendingInverse = identity; + rep.pendingNbytesFilter = 0; + rep.pendingNparamsFilter = 0; rep.currentTransform = identity; rep.currentInverse = identity; + rep.currentNbytesFilter = 0; + rep.currentNparamsFilter = 0; + } + else + { + int extraBytes = rep.length * 4 - CrtcTransformExtra; + extra = Xmalloc (extraBytes); + if (!extra) { + _XEatData (dpy, extraBytes); + UnlockDisplay (dpy); + SyncHandle (); + return False; + } + _XRead (dpy, extra, extraBytes); } + 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; + attr = Xmalloc (sizeof (XRRCrtcTransformAttributes) + + rep.pendingNparamsFilter * sizeof (XFixed) + + rep.currentNparamsFilter * sizeof (XFixed) + + rep.pendingNbytesFilter + 1 + + rep.currentNbytesFilter + 1); + + if (!attr) { + XFree (extra); + return False; } - - 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; + XTransform_from_xRenderTransform (&attr->pendingTransform, &rep.pendingTransform); + XTransform_from_xRenderTransform (&attr->pendingInverse, &rep.pendingInverse); + XTransform_from_xRenderTransform (&attr->currentTransform, &rep.currentTransform); + XTransform_from_xRenderTransform (&attr->currentInverse, &rep.currentInverse); + + attr->pendingParams = (XFixed *) (attr + 1); + attr->currentParams = attr->pendingParams + rep.pendingNparamsFilter; + attr->pendingFilter = (char *) (attr->currentParams + rep.currentNparamsFilter); + attr->currentFilter = attr->pendingFilter + rep.pendingNbytesFilter + 1; + + e = extra; + + memcpy (attr->pendingFilter, e, rep.pendingNbytesFilter); + attr->pendingFilter[rep.pendingNbytesFilter] = '\0'; + e += (rep.pendingNbytesFilter + 3) & ~3; + for (p = 0; p < rep.pendingNparamsFilter; p++) { + INT32 f; + memcpy (&f, e, 4); + e += 4; + attr->pendingParams[p] = (XFixed) f; } - - 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; + + memcpy (attr->currentFilter, e, rep.currentNbytesFilter); + attr->currentFilter[rep.currentNbytesFilter] = '\0'; + e += (rep.currentNbytesFilter + 3) & ~3; + for (p = 0; p < rep.currentNparamsFilter; p++) { + INT32 f; + memcpy (&f, e, 4); + e += 4; + attr->currentParams[p] = (XFixed) f; } - + + if (extra) + XFree (extra); + *attributes = attr; + return True; } |