Fix pixman bug 5777, patch by David Reveman

This commit is contained in:
Soren Sandmann Pedersen 2007-04-20 09:43:16 -04:00
parent 9c2e955f67
commit 3daa5c1a99

View File

@ -2064,114 +2064,116 @@ static CombineFuncU fbCombineFuncU[] = {
fbCombineConjointXorU, fbCombineConjointXorU,
}; };
static FASTCALL void static INLINE void
fbCombineMaskC (CARD32 *src, CARD32 *mask, int width) fbCombineMaskC (CARD32 *src, CARD32 *mask)
{ {
int i; CARD32 a = *mask;
for (i = 0; i < width; ++i) {
CARD32 a = READ(mask + i);
CARD32 x; CARD32 x;
CARD16 xa; CARD16 xa;
if (!a) if (!a)
{ {
WRITE(src + i, 0); WRITE(src, 0);
continue; return;
}
x = READ(src + i);
if (a == 0xffffffff)
{
x = x >> 24;
x |= x << 8;
x |= x << 16;
WRITE(mask + i, x);
continue;
}
xa = x >> 24;
FbByteMulC(x, a);
WRITE(src + i, x);
FbByteMul(a, xa);
WRITE(mask + i, a);
} }
x = READ(src);
if (a == 0xffffffff)
{
x = x >> 24;
x |= x << 8;
x |= x << 16;
WRITE(mask, x);
return;
}
xa = x >> 24;
FbByteMulC(x, a);
WRITE(src, x);
FbByteMul(a, xa);
WRITE(mask, a);
} }
static FASTCALL void static INLINE void
fbCombineMaskValueC (CARD32 *src, const CARD32 *mask, int width) fbCombineMaskValueC (CARD32 *src, const CARD32 *mask)
{ {
int i; CARD32 a = READ(mask);
for (i = 0; i < width; ++i) { CARD32 x;
CARD32 a = READ(mask + i);
CARD32 x;
if (!a) if (!a)
{ {
WRITE(src + i, 0); WRITE(src, 0);
continue; return;
}
if (a == 0xffffffff)
continue;
x = READ(src + i);
FbByteMulC(x, a);
WRITE(src + i, x);
} }
if (a == 0xffffffff)
return;
x = READ(src);
FbByteMulC(x, a);
WRITE(src,x);
} }
static INLINE void
static FASTCALL void fbCombineMaskAlphaC (const CARD32 *src, CARD32 *mask)
fbCombineMaskAlphaC (const CARD32 *src, CARD32 *mask, int width)
{ {
int i; CARD32 a = READ(mask);
for (i = 0; i < width; ++i) { CARD32 x;
CARD32 a = READ(mask + i);
CARD32 x;
if (!a) if (!a)
continue; return;
x = READ(src + i) >> 24; x = READ(src) >> 24;
if (x == 0xff) if (x == 0xff)
continue; return;
if (a == 0xffffffff) if (a == 0xffffffff)
{ {
x = x >> 24; x = x >> 24;
x |= x << 8; x |= x << 8;
x |= x << 16; x |= x << 16;
WRITE(mask + i, x); WRITE(mask, x);
continue; return;
}
FbByteMul(a, x);
WRITE(mask + i, a);
} }
FbByteMul(a, x);
WRITE(mask, a);
} }
static FASTCALL void static FASTCALL void
fbCombineClearC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width) fbCombineClearC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
{ {
memset(dest, 0, width*sizeof(CARD32)); MEMSET_WRAPPED(dest, 0, width*sizeof(CARD32));
} }
static FASTCALL void static FASTCALL void
fbCombineSrcC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width) fbCombineSrcC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
{ {
fbCombineMaskValueC(src, mask, width); int i;
MEMCPY_WRAPPED(dest, src, width*sizeof(CARD32));
for (i = 0; i < width; ++i) {
CARD32 s = READ(src + i);
CARD32 m = READ(mask + i);
fbCombineMaskValueC (&s, &m);
WRITE(dest, s);
}
} }
static FASTCALL void static FASTCALL void
fbCombineOverC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width) fbCombineOverC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
{ {
int i; int i;
fbCombineMaskC(src, mask, width);
for (i = 0; i < width; ++i) {
CARD32 s = READ(src + i);
CARD32 a = ~READ(mask + i);
for (i = 0; i < width; ++i) {
CARD32 s = READ(src + i);
CARD32 m = READ(mask + i);
CARD32 a;
fbCombineMaskC (&s, &m);
a = ~m;
if (a != 0xffffffff) if (a != 0xffffffff)
{ {
if (a) if (a)
@ -2189,7 +2191,7 @@ static FASTCALL void
fbCombineOverReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width) fbCombineOverReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
{ {
int i; int i;
fbCombineMaskValueC(src, mask, width);
for (i = 0; i < width; ++i) { for (i = 0; i < width; ++i) {
CARD32 d = READ(dest + i); CARD32 d = READ(dest + i);
CARD32 a = ~d >> 24; CARD32 a = ~d >> 24;
@ -2197,6 +2199,10 @@ fbCombineOverReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
if (a) if (a)
{ {
CARD32 s = READ(src + i); CARD32 s = READ(src + i);
CARD32 m = READ(mask + i);
fbCombineMaskValueC (&s, &m);
if (a != 0xff) if (a != 0xff)
{ {
FbByteMulAdd(s, a, d); FbByteMulAdd(s, a, d);
@ -2210,14 +2216,17 @@ static FASTCALL void
fbCombineInC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width) fbCombineInC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
{ {
int i; int i;
fbCombineMaskValueC(src, mask, width);
for (i = 0; i < width; ++i) { for (i = 0; i < width; ++i) {
CARD32 d = READ(dest + i); CARD32 d = READ(dest + i);
CARD16 a = d >> 24; CARD16 a = d >> 24;
CARD32 s = 0; CARD32 s = 0;
if (a) if (a)
{ {
s = READ(src + i); CARD32 m = READ(mask + i);
s = READ(src + i);
fbCombineMaskValueC (&s, &m);
if (a != 0xff) if (a != 0xff)
{ {
FbByteMul(s, a); FbByteMul(s, a);
@ -2231,10 +2240,15 @@ static FASTCALL void
fbCombineInReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width) fbCombineInReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
{ {
int i; int i;
fbCombineMaskAlphaC(src, mask, width);
for (i = 0; i < width; ++i) {
CARD32 a = READ(mask + i);
for (i = 0; i < width; ++i) {
CARD32 s = READ(src + i);
CARD32 m = READ(mask + i);
CARD32 a;
fbCombineMaskAlphaC (&s, &m);
a = m;
if (a != 0xffffffff) if (a != 0xffffffff)
{ {
CARD32 d = 0; CARD32 d = 0;
@ -2243,7 +2257,7 @@ fbCombineInReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
d = READ(dest + i); d = READ(dest + i);
FbByteMulC(d, a); FbByteMulC(d, a);
} }
WRITE(dest + i, d); WRITE(dest + i, d);
} }
} }
} }
@ -2252,14 +2266,18 @@ static FASTCALL void
fbCombineOutC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width) fbCombineOutC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
{ {
int i; int i;
fbCombineMaskValueC(src, mask, width);
for (i = 0; i < width; ++i) { for (i = 0; i < width; ++i) {
CARD32 d = READ(dest + i); CARD32 d = READ(dest + i);
CARD16 a = ~d >> 24; CARD16 a = ~d >> 24;
CARD32 s = 0; CARD32 s = 0;
if (a) if (a)
{ {
s = READ(src + i); CARD32 m = READ(mask + i);
s = READ(src + i);
fbCombineMaskValueC (&s, &m);
if (a != 0xff) if (a != 0xff)
{ {
FbByteMul(s, a); FbByteMul(s, a);
@ -2273,10 +2291,15 @@ static FASTCALL void
fbCombineOutReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width) fbCombineOutReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
{ {
int i; int i;
fbCombineMaskAlphaC(src, mask, width);
for (i = 0; i < width; ++i) {
CARD32 a = ~READ(mask + i);
for (i = 0; i < width; ++i) {
CARD32 s = READ(src + i);
CARD32 m = READ(mask + i);
CARD32 a;
fbCombineMaskAlphaC (&s, &m);
a = ~m;
if (a != 0xffffffff) if (a != 0xffffffff)
{ {
CARD32 d = 0; CARD32 d = 0;
@ -2294,12 +2317,18 @@ static FASTCALL void
fbCombineAtopC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width) fbCombineAtopC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
{ {
int i; int i;
fbCombineMaskC(src, mask, width);
for (i = 0; i < width; ++i) { for (i = 0; i < width; ++i) {
CARD32 d = READ(dest + i); CARD32 d = READ(dest + i);
CARD32 s = READ(src + i); CARD32 s = READ(src + i);
CARD32 ad = ~READ(mask + i); CARD32 m = READ(mask + i);
CARD32 ad;
CARD16 as = d >> 24; CARD16 as = d >> 24;
fbCombineMaskC (&s, &m);
ad = ~m;
FbByteAddMulC(d, ad, s, as); FbByteAddMulC(d, ad, s, as);
WRITE(dest + i, d); WRITE(dest + i, d);
} }
@ -2309,13 +2338,19 @@ static FASTCALL void
fbCombineAtopReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width) fbCombineAtopReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
{ {
int i; int i;
fbCombineMaskC(src, mask, width);
for (i = 0; i < width; ++i) { for (i = 0; i < width; ++i) {
CARD32 d = READ(dest + i); CARD32 d = READ(dest + i);
CARD32 s = READ(src + i); CARD32 s = READ(src + i);
CARD32 ad = READ(mask + i); CARD32 m = READ(mask + i);
CARD32 ad;
CARD16 as = ~d >> 24; CARD16 as = ~d >> 24;
fbCombineMaskC (&s, &m);
ad = m;
FbByteAddMulC(d, ad, s, as); FbByteAddMulC(d, ad, s, as);
WRITE(dest + i, d); WRITE(dest + i, d);
} }
@ -2325,12 +2360,18 @@ static FASTCALL void
fbCombineXorC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width) fbCombineXorC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
{ {
int i; int i;
fbCombineMaskC(src, mask, width);
for (i = 0; i < width; ++i) { for (i = 0; i < width; ++i) {
CARD32 d = READ(dest + i); CARD32 d = READ(dest + i);
CARD32 s = READ(src + i); CARD32 s = READ(src + i);
CARD32 ad = ~READ(mask + i); CARD32 m = READ(mask + i);
CARD32 ad;
CARD16 as = ~d >> 24; CARD16 as = ~d >> 24;
fbCombineMaskC (&s, &m);
ad = ~m;
FbByteAddMulC(d, ad, s, as); FbByteAddMulC(d, ad, s, as);
WRITE(dest + i, d); WRITE(dest + i, d);
} }
@ -2340,10 +2381,14 @@ static FASTCALL void
fbCombineAddC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width) fbCombineAddC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
{ {
int i; int i;
fbCombineMaskValueC(src, mask, width);
for (i = 0; i < width; ++i) { for (i = 0; i < width; ++i) {
CARD32 s = READ(src + i); CARD32 s = READ(src + i);
CARD32 m = READ(mask + i);
CARD32 d = READ(dest + i); CARD32 d = READ(dest + i);
fbCombineMaskValueC (&s, &m);
FbByteAdd(d, s); FbByteAdd(d, s);
WRITE(dest + i, d); WRITE(dest + i, d);
} }
@ -2353,7 +2398,7 @@ static FASTCALL void
fbCombineSaturateC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width) fbCombineSaturateC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
{ {
int i; int i;
fbCombineMaskC(src, mask, width);
for (i = 0; i < width; ++i) { for (i = 0; i < width; ++i) {
CARD32 s, d; CARD32 s, d;
CARD16 sa, sr, sg, sb, da; CARD16 sa, sr, sg, sb, da;
@ -2362,10 +2407,14 @@ fbCombineSaturateC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
d = READ(dest + i); d = READ(dest + i);
s = READ(src + i); s = READ(src + i);
sa = (READ(mask + i) >> 24); m = READ(mask + i);
sr = (READ(mask + i) >> 16) & 0xff;
sg = (READ(mask + i) >> 8) & 0xff; fbCombineMaskC (&s, &m);
sb = (READ(mask + i) ) & 0xff;
sa = (m >> 24);
sr = (m >> 16) & 0xff;
sg = (m >> 8) & 0xff;
sb = (m ) & 0xff;
da = ~d >> 24; da = ~d >> 24;
if (sb <= da) if (sb <= da)
@ -2396,7 +2445,7 @@ static FASTCALL void
fbCombineDisjointGeneralC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width, CARD8 combine) fbCombineDisjointGeneralC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width, CARD8 combine)
{ {
int i; int i;
fbCombineMaskC(src, mask, width);
for (i = 0; i < width; ++i) { for (i = 0; i < width; ++i) {
CARD32 s, d; CARD32 s, d;
CARD32 m,n,o,p; CARD32 m,n,o,p;
@ -2406,10 +2455,14 @@ fbCombineDisjointGeneralC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width, C
CARD8 da; CARD8 da;
s = READ(src + i); s = READ(src + i);
sa = READ(mask + i); m = READ(mask + i);
d = READ(dest + i); d = READ(dest + i);
da = d >> 24; da = d >> 24;
fbCombineMaskC (&s, &m);
sa = m;
switch (combine & CombineA) { switch (combine & CombineA) {
default: default:
Fa = 0; Fa = 0;
@ -2516,7 +2569,7 @@ static FASTCALL void
fbCombineConjointGeneralC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width, CARD8 combine) fbCombineConjointGeneralC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width, CARD8 combine)
{ {
int i; int i;
fbCombineMaskC(src, mask, width);
for (i = 0; i < width; ++i) { for (i = 0; i < width; ++i) {
CARD32 s, d; CARD32 s, d;
CARD32 m,n,o,p; CARD32 m,n,o,p;
@ -2526,10 +2579,14 @@ fbCombineConjointGeneralC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width, C
CARD8 da; CARD8 da;
s = READ(src + i); s = READ(src + i);
sa = READ(mask + i); m = READ(mask + i);
d = READ(dest + i); d = READ(dest + i);
da = d >> 24; da = d >> 24;
fbCombineMaskC (&s, &m);
sa = m;
switch (combine & CombineA) { switch (combine & CombineA) {
default: default:
Fa = 0; Fa = 0;