xserver/fb fbcompose.c,1.28,1.29 fbpict.h,1.22,1.23

Lars Knoll <xserver-commit-u7BhqnqprCWvj1b/[email protected]> Mon, 4 Jul 2005 05:18:53 -0700 (PDT)
Newsgroups gmane.comp.freedesktop.xserver.cvs
Message-ID <[email protected]>
Committed by: lars

Update of /cvs/xserver/xserver/fb
In directory gabe:/tmp/cvs-serv9995/fb

Modified Files:
	fbcompose.c fbpict.h 
Log Message:
Fix handling of "super luminescent" colors
Fix off by one error in the transformation handling.


Index: fbcompose.c
===================================================================
RCS file: /cvs/xserver/xserver/fb/fbcompose.c,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -d -r1.28 -r1.29
--- fbcompose.c	29 Jun 2005 15:14:17 -0000	1.28
+++ fbcompose.c	4 Jul 2005 12:18:51 -0000	1.29
@@ -1467,8 +1467,8 @@
         CARD32 d = dest[i];
         CARD32 ia = Alpha(~s);
 
-        FbByteMul(d, ia);
-        dest[i] = s + d;
+        FbByteMulAdd(d, ia, s);
+        dest[i] = d;
     }
 }
 
@@ -1478,9 +1478,10 @@
     int i;
     for (i = 0; i < width; ++i) {
         CARD32 s = src[i];
+        CARD32 d = dest[i];
         CARD32 ia = Alpha(~dest[i]);
-        FbByteMul(s, ia);
-        dest[i] += s;
+        FbByteMulAdd(s, ia, d);
+        dest[i] = s;
     }
 }
 
@@ -1739,8 +1740,8 @@
             {
                 CARD32 d = dest[i];
                 a = fbCombineDisjointOutPart (d >> 24, a);
-                FbByteMul(d, a);
-                s += d;
+                FbByteMulAdd(d, a, s);
+                s = d;
             }
             dest[i] = s;
         }
@@ -2085,8 +2086,8 @@
             if (a)
             {
                 CARD32 d = dest[i];
-                FbByteMulC(d, a);
-                s += d;
+                FbByteMulAddC(d, a, s);
+                s = d;
             }
             dest[i] = s;
         }
@@ -2107,8 +2108,7 @@
             CARD32 s = src[i];
             if (a != 0xff)
             {
-                FbByteMul(s, a);
-                d += s;
+                FbByteMulAdd(s, a, d);
             }
             dest[i] = s;
         }
@@ -2890,65 +2890,65 @@
             if (REGION_NUM_RECTS(pict->pCompositeClip) == 1) {
                 box = pict->pCompositeClip->extents;
                 for (i = 0; i < width; ++i) {
-                    v.vector[0] += unit.vector[0];
-                    v.vector[1] += unit.vector[1];
-                    v.vector[2] += unit.vector[2];
                     if (!v.vector[2]) {
                         buffer[i] = 0;
-                        continue;
+                    } else {
+                        y = MOD((v.vector[1]/v.vector[2]), pict->pDrawable->height);
+                        x = MOD((v.vector[0]/v.vector[2]), pict->pDrawable->width);
+                        buffer[i] = fetch(bits + (y + pict->pDrawable->y)*stride, x + pict->pDrawable->x, indexed);
                     }
-                    y = MOD((v.vector[1]/v.vector[2]), pict->pDrawable->height);
-                    x = MOD((v.vector[0]/v.vector[2]), pict->pDrawable->width);
-                    buffer[i] = fetch(bits + (y + pict->pDrawable->y)*stride, x + pict->pDrawable->x, indexed);
-                }
-            } else {
-                for (i = 0; i < width; ++i) {
                     v.vector[0] += unit.vector[0];
                     v.vector[1] += unit.vector[1];
                     v.vector[2] += unit.vector[2];
+                }
+            } else {
+                for (i = 0; i < width; ++i) {
                     if (!v.vector[2]) {
                         buffer[i] = 0;
-                        continue;
+                    } else {
+                        y = MOD((v.vector[1]/v.vector[2]), pict->pDrawable->height);
+                        x = MOD((v.vector[0]/v.vector[2]), 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);
+                        else
+                            buffer[i] = 0;
                     }
-                    y = MOD((v.vector[1]/v.vector[2]), pict->pDrawable->height);
-                    x = MOD((v.vector[0]/v.vector[2]), 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);
-                    else
-                        buffer[i] = 0;
+                    v.vector[0] += unit.vector[0];
+                    v.vector[1] += unit.vector[1];
+                    v.vector[2] += unit.vector[2];
                 }
             }
         } else {
             if (REGION_NUM_RECTS(pict->pCompositeClip) == 1) {
                 box = pict->pCompositeClip->extents;
                 for (i = 0; i < width; ++i) {
-                    v.vector[0] += unit.vector[0];
-                    v.vector[1] += unit.vector[1];
-                    v.vector[2] += unit.vector[2];
                     if (!v.vector[2]) {
                         buffer[i] = 0;
-                        continue;
+                    } else {
+                        y = (v.vector[1]/v.vector[2]);
+                        x = (v.vector[0]/v.vector[2]);
+                        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);
                     }
-                    y = (v.vector[1]/v.vector[2]);
-                    x = (v.vector[0]/v.vector[2]);
-                    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);
-                }
-            } else {
-                for (i = 0; i < width; ++i) {
                     v.vector[0] += unit.vector[0];
                     v.vector[1] += unit.vector[1];
                     v.vector[2] += unit.vector[2];
+                }
+            } else {
+                for (i = 0; i < width; ++i) {
                     if (!v.vector[2]) {
                         buffer[i] = 0;
-                        continue;
+                    } else {
+                        y = (v.vector[1]/v.vector[2]);
+                        x = (v.vector[0]/v.vector[2]);
+                        if (POINT_IN_REGION (0, pict->pCompositeClip, x, y, &box))
+                            buffer[i] = fetch(bits + (y + pict->pDrawable->y)*stride, x + pict->pDrawable->x, indexed);
+                        else
+                            buffer[i] = 0;
                     }
-                    y = (v.vector[1]/v.vector[2]);
-                    x = (v.vector[0]/v.vector[2]);
-                    if (POINT_IN_REGION (0, pict->pCompositeClip, x, y, &box))
-                        buffer[i] = fetch(bits + (y + pict->pDrawable->y)*stride, x + pict->pDrawable->x, indexed);
-                    else
-                        buffer[i] = 0;
+                    v.vector[0] += unit.vector[0];
+                    v.vector[1] += unit.vector[1];
+                    v.vector[2] += unit.vector[2];
                 }
             }
         }
@@ -2957,192 +2957,188 @@
             if (REGION_NUM_RECTS(pict->pCompositeClip) == 1) {
                 box = pict->pCompositeClip->extents;
                 for (i = 0; i < width; ++i) {
-                    int x1, x2, y1, y2, distx, idistx, disty, idisty;
-                    FbBits *b;
-                    CARD32 tl, tr, bl, br;
-                    xFixed_48_16 div;
-
-                    v.vector[0] += unit.vector[0];
-                    v.vector[1] += unit.vector[1];
-                    v.vector[2] += unit.vector[2];
-
                     if (!v.vector[2]) {
                         buffer[i] = 0;
-                        continue;
-                    }
-                    div = ((xFixed_48_16)v.vector[0] << 16)/v.vector[2];
-                    x1 = div >> 16;
-                    distx = ((xFixed)div >> 8) & 0xff;
-                    x2 = x1 + 1;
-                    div = ((xFixed_48_16)v.vector[1] << 16)/v.vector[2];
-                    y1 = div >> 16;
-                    y2 = y1 + 1;
-                    disty = ((xFixed)div >> 8) & 0xff;
+                    } else {
+                        int x1, x2, y1, y2, distx, idistx, disty, idisty;
+                        FbBits *b;
+                        CARD32 tl, tr, bl, br;
+                        xFixed_48_16 div;
 
-                    idistx = 256 - distx;
-                    idisty = 256 - disty;
+                        div = ((xFixed_48_16)v.vector[0] << 16)/v.vector[2];
+                        x1 = div >> 16;
+                        distx = ((xFixed)div >> 8) & 0xff;
+                        x2 = x1 + 1;
+                        div = ((xFixed_48_16)v.vector[1] << 16)/v.vector[2];
+                        y1 = div >> 16;
+                        y2 = y1 + 1;
+                        disty = ((xFixed)div >> 8) & 0xff;
 
-                    x1 = MOD (x1, pict->pDrawable->width);
-                    x2 = MOD (x2, pict->pDrawable->width);
-                    y1 = MOD (y1, pict->pDrawable->height);
-                    y2 = MOD (y2, pict->pDrawable->height);
+                        idistx = 256 - distx;
+                        idisty = 256 - disty;
 
-                    b = bits + (y1 + pict->pDrawable->y)*stride;
+                        x1 = MOD (x1, pict->pDrawable->width);
+                        x2 = MOD (x2, pict->pDrawable->width);
+                        y1 = MOD (y1, pict->pDrawable->height);
+                        y2 = MOD (y2, pict->pDrawable->height);
 
-                    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);
+                        b = bits + (y1 + pict->pDrawable->y)*stride;
 
-                    FbByteAddMul_256(tl, idistx, tr, distx);
-                    FbByteAddMul_256(bl, idistx, br, distx);
-                    FbByteAddMul_256(tl, idisty, bl, disty);
-                    buffer[i] = tl;
-                }
-            } else {
-                for (i = 0; i < width; ++i) {
-                    int x1, x2, y1, y2, distx, idistx, disty, idisty;
-                    FbBits *b;
-                    CARD32 tl, tr, bl, br;
-                    xFixed_48_16 div;
+                        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);
 
+                        FbByteAddMul_256(tl, idistx, tr, distx);
+                        FbByteAddMul_256(bl, idistx, br, distx);
+                        FbByteAddMul_256(tl, idisty, bl, disty);
+                        buffer[i] = tl;
+                    }
                     v.vector[0] += unit.vector[0];
                     v.vector[1] += unit.vector[1];
                     v.vector[2] += unit.vector[2];
+                }
+            } else {
+                for (i = 0; i < width; ++i) {
                     if (!v.vector[2]) {
                         buffer[i] = 0;
-                        continue;
-                    }
+                    } else {
+                        int x1, x2, y1, y2, distx, idistx, disty, idisty;
+                        FbBits *b;
+                        CARD32 tl, tr, bl, br;
+                        xFixed_48_16 div;
 
-                    div = ((xFixed_48_16)v.vector[0] << 16)/v.vector[2];
-                    x1 = div >> 16;
-                    distx = ((xFixed)div >> 8) & 0xff;
-                    x2 = x1 + 1;
-                    div = ((xFixed_48_16)v.vector[1] << 16)/v.vector[2];
-                    y1 = div >> 16;
-                    y2 = y1 + 1;
-                    disty = ((xFixed)div >> 8) & 0xff;
+                        div = ((xFixed_48_16)v.vector[0] << 16)/v.vector[2];
+                        x1 = div >> 16;
+                        distx = ((xFixed)div >> 8) & 0xff;
+                        x2 = x1 + 1;
+                        div = ((xFixed_48_16)v.vector[1] << 16)/v.vector[2];
+                        y1 = div >> 16;
+                        y2 = y1 + 1;
+                        disty = ((xFixed)div >> 8) & 0xff;
 
-                    idistx = 256 - distx;
-                    idisty = 256 - disty;
+                        idistx = 256 - distx;
+                        idisty = 256 - disty;
 
-                    x1 = MOD (x1, pict->pDrawable->width);
-                    x2 = MOD (x2, pict->pDrawable->width);
-                    y1 = MOD (y1, pict->pDrawable->height);
-                    y2 = MOD (y2, pict->pDrawable->height);
+                        x1 = MOD (x1, pict->pDrawable->width);
+                        x2 = MOD (x2, pict->pDrawable->width);
+                        y1 = MOD (y1, pict->pDrawable->height);
+                        y2 = MOD (y2, pict->pDrawable->height);
 
-                    b = bits + (y1 + pict->pDrawable->y)*stride;
+                        b = bits + (y1 + pict->pDrawable->y)*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, 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;
 
-                    FbByteAddMul_256(tl, idistx, tr, distx);
-                    FbByteAddMul_256(bl, idistx, br, distx);
-                    FbByteAddMul_256(tl, idisty, bl, disty);
-                    buffer[i] = tl;
+                        FbByteAddMul_256(tl, idistx, tr, distx);
+                        FbByteAddMul_256(bl, idistx, br, distx);
+                        FbByteAddMul_256(tl, idisty, bl, disty);
+                        buffer[i] = tl;
+                    }
+                    v.vector[0] += unit.vector[0];
+                    v.vector[1] += unit.vector[1];
+                    v.vector[2] += unit.vector[2];
                 }
             }
         } else {
             if (REGION_NUM_RECTS(pict->pCompositeClip) == 1) {
                 box = pict->pCompositeClip->extents;
                 for (i = 0; i < width; ++i) {
-                    int x1, x2, y1, y2, distx, idistx, disty, idisty, x_off;
-                    FbBits *b;
-                    CARD32 tl, tr, bl, br;
-                    Bool x1_out, x2_out, y1_out, y2_out;
-                    xFixed_48_16 div;
-
-                    v.vector[0] += unit.vector[0];
-                    v.vector[1] += unit.vector[1];
-                    v.vector[2] += unit.vector[2];
                     if (!v.vector[2]) {
                         buffer[i] = 0;
-                        continue;
-                    }
-
-                    div = ((xFixed_48_16)v.vector[0] << 16)/v.vector[2];
-                    x1 = div >> 16;
-                    distx = ((xFixed)div >> 8) & 0xff;
-                    x2 = x1 + 1;
-                    div = ((xFixed_48_16)v.vector[1] << 16)/v.vector[2];
-                    y1 = div >> 16;
-                    y2 = y1 + 1;
-                    disty = ((xFixed)div >> 8) & 0xff;
+                    } else {
+                        int x1, x2, y1, y2, distx, idistx, disty, idisty, x_off;
+                        FbBits *b;
+                        CARD32 tl, tr, bl, br;
+                        Bool x1_out, x2_out, y1_out, y2_out;
+                        xFixed_48_16 div;
 
-                    idistx = 256 - distx;
-                    idisty = 256 - disty;
+                        div = ((xFixed_48_16)v.vector[0] << 16)/v.vector[2];
+                        x1 = div >> 16;
+                        distx = ((xFixed)div >> 8) & 0xff;
+                        x2 = x1 + 1;
+                        div = ((xFixed_48_16)v.vector[1] << 16)/v.vector[2];
+                        y1 = div >> 16;
+                        y2 = y1 + 1;
+                        disty = ((xFixed)div >> 8) & 0xff;
 
-                    b = bits + (y1 + pict->pDrawable->y)*stride;
-                    x_off = x1 + pict->pDrawable->x;
+                        idistx = 256 - distx;
+                        idisty = 256 - disty;
 
-                    x1_out = (x1 < box.x1) | (x1 >= box.x2);
-                    x2_out = (x2 < box.x1) | (x2 >= box.x2);
-                    y1_out = (y1 < box.y1) | (y1 >= box.y2);
-                    y2_out = (y2 < box.y1) | (y2 >= box.y2);
+                        b = bits + (y1 + pict->pDrawable->y)*stride;
+                        x_off = x1 + pict->pDrawable->x;
 
-                    tl = x1_out|y1_out ? 0 : fetch(b, x_off, indexed);
-                    tr = x2_out|y1_out ? 0 : fetch(b, x_off + 1, indexed);
-                    b += stride;
-                    bl = x1_out|y2_out ? 0 : fetch(b, x_off, indexed);
-                    br = x2_out|y2_out ? 0 : fetch(b, x_off + 1, indexed);
+                        x1_out = (x1 < box.x1) | (x1 >= box.x2);
+                        x2_out = (x2 < box.x1) | (x2 >= box.x2);
+                        y1_out = (y1 < box.y1) | (y1 >= box.y2);
+                        y2_out = (y2 < box.y1) | (y2 >= box.y2);
 
-                    FbByteAddMul_256(tl, idistx, tr, distx);
-                    FbByteAddMul_256(bl, idistx, br, distx);
-                    FbByteAddMul_256(tl, idisty, bl, disty);
-                    buffer[i] = tl;
-                }
-            } else {
-                for (i = 0; i < width; ++i) {
-                    int x1, x2, y1, y2, distx, idistx, disty, idisty, x_off;
-                    FbBits *b;
-                    CARD32 tl, tr, bl, br;
-                    xFixed_48_16 div;
+                        tl = x1_out|y1_out ? 0 : fetch(b, x_off, indexed);
+                        tr = x2_out|y1_out ? 0 : fetch(b, x_off + 1, indexed);
+                        b += stride;
+                        bl = x1_out|y2_out ? 0 : fetch(b, x_off, indexed);
+                        br = x2_out|y2_out ? 0 : fetch(b, x_off + 1, indexed);
 
+                        FbByteAddMul_256(tl, idistx, tr, distx);
+                        FbByteAddMul_256(bl, idistx, br, distx);
+                        FbByteAddMul_256(tl, idisty, bl, disty);
+                        buffer[i] = tl;
+                    }
                     v.vector[0] += unit.vector[0];
                     v.vector[1] += unit.vector[1];
                     v.vector[2] += unit.vector[2];
+                }
+            } else {
+                for (i = 0; i < width; ++i) {
                     if (!v.vector[2]) {
                         buffer[i] = 0;
-                        continue;
-                    }
+                    } else {
+                        int x1, x2, y1, y2, distx, idistx, disty, idisty, x_off;
+                        FbBits *b;
+                        CARD32 tl, tr, bl, br;
+                        xFixed_48_16 div;
 
-                    div = ((xFixed_48_16)v.vector[0] << 16)/v.vector[2];
-                    x1 = div >> 16;
-                    distx = ((xFixed)div >> 8) & 0xff;
-                    x2 = x1 + 1;
-                    div = ((xFixed_48_16)v.vector[1] << 16)/v.vector[2];
-                    y1 = div >> 16;
-                    y2 = y1 + 1;
-                    disty = ((xFixed)div >> 8) & 0xff;
+                        div = ((xFixed_48_16)v.vector[0] << 16)/v.vector[2];
+                        x1 = div >> 16;
+                        distx = ((xFixed)div >> 8) & 0xff;
+                        x2 = x1 + 1;
+                        div = ((xFixed_48_16)v.vector[1] << 16)/v.vector[2];
+                        y1 = div >> 16;
+                        y2 = y1 + 1;
+                        disty = ((xFixed)div >> 8) & 0xff;
 
-                    idistx = 256 - distx;
-                    idisty = 256 - disty;
+                        idistx = 256 - distx;
+                        idisty = 256 - disty;
 
-                    b = bits + (y1 + pict->pDrawable->y)*stride;
-                    x_off = x1 + pict->pDrawable->x;
+                        b = bits + (y1 + pict->pDrawable->y)*stride;
+                        x_off = x1 + pict->pDrawable->x;
 
-                    tl = POINT_IN_REGION(0, pict->pCompositeClip, x1, y1, &box)
-                         ? fetch(b, x_off, indexed) : 0;
-                    tr = POINT_IN_REGION(0, pict->pCompositeClip, x2, y1, &box)
-                         ? fetch(b, x_off + 1, indexed) : 0;
-                    b += stride;
-                    bl = POINT_IN_REGION(0, pict->pCompositeClip, x1, y2, &box)
-                         ? fetch(b, x_off, indexed) : 0;
-                    br = POINT_IN_REGION(0, pict->pCompositeClip, x2, y2, &box)
-                         ? fetch(b, x_off + 1, indexed) : 0;
+                        tl = POINT_IN_REGION(0, pict->pCompositeClip, x1, y1, &box)
+                             ? fetch(b, x_off, indexed) : 0;
+                        tr = POINT_IN_REGION(0, pict->pCompositeClip, x2, y1, &box)
+                             ? fetch(b, x_off + 1, indexed) : 0;
+                        b += stride;
+                        bl = POINT_IN_REGION(0, pict->pCompositeClip, x1, y2, &box)
+                             ? fetch(b, x_off, indexed) : 0;
+                        br = POINT_IN_REGION(0, pict->pCompositeClip, x2, y2, &box)
+                             ? fetch(b, x_off + 1, indexed) : 0;
 
-                    FbByteAddMul_256(tl, idistx, tr, distx);
-                    FbByteAddMul_256(bl, idistx, br, distx);
-                    FbByteAddMul_256(tl, idisty, bl, disty);
-                    buffer[i] = tl;
+                        FbByteAddMul_256(tl, idistx, tr, distx);
+                        FbByteAddMul_256(bl, idistx, br, distx);
+                        FbByteAddMul_256(tl, idisty, bl, disty);
+                        buffer[i] = tl;
+                    }
+                    v.vector[0] += unit.vector[0];
+                    v.vector[1] += unit.vector[1];
+                    v.vector[2] += unit.vector[2];
                 }
             }
         }
@@ -3154,56 +3150,54 @@
         int yoff = params[1] >> 1;
         params += 2;
         for (i = 0; i < width; ++i) {
-            int x1, x2, y1, y2, x, y;
-            INT32 srtot, sgtot, sbtot, satot;
-            xFixed *p = params;
-            xFixed_48_16 tmp;
-
-            v.vector[0] += unit.vector[0];
-            v.vector[1] += unit.vector[1];
-            v.vector[2] += unit.vector[2];
             if (!v.vector[2]) {
                 buffer[i] = 0;
-                continue;
-            }
-
-            tmp = ((xFixed_48_16)v.vector[0] << 16)/v.vector[2] - xoff;
-            x1 = xFixedToInt(tmp);
-            x2 = x1 + cwidth;
-            tmp = ((xFixed_48_16)v.vector[1] << 16)/v.vector[2] - yoff;
-            y1 = xFixedToInt(tmp);
-            y2 = y1 + cheight;
+            } else {
+                int x1, x2, y1, y2, x, y;
+                INT32 srtot, sgtot, sbtot, satot;
+                xFixed *p = params;
+                xFixed_48_16 tmp;
+                tmp = ((xFixed_48_16)v.vector[0] << 16)/v.vector[2] - xoff;
+                x1 = xFixedToInt(tmp);
+                x2 = x1 + cwidth;
+                tmp = ((xFixed_48_16)v.vector[1] << 16)/v.vector[2] - yoff;
+                y1 = xFixedToInt(tmp);
+                y2 = y1 + cheight;
 
-            srtot = sgtot = sbtot = satot = 0;
+                srtot = sgtot = sbtot = satot = 0;
 
-            for (y = y1; y < y2; y++) {
-                int ty = (pict->repeat == RepeatNormal) ? MOD (y, pict->pDrawable->height) : y;
-                for (x = x1; x < x2; x++) {
-                    if (*p) {
-                        int tx = (pict->repeat == 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);
+                for (y = y1; y < y2; y++) {
+                    int ty = (pict->repeat == RepeatNormal) ? MOD (y, pict->pDrawable->height) : y;
+                    for (x = x1; x < x2; x++) {
+                        if (*p) {
+                            int tx = (pict->repeat == 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);
 
-                            srtot += Red(c) * *p;
-                            sgtot += Green(c) * *p;
-                            sbtot += Blue(c) * *p;
-                            satot += Alpha(c) * *p;
+                                srtot += Red(c) * *p;
+                                sgtot += Green(c) * *p;
+                                sbtot += Blue(c) * *p;
+                                satot += Alpha(c) * *p;
+                            }
                         }
+                        p++;
                     }
-                    p++;
                 }
-            }
 
-            if (satot < 0) satot = 0; else if (satot > 0xff) satot = 0xff;
-            if (srtot < 0) srtot = 0; else if (srtot > satot) srtot = satot;
-            if (sgtot < 0) sgtot = 0; else if (sgtot > satot) sgtot = satot;
-            if (sbtot < 0) sbtot = 0; else if (sbtot > satot) sbtot = satot;
+                if (satot < 0) satot = 0; else if (satot > 0xff) satot = 0xff;
+                if (srtot < 0) srtot = 0; else if (srtot > satot) srtot = satot;
+                if (sgtot < 0) sgtot = 0; else if (sgtot > satot) sgtot = satot;
+                if (sbtot < 0) sbtot = 0; else if (sbtot > satot) sbtot = satot;
 
-            buffer[i] = ((satot << 24) |
-                         (srtot << 16) |
-                         (sgtot <<  8) |
-                         (sbtot       ));
+                buffer[i] = ((satot << 24) |
+                             (srtot << 16) |
+                             (sgtot <<  8) |
+                             (sbtot       ));
+            }
+            v.vector[0] += unit.vector[0];
+            v.vector[1] += unit.vector[1];
+            v.vector[2] += unit.vector[2];
         }
     }
 }
@@ -3375,10 +3369,9 @@
             }
             fetchSrc = 0;
             fetchMask = 0;
-    }
+        }
 
-        for (i = 0; i < data->height; ++i)
-	    {
+        for (i = 0; i < data->height; ++i) {
             /* fill first half of scanline with source */
             if (fetchSrc) {
                 fetchSrc(data->src, data->xSrc, data->ySrc + i, data->width, src_buffer);
@@ -3388,7 +3381,7 @@
                     fetchMask(data->mask, data->xMask, data->yMask + i, data->width, dest_buffer);
                     fbCombineMaskU(src_buffer, dest_buffer, data->width);
                 }
-		}
+            }
 
             /* fill dest into second half of scanline */
             if (fetchDest)
@@ -3399,7 +3392,7 @@
 
             /* write back */
             store(data->dest, data->xDest, data->yDest + i, data->width, dest_buffer);
-	    }
+        }
     }
 }
 

Index: fbpict.h
===================================================================
RCS file: /cvs/xserver/xserver/fb/fbpict.h,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- fbpict.h	27 May 2005 14:15:13 -0000	1.22
+++ fbpict.h	4 Jul 2005 12:18:51 -0000	1.23
@@ -147,7 +147,7 @@
   x_c = (x_c * a) / 255
 */
 #define FbByteMul(x, a) do {                                      \
-        CARD32 t = (x & 0xff00ff) *a;                           \
+        CARD32 t = (x & 0xff00ff) *a;                             \
         t = (t + ((t >> 8) & 0xff00ff) + 0x800080) >> 8;          \
         t &= 0xff00ff;                                            \
                                                                   \
@@ -158,17 +158,55 @@
     } while (0)
 
 /*
+  x_c = (x_c * a) / 255 + y
+*/
+#define FbByteMulAdd(x, a, y) do {                                \
+        CARD32 t = (x & 0xff00ff) * a;                            \
+        t = (t + ((t >> 8) & 0xff00ff) + 0x800080) >> 8;          \
+        t &= 0xff00ff;                                            \
+        t += y & 0xff00ff;                                        \
+        t |= 0x1000100 - ((t >> 8) & 0xff00ff);                   \
+        t &= 0xff00ff;                                            \
+                                                                  \
+        x = ((x >> 8) & 0xff00ff) * a;                              \
+        x = (x + ((x >> 8) & 0xff00ff) + 0x800080) >> 8;            \
+        x &= 0xff00ff;                                              \
+        x += (y >> 8) & 0xff00ff;                                   \
+        x |= 0x1000100 - ((t >> 8) & 0xff00ff);                     \
+        x &= 0xff00ff;                                              \
+        x <<= 8;                                                    \
+        x += t;                                                     \
+    } while (0)
+
+/*
   x_c = (x_c * a + y_c * b) / 255
 */
 #define FbByteAddMul(x, a, y, b) do {                                   \
-        CARD32 t = (x & 0xff00ff) * a + (y & 0xff00ff) * b;             \
-        t = (t + ((t >> 8) & 0xff00ff) + 0x800080) >> 8;                \
+        CARD32 t;                                                       \
+        CARD32 r = (x >> 24) * a + (y >> 24) * b;                       \
+        r += (r >> 8) + 0x80;                                           \
+        r >>= 8;                                                        \
+                                                                        \
+        t = (x & 0xff00) * a + (y & 0xff00) * b;                        \
+        t += (t >> 8) + 0x8000;                                         \
+        t >>= 16;                                                       \
+                                                                        \
+        t |= r << 16;                                                   \
+        t |= 0x1000100 - ((t >> 8) & 0xff00ff);                         \
         t &= 0xff00ff;                                                  \
+        t <<= 8;                                                        \
                                                                         \
-        x = ((x >> 8) & 0xff00ff) * a + ((y >> 8) & 0xff00ff) * b;      \
-        x = (x + ((x >> 8) & 0xff00ff) + 0x800080);                     \
-        x &= 0xff00ff00;                                                \
-        x += t;                                                         \
+        r = ((x >> 16) & 0xff) * a + ((y >> 16) & 0xff) * b;            \
+        r += (r >> 8) + 0x80;                                           \
+        r >>= 8;                                                        \
+                                                                        \
+        x = (x & 0xff) * a + (y & 0xff) * b;                            \
+        x += (x >> 8) + 0x80;                                           \
+        x >>= 8;                                                        \
+        x |= r << 16;                                                   \
+        x |= 0x1000100 - ((x >> 8) & 0xff00ff);                         \
+        x &= 0xff00ff;                                                  \
+        x |= t;                                                         \
 } while (0)
 
 /*
@@ -186,56 +224,91 @@
 /*
   x_c = (x_c * a_c) / 255
 */
-#define FbByteMulC(x, a) do {                           \
-        CARD32 t;                                       \
-        CARD32 r = (x & 0xff) * (a & 0xff);             \
-        r |= (x & 0xff0000) * ((a >> 16) & 0xff);       \
+#define FbByteMulC(x, a) do {                                   \
+        CARD32 t;                                               \
+        CARD32 r = (x & 0xff) * (a & 0xff);                     \
+        r |= (x & 0xff0000) * ((a >> 16) & 0xff);               \
         r = (r + ((r >> 8) & 0xff00ff) + 0x800080) >> 8;        \
-        r &= 0xff00ff;                                  \
-                                                        \
-        x >>= 8;                                        \
-        t = (x & 0xff) * ((a >> 8) & 0xff);             \
-        t |= (x & 0xff0000) * (a >> 24);                \
-        t = (t + ((t >> 8) & 0xff00ff) + 0x800080);     \
-        x = r | (t & 0xff00ff00);                       \
-                                                        \
+        r &= 0xff00ff;                                          \
+                                                                \
+        x >>= 8;                                                \
+        t = (x & 0xff) * ((a >> 8) & 0xff);                     \
+        t |= (x & 0xff0000) * (a >> 24);                        \
+        t = (t + ((t >> 8) & 0xff00ff) + 0x800080);             \
+        x = r | (t & 0xff00ff00);                               \
+                                                                \
     } while (0)
 
 /*
-  x_c = (x_c * a_c + y_c * b) / 255
+  x_c = (x_c * a) / 255 + y
 */
-#define FbByteAddMulC(x, a, y, b) do {                     \
-        CARD32 t;                                       \
-        CARD32 r = (x & 0xff) * (a & 0xff);             \
-        r |= (x & 0xff0000) * ((a >> 16) & 0xff);       \
-        r += (y & 0xff00ff) * b;                        \
-        r = (r + ((r >> 8) & 0xff00ff) + 0x800080) >> 8;        \
-        r &= 0xff00ff;                                  \
-                                                        \
-        x >>= 8;                                        \
-        t = (x & 0xff) * ((a >> 8) & 0xff);             \
-        t |= (x & 0xff0000) * (a >> 24);                \
-        t += ((y >> 8) & 0xff00ff) * b;                 \
-        t = (t + ((t >> 8) & 0xff00ff) + 0x800080);     \
-        x = r | (t & 0xff00ff00);                       \
-                                                        \
+#define FbByteMulAddC(x, a, y) do {                                \
+        CARD32 t;                                                  \
+        CARD32 r = (x & 0xff) * (a & 0xff);                        \
+        r |= (x & 0xff0000) * ((a >> 16) & 0xff);                  \
+        r = (r + ((r >> 8) & 0xff00ff) + 0x800080) >> 8;           \
+        r &= 0xff00ff;                                             \
+        r += y & 0xff00ff;                                         \
+        r |= 0x1000100 - ((r >> 8) & 0xff00ff);                    \
+        r &= 0xff00ff;                                             \
+                                                                   \
+        x >>= 8;                                                   \
+        t = (x & 0xff) * ((a >> 8) & 0xff);                        \
+        t |= (x & 0xff0000) * (a >> 24);                              \
+        t = (t + ((t >> 8) & 0xff00ff) + 0x800080) >> 8;              \
+        t &= 0xff00ff;                                                \
+        t += (y >> 8) & 0xff00ff;                                     \
+        t |= 0x1000100 - ((t >> 8) & 0xff00ff);                       \
+        t &= 0xff00ff;                                                \
+        x = r | (t << 8);                                             \
     } while (0)
 
 /*
-  x_c = min(x_c + y_c, 255)
+  x_c = (x_c * a_c + y_c * b) / 255
 */
-#define FbByteAdd(x, y) do {                                    \
-        CARD32 t;                                               \
-        CARD32 r = (x & 0xff00ff) + (y & 0xff00ff);             \
-        r |= 0 - ((r >> 8) & 0xff00ff);                         \
-        r &= 0xff00ff;                                          \
-                                                                \
-        t = ((x >> 8) & 0xff00ff) + ((y >> 8) & 0xff00ff);       \
-        t |= 0 - ((t >> 8) & 0xff00ff);                          \
-        r |= (t & 0xff00ff) << 8;                                \
-        x = r;                                                   \
+#define FbByteAddMulC(x, a, y, b) do {                                  \
+        CARD32 t;                                                       \
+        CARD32 r = (x >> 24) * (a >> 24) + (y >> 24) * b;               \
+        r += (r >> 8) + 0x80;                                           \
+        r >>= 8;                                                        \
+                                                                        \
+        t = (x & 0xff00) * ((a >> 8) & 0xff) + (y & 0xff00) * b;        \
+        t += (t >> 8) + 0x8000;                                         \
+        t >>= 16;                                                       \
+                                                                        \
+        t |= r << 16;                                                   \
+        t |= 0x1000100 - ((t >> 8) & 0xff00ff);                         \
+        t &= 0xff00ff;                                                  \
+        t <<= 8;                                                        \
+                                                                        \
+        r = ((x >> 16) & 0xff) * ((a >> 16) & 0xff) + ((y >> 16) & 0xff) * b; \
+        r += (r >> 8) + 0x80;                                           \
+        r >>= 8;                                                        \
+                                                                        \
+        x = (x & 0xff) * (a & 0xff) + (y & 0xff) * b;                   \
+        x += (x >> 8) + 0x80;                                           \
+        x >>= 8;                                                        \
+        x |= r << 16;                                                   \
+        x |= 0x1000100 - ((x >> 8) & 0xff00ff);                         \
+        x &= 0xff00ff;                                                  \
+        x |= t;                                                         \
 } while (0)
 
+/*
+  x_c = min(x_c + y_c, 255)
+*/
+#define FbByteAdd(x, y) do {                                            \
+        CARD32 t;                                                       \
+        CARD32 r = (x & 0xff00ff) + (y & 0xff00ff);                     \
+        r |= 0x1000100 - ((r >> 8) & 0xff00ff);                         \
+        r &= 0xff00ff;                                                  \
+                                                                        \
+        t = ((x >> 8) & 0xff00ff) + ((y >> 8) & 0xff00ff);              \
+        t |= 0x1000100 - ((t >> 8) & 0xff00ff);                         \
+        r |= (t & 0xff00ff) << 8;                                       \
+        x = r;                                                          \
+    } while (0)
+
 #define div_255(x) (((x) + ((x) >> 8) + 0x80) >> 8)
 
 #if defined(__i386__) && defined(__GNUC__)