diff options
author | Michel Dänzer <daenzer@vmware.com> | 2009-07-10 20:06:02 +0200 |
---|---|---|
committer | Michel Dänzer <michel@daenzer.net> | 2009-07-10 20:06:02 +0200 |
commit | 35758544813f156eaac28844e693b2a28f6de316 (patch) | |
tree | fddfb90cff60d9cf69e0557424a5549046bc28f0 | |
parent | 2638e9899e57d9b25a2cade3247083a6e101dee2 (diff) |
EXA: Only pass CT_YXBANDED to RECTS_TO_REGION() if that is really true.
Fixes http://bugs.freedesktop.org/show_bug.cgi?id=22642 .
-rw-r--r-- | exa/exa_accel.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/exa/exa_accel.c b/exa/exa_accel.c index 39f343784..001a4f0e2 100644 --- a/exa/exa_accel.c +++ b/exa/exa_accel.c @@ -394,6 +394,7 @@ exaHWCopyNtoN (DrawablePtr pSrcDrawable, if (rects) { int i; + int ordering; for (i = 0; i < nbox; i++) { rects[i].x = pbox[i].x1 + dx + src_off_x; @@ -402,7 +403,16 @@ exaHWCopyNtoN (DrawablePtr pSrcDrawable, rects[i].height = pbox[i].y2 - pbox[i].y1; } - srcregion = RECTS_TO_REGION(pScreen, nbox, rects, CT_YXBANDED); + /* This must match the miRegionCopy() logic for reversing rect order */ + if (nbox == 1 || (dx > 0 && dy > 0) || + (pDstDrawable != pSrcDrawable && + (pDstDrawable->type != DRAWABLE_WINDOW || + pSrcDrawable->type != DRAWABLE_WINDOW))) + ordering = CT_YXBANDED; + else + ordering = CT_UNSORTED; + + srcregion = RECTS_TO_REGION(pScreen, nbox, rects, ordering); xfree(rects); if (!pGC || !exaGCReadsDestination(pDstDrawable, pGC->planemask, |