[pixman] Fix fbcompose.c that was broken for some composite operations (#5777)

This commit is contained in:
David Reveman 2007-04-12 14:14:12 -04:00 committed by Behdad Esfahbod
parent c8d2d1e876
commit e3b3d22999

View file

@ -2059,88 +2059,79 @@ static CombineFuncU fbCombineFuncU[] = {
};
static FASTCALL void
fbCombineMaskC (CARD32 *src, CARD32 *mask, int width)
fbCombineMaskC (CARD32 *src, CARD32 *mask)
{
int i;
for (i = 0; i < width; ++i) {
CARD32 a = mask[i];
CARD32 a = *mask;
CARD32 x;
CARD16 xa;
CARD32 x;
CARD16 xa;
if (!a)
{
src[i] = 0;
continue;
}
x = src[i];
if (a == 0xffffffff)
{
x = x >> 24;
x |= x << 8;
x |= x << 16;
mask[i] = x;
continue;
}
xa = x >> 24;
FbByteMulC(x, a);
src[i] = x;
FbByteMul(a, xa);
mask[i] = a;
if (!a)
{
*src = 0;
return;
}
x = *src;
if (a == 0xffffffff)
{
x = x >> 24;
x |= x << 8;
x |= x << 16;
*mask = x;
return;
}
xa = x >> 24;
FbByteMulC(x, a);
*src = x;
FbByteMul(a, xa);
*mask = a;
}
static FASTCALL void
fbCombineMaskValueC (CARD32 *src, const CARD32 *mask, int width)
fbCombineMaskValueC (CARD32 *src, const CARD32 *mask)
{
int i;
for (i = 0; i < width; ++i) {
CARD32 a = mask[i];
CARD32 x;
CARD32 a = *mask;
CARD32 x;
if (!a)
{
src[i] = 0;
continue;
}
if (a == 0xffffffff)
continue;
x = src[i];
FbByteMulC(x, a);
src[i] = x;
if (!a)
{
*src = 0;
return;
}
if (a == 0xffffffff)
return;
x = *src;
FbByteMulC(x, a);
*src = x;
}
static FASTCALL void
fbCombineMaskAlphaC (const CARD32 *src, CARD32 *mask, int width)
fbCombineMaskAlphaC (const CARD32 *src, CARD32 *mask)
{
int i;
for (i = 0; i < width; ++i) {
CARD32 a = mask[i];
CARD32 x;
CARD32 a = *mask;
CARD32 x;
if (!a)
continue;
if (!a)
return;
x = src[i] >> 24;
if (x == 0xff)
continue;
if (a == 0xffffffff)
{
x = x >> 24;
x |= x << 8;
x |= x << 16;
mask[i] = x;
continue;
}
FbByteMul(a, x);
mask[i] = a;
x = *src >> 24;
if (x == 0xff)
return;
if (a == 0xffffffff)
{
x = x >> 24;
x |= x << 8;
x |= x << 16;
*mask = x;
return;
}
FbByteMul(a, x);
*mask = a;
}
static FASTCALL void
@ -2152,19 +2143,31 @@ fbCombineClearC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
static FASTCALL void
fbCombineSrcC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
{
fbCombineMaskValueC(src, mask, width);
memcpy(dest, src, width*sizeof(CARD32));
int i;
for (i = 0; i < width; ++i) {
CARD32 s = src[i];
CARD32 m = mask[i];
fbCombineMaskValueC (&s, &m);
*dest = s;
}
}
static FASTCALL void
fbCombineOverC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
{
int i;
fbCombineMaskC(src, mask, width);
for (i = 0; i < width; ++i) {
CARD32 s = src[i];
CARD32 a = ~mask[i];
for (i = 0; i < width; ++i) {
CARD32 s = src[i];
CARD32 m = mask[i];
CARD32 a;
fbCombineMaskC (&s, &m);
a = ~m;
if (a != 0xffffffff)
{
if (a)
@ -2182,7 +2185,7 @@ static FASTCALL void
fbCombineOverReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
{
int i;
fbCombineMaskValueC(src, mask, width);
for (i = 0; i < width; ++i) {
CARD32 d = dest[i];
CARD32 a = ~d >> 24;
@ -2190,6 +2193,10 @@ fbCombineOverReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
if (a)
{
CARD32 s = src[i];
CARD32 m = mask[i];
fbCombineMaskValueC (&s, &m);
if (a != 0xff)
{
FbByteMulAdd(s, a, d);
@ -2203,14 +2210,17 @@ static FASTCALL void
fbCombineInC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
{
int i;
fbCombineMaskValueC(src, mask, width);
for (i = 0; i < width; ++i) {
CARD32 d = dest[i];
CARD16 a = d >> 24;
CARD32 s = 0;
if (a)
{
s = src[i];
CARD32 m = mask[i];
s = src[i];
fbCombineMaskValueC (&s, &m);
if (a != 0xff)
{
FbByteMul(s, a);
@ -2224,10 +2234,15 @@ static FASTCALL void
fbCombineInReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
{
int i;
fbCombineMaskAlphaC(src, mask, width);
for (i = 0; i < width; ++i) {
CARD32 a = mask[i];
for (i = 0; i < width; ++i) {
CARD32 s = src[i];
CARD32 m = mask[i];
CARD32 a;
fbCombineMaskAlphaC (&s, &m);
a = m;
if (a != 0xffffffff)
{
CARD32 d = 0;
@ -2245,14 +2260,18 @@ static FASTCALL void
fbCombineOutC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
{
int i;
fbCombineMaskValueC(src, mask, width);
for (i = 0; i < width; ++i) {
CARD32 d = dest[i];
CARD16 a = ~d >> 24;
CARD32 s = 0;
if (a)
{
s = src[i];
CARD32 m = mask[i];
s = src[i];
fbCombineMaskValueC (&s, &m);
if (a != 0xff)
{
FbByteMul(s, a);
@ -2266,10 +2285,15 @@ static FASTCALL void
fbCombineOutReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
{
int i;
fbCombineMaskAlphaC(src, mask, width);
for (i = 0; i < width; ++i) {
CARD32 a = ~mask[i];
for (i = 0; i < width; ++i) {
CARD32 s = src[i];
CARD32 m = mask[i];
CARD32 a;
fbCombineMaskAlphaC (&s, &m);
a = ~m;
if (a != 0xffffffff)
{
CARD32 d = 0;
@ -2287,12 +2311,18 @@ static FASTCALL void
fbCombineAtopC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
{
int i;
fbCombineMaskC(src, mask, width);
for (i = 0; i < width; ++i) {
CARD32 d = dest[i];
CARD32 s = src[i];
CARD32 ad = ~mask[i];
CARD32 m = mask[i];
CARD32 ad;
CARD16 as = d >> 24;
fbCombineMaskC (&s, &m);
ad = ~m;
FbByteAddMulC(d, ad, s, as);
dest[i] = d;
}
@ -2302,13 +2332,19 @@ static FASTCALL void
fbCombineAtopReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
{
int i;
fbCombineMaskC(src, mask, width);
for (i = 0; i < width; ++i) {
CARD32 d = dest[i];
CARD32 s = src[i];
CARD32 ad = mask[i];
CARD32 m = mask[i];
CARD32 ad;
CARD16 as = ~d >> 24;
fbCombineMaskC (&s, &m);
ad = m;
FbByteAddMulC(d, ad, s, as);
dest[i] = d;
}
@ -2318,12 +2354,18 @@ static FASTCALL void
fbCombineXorC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
{
int i;
fbCombineMaskC(src, mask, width);
for (i = 0; i < width; ++i) {
CARD32 d = dest[i];
CARD32 s = src[i];
CARD32 ad = ~mask[i];
CARD32 m = mask[i];
CARD32 ad;
CARD16 as = ~d >> 24;
fbCombineMaskC (&s, &m);
ad = ~m;
FbByteAddMulC(d, ad, s, as);
dest[i] = d;
}
@ -2333,10 +2375,14 @@ static FASTCALL void
fbCombineAddC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
{
int i;
fbCombineMaskValueC(src, mask, width);
for (i = 0; i < width; ++i) {
CARD32 s = src[i];
CARD32 m = mask[i];
CARD32 d = dest[i];
fbCombineMaskValueC (&s, &m);
FbByteAdd(d, s);
dest[i] = d;
}
@ -2346,7 +2392,7 @@ static FASTCALL void
fbCombineSaturateC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
{
int i;
fbCombineMaskC(src, mask, width);
for (i = 0; i < width; ++i) {
CARD32 s, d;
CARD16 sa, sr, sg, sb, da;
@ -2355,10 +2401,14 @@ fbCombineSaturateC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
d = dest[i];
s = src[i];
sa = (mask[i] >> 24);
sr = (mask[i] >> 16) & 0xff;
sg = (mask[i] >> 8) & 0xff;
sb = (mask[i] ) & 0xff;
m = mask[i];
fbCombineMaskC (&s, &m);
sa = (m >> 24);
sr = (m >> 16) & 0xff;
sg = (m >> 8) & 0xff;
sb = (m ) & 0xff;
da = ~d >> 24;
if (sb <= da)
@ -2389,7 +2439,7 @@ static FASTCALL void
fbCombineDisjointGeneralC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width, CARD8 combine)
{
int i;
fbCombineMaskC(src, mask, width);
for (i = 0; i < width; ++i) {
CARD32 s, d;
CARD32 m,n,o,p;
@ -2399,10 +2449,14 @@ fbCombineDisjointGeneralC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width, C
CARD8 da;
s = src[i];
sa = mask[i];
m = mask[i];
d = dest[i];
da = d >> 24;
fbCombineMaskC (&s, &m);
sa = m;
switch (combine & CombineA) {
default:
Fa = 0;
@ -2509,7 +2563,7 @@ static FASTCALL void
fbCombineConjointGeneralC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width, CARD8 combine)
{
int i;
fbCombineMaskC(src, mask, width);
for (i = 0; i < width; ++i) {
CARD32 s, d;
CARD32 m,n,o,p;
@ -2519,10 +2573,14 @@ fbCombineConjointGeneralC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width, C
CARD8 da;
s = src[i];
sa = mask[i];
m = mask[i];
d = dest[i];
da = d >> 24;
fbCombineMaskC (&s, &m);
sa = m;
switch (combine & CombineA) {
default:
Fa = 0;