diff options
Diffstat (limited to 'xorg/server/module/rdpComposite.c')
-rw-r--r-- | xorg/server/module/rdpComposite.c | 62 |
1 files changed, 61 insertions, 1 deletions
diff --git a/xorg/server/module/rdpComposite.c b/xorg/server/module/rdpComposite.c index 87a9364f..59ab93d0 100644 --- a/xorg/server/module/rdpComposite.c +++ b/xorg/server/module/rdpComposite.c @@ -35,8 +35,10 @@ composite(alpha blending) calls #include <picture.h> #include "rdp.h" -#include "rdpComposite.h" #include "rdpDraw.h" +#include "rdpClientCon.h" +#include "rdpReg.h" +#include "rdpComposite.h" /******************************************************************************/ #define LOG_LEVEL 1 @@ -45,6 +47,17 @@ composite(alpha blending) calls /******************************************************************************/ static void +rdpCompositePre(rdpPtr dev, rdpClientCon *clientCon, + PictureScreenPtr ps, CARD8 op, PicturePtr pSrc, + PicturePtr pMask, PicturePtr pDst, + INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask, + INT16 xDst, INT16 yDst, CARD16 width, CARD16 height, + BoxPtr box) +{ +} + +/******************************************************************************/ +static void rdpCompositeOrg(PictureScreenPtr ps, rdpPtr dev, CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst, INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask, @@ -57,6 +70,30 @@ rdpCompositeOrg(PictureScreenPtr ps, rdpPtr dev, } /******************************************************************************/ +static void +rdpCompositePost(rdpPtr dev, rdpClientCon *clientCon, + PictureScreenPtr ps, CARD8 op, PicturePtr pSrc, + PicturePtr pMask, PicturePtr pDst, + INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask, + INT16 xDst, INT16 yDst, CARD16 width, CARD16 height, + BoxPtr box) +{ + RegionRec reg; + + if (!XRDP_DRAWABLE_IS_VISIBLE(dev, pDst->pDrawable)) + { + return; + } + rdpRegionInit(®, box, 0); + if (pDst->pCompositeClip != 0) + { + rdpRegionIntersect(®, pDst->pCompositeClip, ®); + } + rdpClientConAddDirtyScreenReg(dev, clientCon, ®); + RegionUninit(®); +} + +/******************************************************************************/ void rdpComposite(CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst, INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask, INT16 xDst, @@ -64,12 +101,35 @@ rdpComposite(CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst, { ScreenPtr pScreen; rdpPtr dev; + rdpClientCon *clientCon; PictureScreenPtr ps; + BoxRec box; LLOGLN(10, ("rdpComposite:")); pScreen = pSrc->pDrawable->pScreen; dev = rdpGetDevFromScreen(pScreen); + box.x1 = xDst + pDst->pDrawable->x; + box.y1 = yDst + pDst->pDrawable->y; + box.x2 = box.x1 + width; + box.y2 = box.y1 + height; ps = GetPictureScreen(pScreen); + clientCon = dev->clientConHead; + while (clientCon != NULL) + { + rdpCompositePre(dev, clientCon, ps, op, pSrc, pMask, pDst, + xSrc, ySrc, xMask, yMask, xDst, yDst, + width, height, &box); + clientCon = clientCon->next; + } + /* do original call */ rdpCompositeOrg(ps, dev, op, pSrc, pMask, pDst, xSrc, ySrc, xMask, yMask, xDst, yDst, width, height); + clientCon = dev->clientConHead; + while (clientCon != NULL) + { + rdpCompositePost(dev, clientCon, ps, op, pSrc, pMask, pDst, + xSrc, ySrc, xMask, yMask, xDst, yDst, + width, height, &box); + clientCon = clientCon->next; + } } |