Fix bug 8871 - scrolling corruption with a compositing manager

Call miHandleExposures() in CopyArea/CopyPlane explicitly in cw to
generate GraphicsExposes correctly.
This commit is contained in:
Soren Sandmann Pedersen 2007-04-26 12:41:01 -04:00
parent 0ff7c94fcf
commit 4fe918b385

View File

@ -30,6 +30,7 @@
#include "gcstruct.h" #include "gcstruct.h"
#include "pixmapstr.h" #include "pixmapstr.h"
#include "cw.h" #include "cw.h"
#include "mi.h"
#define SETUP_BACKING_DST(_pDst, _pGC) \ #define SETUP_BACKING_DST(_pDst, _pGC) \
cwGCPtr pGCPrivate = getCwGC (_pGC); \ cwGCPtr pGCPrivate = getCwGC (_pGC); \
@ -185,7 +186,7 @@ cwCopyArea(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, int srcx, int srcy,
int w, int h, int dstx, int dsty) int w, int h, int dstx, int dsty)
{ {
int odstx, odsty; int odstx, odsty;
RegionPtr exposed = NULL; int osrcx, osrcy;
SETUP_BACKING_DST(pDst, pGC); SETUP_BACKING_DST(pDst, pGC);
SETUP_BACKING_SRC(pSrc, pGC); SETUP_BACKING_SRC(pSrc, pGC);
@ -193,19 +194,20 @@ cwCopyArea(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, int srcx, int srcy,
odstx = dstx; odstx = dstx;
odsty = dsty; odsty = dsty;
osrcx = srcx;
osrcy = srcy;
CW_OFFSET_XY_DST(dstx, dsty); CW_OFFSET_XY_DST(dstx, dsty);
CW_OFFSET_XY_SRC(srcx, srcy); CW_OFFSET_XY_SRC(srcx, srcy);
exposed = (*pBackingGC->ops->CopyArea)(pBackingSrc, pBackingDst, (*pBackingGC->ops->CopyArea)(pBackingSrc, pBackingDst,
pBackingGC, srcx, srcy, w, h, pBackingGC, srcx, srcy, w, h,
dstx, dsty); dstx, dsty);
if (exposed != NULL)
REGION_TRANSLATE(pDst->pScreen, exposed, odstx - dstx, odsty - dsty);
EPILOGUE(pGC); EPILOGUE(pGC);
return exposed; return miHandleExposures(pSrc, pDst, pGC,
osrcx, osrcy, w, h,
odstx, odsty, 0);
} }
static RegionPtr static RegionPtr
@ -213,7 +215,7 @@ cwCopyPlane(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, int srcx, int srcy,
int w, int h, int dstx, int dsty, unsigned long plane) int w, int h, int dstx, int dsty, unsigned long plane)
{ {
int odstx, odsty; int odstx, odsty;
RegionPtr exposed = NULL; int osrcx, osrcy;
SETUP_BACKING_DST(pDst, pGC); SETUP_BACKING_DST(pDst, pGC);
SETUP_BACKING_SRC(pSrc, pGC); SETUP_BACKING_SRC(pSrc, pGC);
@ -221,19 +223,20 @@ cwCopyPlane(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, int srcx, int srcy,
odstx = dstx; odstx = dstx;
odsty = dsty; odsty = dsty;
osrcx = srcx;
osrcy = srcy;
CW_OFFSET_XY_DST(dstx, dsty); CW_OFFSET_XY_DST(dstx, dsty);
CW_OFFSET_XY_SRC(srcx, srcy); CW_OFFSET_XY_SRC(srcx, srcy);
exposed = (*pBackingGC->ops->CopyPlane)(pBackingSrc, pBackingDst, (*pBackingGC->ops->CopyPlane)(pBackingSrc, pBackingDst,
pBackingGC, srcx, srcy, w, h, pBackingGC, srcx, srcy, w, h,
dstx, dsty, plane); dstx, dsty, plane);
if (exposed != NULL)
REGION_TRANSLATE(pDst->pScreen, exposed, odstx - dstx, odsty - dsty);
EPILOGUE(pGC); EPILOGUE(pGC);
return exposed; return miHandleExposures(pSrc, pDst, pGC,
osrcx, osrcy, w, h,
odstx, odsty, plane);
} }
static void static void