XRender, clip region and transformations

Olivier Fourdan fourdan at gmail.com
Mon Feb 9 00:56:39 PST 2015


I am trying to scale down a (possibly shaped) window using XRender to a pixmap.

The transform matrix is the usual matrix for scaling, i.e:

   1.0  0.0  0.0
   0.0  1.0  0.0
   0.0  0.0  scale

My code does exactly this:

    pa.subwindow_mode = IncludeInferiors;
    srcPicture = XRenderCreatePicture (dpy, window_id, render_format,
CPSubwindowMode, &pa);
    XRenderSetPictureFilter (dpy, srcPicture, FilterBest, NULL, 0);

    region = XFixesCreateRegionFromWindow (dpy, window_id,
    XFixesSetPictureClipRegion (dpy, srcPicture, 0, 0, region);
    XFixesDestroyRegion (dpy, region);

    render_format = XRenderFindStandardFormat (dpy, PictStandardARGB32);
    destPicture = XRenderCreatePicture (dpy, pixmap, render_format, 0, NULL);
    XRenderFillRectangle (dpy, PictOpSrc, destPicture, &c, 0, 0,
dest_w, dest_h);

    XRenderSetPictureTransform (dpy, srcPicture, &transform);
    XRenderComposite (dpy, PictOpOver, srcPicture, None, destPicture,
0, 0, 0, 0, 0, 0, dest_w, dest_h);

The scaling works as expected, but the problem is that the clipping
region set on the source picture is applied *after* the transformation
and not before (thus possibly ruining the result when the window is
shaped), and I fail to understand why.

Could someone help me understanding what I'm doing wrong here?


More information about the xorg mailing list