Description: Clip area to stop refreshes outside the buffer Author: dave@treblig.org Bug: https://bugs.launchpad.net/ubuntu/+source/xserver-xorg-video-cirrus/+bug/1043513 Index: xserver-xorg-video-cirrus-1.5.1/src/cir_shadow.c =================================================================== --- xserver-xorg-video-cirrus-1.5.1.orig/src/cir_shadow.c 2012-12-06 13:01:35.137930320 +0000 +++ xserver-xorg-video-cirrus-1.5.1/src/cir_shadow.c 2012-12-06 13:02:27.601929013 +0000 @@ -15,6 +15,25 @@ #include "cir.h" #include "alp.h" +static short +shortClip(short i, short min, short max) +{ + if (imax) return max; + return i; +} + +static void +boxClip(BoxPtr pbox, short minx, short maxx, short miny, short maxy) +{ + /* Hmm, I assume there is some builtin function somewhere to do this + I've had a quick look and it's not obvious - dag */ + pbox->x1 = shortClip(pbox->x1, minx, maxx); + pbox->x2 = shortClip(pbox->x2, minx, maxx); + pbox->y1 = shortClip(pbox->y1, miny, maxy); + pbox->y2 = shortClip(pbox->y2, miny, maxy); +} + _X_EXPORT void cirRefreshArea(ScrnInfoPtr pScrn, int num, BoxPtr pbox) { @@ -26,11 +45,14 @@ FBPitch = BitmapBytePad(pScrn->displayWidth * pScrn->bitsPerPixel); while(num--) { - width = (pbox->x2 - pbox->x1) * Bpp; - height = pbox->y2 - pbox->y1; - src = pCir->ShadowPtr + (pbox->y1 * pCir->ShadowPitch) + - (pbox->x1 * Bpp); - dst = pCir->FbBase + (pbox->y1 * FBPitch) + (pbox->x1 * Bpp); + BoxRec clipped = *pbox; + boxClip(&clipped, 0, pScrn->virtualX, 0, pScrn->virtualY); + + width = (clipped.x2 - clipped.x1) * Bpp; + height = clipped.y2 - clipped.y1; + src = pCir->ShadowPtr + (clipped.y1 * pCir->ShadowPitch) + + (clipped.x1 * Bpp); + dst = pCir->FbBase + (clipped.y1 * FBPitch) + (clipped.x1 * Bpp); while(height--) { memcpy(dst, src, width);