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__)