Index: fbcompose.c =================================================================== RCS file: /cvs/xorg/xc/programs/Xserver/fb/fbcompose.c,v retrieving revision 1.26 diff -u -p -r1.26 fbcompose.c --- fbcompose.c 9 Dec 2005 18:35:20 -0000 1.26 +++ fbcompose.c 2 May 2006 16:25:55 -0000 @@ -2860,7 +2860,7 @@ static void fbFetchTransformed(PicturePt FbBits *bits; FbStride stride; int bpp; - int xoff, yoff; + int xoff, yoff, dx, dy; fetchPixelProc fetch; PictVector v; PictVector unit; @@ -2875,8 +2875,11 @@ static void fbFetchTransformed(PicturePt x += xoff; y += yoff; - v.vector[0] = IntToxFixed(x); - v.vector[1] = IntToxFixed(y); + dx = pict->pDrawable->x; + dy = pict->pDrawable->y; + + v.vector[0] = IntToxFixed(x - dx); + v.vector[1] = IntToxFixed(y - dy); v.vector[2] = xFixed1; /* when using convolution filters one might get here without a transform */ @@ -2909,7 +2912,7 @@ static void fbFetchTransformed(PicturePt y = MOD(v.vector[1]>>16, pict->pDrawable->height); x = MOD(v.vector[0]>>16, pict->pDrawable->width); } - buffer[i] = fetch(bits + (y + pict->pDrawable->y)*stride, x + pict->pDrawable->x, indexed); + buffer[i] = fetch(bits + (y + dy)*stride, x + dx, indexed); } v.vector[0] += unit.vector[0]; v.vector[1] += unit.vector[1]; @@ -2927,8 +2930,8 @@ static void fbFetchTransformed(PicturePt y = MOD(v.vector[1]>>16, pict->pDrawable->height); x = MOD(v.vector[0]>>16, pict->pDrawable->width); } - if (POINT_IN_REGION (0, pict->pCompositeClip, x, y, &box)) - buffer[i] = fetch(bits + (y + pict->pDrawable->y)*stride, x + pict->pDrawable->x, indexed); + if (POINT_IN_REGION (0, pict->pCompositeClip, x + dx, y + dy, &box)) + buffer[i] = fetch(bits + (y + dy)*stride, x + dx, indexed); else buffer[i] = 0; } @@ -2940,6 +2943,10 @@ static void fbFetchTransformed(PicturePt } else { if (REGION_NUM_RECTS(pict->pCompositeClip) == 1) { box = pict->pCompositeClip->extents; + box.x1 -= dx; + box.x2 -= dx; + box.y1 -= dy; + box.y2 -= dy; for (i = 0; i < width; ++i) { if (!v.vector[2]) { buffer[i] = 0; @@ -2952,7 +2959,7 @@ static void fbFetchTransformed(PicturePt x = v.vector[0]>>16; } buffer[i] = ((x < box.x1) | (x >= box.x2) | (y < box.y1) | (y >= box.y2)) ? - 0 : fetch(bits + (y + pict->pDrawable->y)*stride, x + pict->pDrawable->x, indexed); + 0 : fetch(bits + (y + dy)*stride, x + dx, indexed); } v.vector[0] += unit.vector[0]; v.vector[1] += unit.vector[1]; @@ -2970,8 +2977,8 @@ static void fbFetchTransformed(PicturePt y = v.vector[1]>>16; x = v.vector[0]>>16; } - if (POINT_IN_REGION (0, pict->pCompositeClip, x, y, &box)) - buffer[i] = fetch(bits + (y + pict->pDrawable->y)*stride, x + pict->pDrawable->x, indexed); + if (POINT_IN_REGION (0, pict->pCompositeClip, x + dx, y + dy, &box)) + buffer[i] = fetch(bits + (y + dy)*stride, x + dx, indexed); else buffer[i] = 0; } @@ -3019,13 +3026,13 @@ static void fbFetchTransformed(PicturePt y1 = MOD (y1, pict->pDrawable->height); y2 = MOD (y2, pict->pDrawable->height); - b = bits + (y1 + pict->pDrawable->y)*stride; + b = bits + (y1 + dy)*stride; - tl = fetch(b, x1 + pict->pDrawable->x, indexed); - tr = fetch(b, x2 + pict->pDrawable->x, indexed); - b = bits + (y2 + pict->pDrawable->y)*stride; - bl = fetch(b, x1 + pict->pDrawable->x, indexed); - br = fetch(b, x2 + pict->pDrawable->x, indexed); + tl = fetch(b, x1 + dx, indexed); + tr = fetch(b, x2 + dx, indexed); + b = bits + (y2 + dy)*stride; + bl = fetch(b, x1 + dx, indexed); + br = fetch(b, x2 + dx, indexed); ft = FbGet8(tl,0) * idistx + FbGet8(tr,0) * distx; fb = FbGet8(bl,0) * idistx + FbGet8(br,0) * distx; @@ -3080,17 +3087,17 @@ static void fbFetchTransformed(PicturePt y1 = MOD (y1, pict->pDrawable->height); y2 = MOD (y2, pict->pDrawable->height); - b = bits + (y1 + pict->pDrawable->y)*stride; + b = bits + (y1 + dy)*stride; - tl = POINT_IN_REGION(0, pict->pCompositeClip, x1, y1, &box) - ? fetch(b, x1 + pict->pDrawable->x, indexed) : 0; - tr = POINT_IN_REGION(0, pict->pCompositeClip, x2, y1, &box) - ? fetch(b, x2 + pict->pDrawable->x, indexed) : 0; - b = bits + (y2 + pict->pDrawable->y)*stride; - bl = POINT_IN_REGION(0, pict->pCompositeClip, x1, y2, &box) - ? fetch(b, x1 + pict->pDrawable->x, indexed) : 0; - br = POINT_IN_REGION(0, pict->pCompositeClip, x2, y2, &box) - ? fetch(b, x2 + pict->pDrawable->x, indexed) : 0; + tl = POINT_IN_REGION(0, pict->pCompositeClip, x1 + dx, y1 + dy, &box) + ? fetch(b, x1 + dx, indexed) : 0; + tr = POINT_IN_REGION(0, pict->pCompositeClip, x2 + dx, y1 + dy, &box) + ? fetch(b, x2 + dx, indexed) : 0; + b = bits + (y2 + dy)*stride; + bl = POINT_IN_REGION(0, pict->pCompositeClip, x1 + dx, y2 + dy, &box) + ? fetch(b, x1 + dx, indexed) : 0; + br = POINT_IN_REGION(0, pict->pCompositeClip, x2 + dx, y2 + dy, &box) + ? fetch(b, x2 + dx, indexed) : 0; ft = FbGet8(tl,0) * idistx + FbGet8(tr,0) * distx; fb = FbGet8(bl,0) * idistx + FbGet8(br,0) * distx; @@ -3114,6 +3121,10 @@ static void fbFetchTransformed(PicturePt } else { if (REGION_NUM_RECTS(pict->pCompositeClip) == 1) { box = pict->pCompositeClip->extents; + box.x1 -= dx; + box.x2 -= dx; + box.y1 -= dy; + box.y2 -= dy; for (i = 0; i < width; ++i) { if (!v.vector[2]) { buffer[i] = 0; @@ -3144,8 +3155,8 @@ static void fbFetchTransformed(PicturePt idistx = 256 - distx; idisty = 256 - disty; - b = bits + (y1 + pict->pDrawable->y)*stride; - x_off = x1 + pict->pDrawable->x; + b = bits + (y1 + dy)*stride; + x_off = x1 + dx; x1_out = (x1 < box.x1) | (x1 >= box.x2); x2_out = (x2 < box.x1) | (x2 >= box.x2); @@ -3206,17 +3217,17 @@ static void fbFetchTransformed(PicturePt idistx = 256 - distx; idisty = 256 - disty; - b = bits + (y1 + pict->pDrawable->y)*stride; - x_off = x1 + pict->pDrawable->x; + b = bits + (y1 + dy)*stride; + x_off = x1 + dx; - tl = POINT_IN_REGION(0, pict->pCompositeClip, x1, y1, &box) + tl = POINT_IN_REGION(0, pict->pCompositeClip, x1 + dx, y1 + dy, &box) ? fetch(b, x_off, indexed) : 0; - tr = POINT_IN_REGION(0, pict->pCompositeClip, x2, y1, &box) + tr = POINT_IN_REGION(0, pict->pCompositeClip, x2 + dx, y1 + dy, &box) ? fetch(b, x_off + 1, indexed) : 0; b += stride; - bl = POINT_IN_REGION(0, pict->pCompositeClip, x1, y2, &box) + bl = POINT_IN_REGION(0, pict->pCompositeClip, x1 + dx, y2 + dy, &box) ? fetch(b, x_off, indexed) : 0; - br = POINT_IN_REGION(0, pict->pCompositeClip, x2, y2, &box) + br = POINT_IN_REGION(0, pict->pCompositeClip, x2 + dx, y2 + dy, &box) ? fetch(b, x_off + 1, indexed) : 0; ft = FbGet8(tl,0) * idistx + FbGet8(tr,0) * distx; @@ -3274,9 +3285,9 @@ static void fbFetchTransformed(PicturePt for (x = x1; x < x2; x++) { if (*p) { int tx = (pict->repeatType == RepeatNormal) ? MOD (x, pict->pDrawable->width) : x; - if (POINT_IN_REGION (0, pict->pCompositeClip, tx, ty, &box)) { - FbBits *b = bits + (ty + pict->pDrawable->y)*stride; - CARD32 c = fetch(b, tx + pict->pDrawable->x, indexed); + if (POINT_IN_REGION (0, pict->pCompositeClip, tx + dx, ty + dy, &box)) { + FbBits *b = bits + (ty + dy)*stride; + CARD32 c = fetch(b, tx + dx, indexed); srtot += Red(c) * *p; sgtot += Green(c) * *p;