diff options
author | Jamey Sharp <jamey@minilop.net> | 2010-04-23 19:33:49 -0700 |
---|---|---|
committer | Jamey Sharp <jamey@minilop.net> | 2010-06-03 14:04:20 -0700 |
commit | f114f54986aca1add4c8808a05d9692e289547e7 (patch) | |
tree | d4b263deffec065a787fab3ecea490138fd553e0 /Xext/panoramiXprocs.c | |
parent | a7c7ebe4b3a0df1a4d1ffe3c690cfb21470f103d (diff) |
Accumulate graphics exposures incrementally in PanoramiXCopyArea/Plane.
This fuses two loops in each function, eliminating an intermediate
MAXSCREENS-sized array from each.
Aside from being more efficient, I believe this is equivalent to the
previous implementation, since
- each per-screen GC has the graphicsExposures flag set the same way,
and
- the REGION_* macros ignore their screen argument.
Signed-off-by: Jamey Sharp <jamey@minilop.net>
Reviewed-by: Keith Packard <keithp@keithp.com>
Reviewed-by: Tiago Vignatti <tiago.vignatti@nokia.com>
Tested-by: Tiago Vignatti <tiago.vignatti@nokia.com> (i686 GNU/Linux)
Diffstat (limited to 'Xext/panoramiXprocs.c')
-rw-r--r-- | Xext/panoramiXprocs.c | 62 |
1 files changed, 26 insertions, 36 deletions
diff --git a/Xext/panoramiXprocs.c b/Xext/panoramiXprocs.c index a7f8a0cd5..5ccbe27c8 100644 --- a/Xext/panoramiXprocs.c +++ b/Xext/panoramiXprocs.c @@ -1084,10 +1084,12 @@ int PanoramiXCopyArea(ClientPtr client) } else { DrawablePtr pDst = NULL, pSrc = NULL; GCPtr pGC = NULL; - RegionPtr pRgn[MAXSCREENS]; + RegionRec totalReg; int rc; + REGION_NULL(unusedScreen, &totalReg); FOR_NSCREENS_BACKWARD(j) { + RegionPtr pRgn; stuff->dstDrawable = dst->info[j].id; stuff->srcDrawable = src->info[j].id; stuff->gc = gc->info[j].id; @@ -1116,37 +1118,30 @@ int PanoramiXCopyArea(ClientPtr client) } else pSrc = pDst; - pRgn[j] = (*pGC->ops->CopyArea)(pSrc, pDst, pGC, + pRgn = (*pGC->ops->CopyArea)(pSrc, pDst, pGC, stuff->srcX, stuff->srcY, stuff->width, stuff->height, stuff->dstX, stuff->dstY); + if(pGC->graphicsExposures && pRgn) { + if(srcIsRoot) { + REGION_TRANSLATE(unusedScreen, pRgn, + screenInfo.screens[j]->x, screenInfo.screens[j]->y); + } + REGION_APPEND(unusedScreen, &totalReg, pRgn); + REGION_DESTROY(unusedScreen, pRgn); + } - if(dstShared) { - while(j--) pRgn[j] = NULL; + if(dstShared) break; - } } if(pGC->graphicsExposures) { ScreenPtr pScreen = pDst->pScreen; - RegionRec totalReg; Bool overlap; - - REGION_NULL(pScreen, &totalReg); - FOR_NSCREENS_BACKWARD(j) { - if(pRgn[j]) { - if(srcIsRoot) { - REGION_TRANSLATE(pScreen, pRgn[j], - screenInfo.screens[j]->x, screenInfo.screens[j]->y); - } - REGION_APPEND(pScreen, &totalReg, pRgn[j]); - REGION_DESTROY(pScreen, pRgn[j]); - } - } - REGION_VALIDATE(pScreen, &totalReg, &overlap); + REGION_VALIDATE(unusedScreen, &totalReg, &overlap); (*pScreen->SendGraphicsExpose)( client, &totalReg, stuff->dstDrawable, X_CopyArea, 0); - REGION_UNINIT(pScreen, &totalReg); + REGION_UNINIT(unusedScreen, &totalReg); } } @@ -1163,7 +1158,7 @@ int PanoramiXCopyPlane(ClientPtr client) Bool srcShared, dstShared; DrawablePtr psrcDraw, pdstDraw = NULL; GCPtr pGC = NULL; - RegionPtr pRgn[MAXSCREENS]; + RegionRec totalReg; REQUEST(xCopyPlaneReq); REQUEST_SIZE_MATCH(xCopyPlaneReq); @@ -1198,7 +1193,9 @@ int PanoramiXCopyPlane(ClientPtr client) srcx = stuff->srcX; srcy = stuff->srcY; dstx = stuff->dstX; dsty = stuff->dstY; + REGION_NULL(unusedScreen, &totalReg); FOR_NSCREENS_BACKWARD(j) { + RegionPtr pRgn; stuff->dstDrawable = dst->info[j].id; stuff->srcDrawable = src->info[j].id; stuff->gc = gc->info[j].id; @@ -1231,33 +1228,26 @@ int PanoramiXCopyPlane(ClientPtr client) return(BadValue); } - pRgn[j] = (*pGC->ops->CopyPlane)(psrcDraw, pdstDraw, pGC, + pRgn = (*pGC->ops->CopyPlane)(psrcDraw, pdstDraw, pGC, stuff->srcX, stuff->srcY, stuff->width, stuff->height, stuff->dstX, stuff->dstY, stuff->bitPlane); + if(pGC->graphicsExposures && pRgn) { + REGION_APPEND(unusedScreen, &totalReg, pRgn); + REGION_DESTROY(unusedScreen, pRgn); + } - if(dstShared) { - while(j--) pRgn[j] = NULL; + if(dstShared) break; - } } if(pGC->graphicsExposures) { ScreenPtr pScreen = pdstDraw->pScreen; - RegionRec totalReg; Bool overlap; - - REGION_NULL(pScreen, &totalReg); - FOR_NSCREENS_BACKWARD(j) { - if(pRgn[j]) { - REGION_APPEND(pScreen, &totalReg, pRgn[j]); - REGION_DESTROY(pScreen, pRgn[j]); - } - } - REGION_VALIDATE(pScreen, &totalReg, &overlap); + REGION_VALIDATE(unusedScreen, &totalReg, &overlap); (*pScreen->SendGraphicsExpose)( client, &totalReg, stuff->dstDrawable, X_CopyPlane, 0); - REGION_UNINIT(pScreen, &totalReg); + REGION_UNINIT(unusedScreen, &totalReg); } return Success; |