From e3b3d22999a130f7017e8e20a432a0d8a7f48f3b Mon Sep 17 00:00:00 2001 From: David Reveman Date: Thu, 12 Apr 2007 14:14:12 -0400 Subject: [PATCH] [pixman] Fix fbcompose.c that was broken for some composite operations (#5777) --- pixman/src/fbcompose.c | 254 +++++++++++++++++++++++++---------------- 1 file changed, 156 insertions(+), 98 deletions(-) diff --git a/pixman/src/fbcompose.c b/pixman/src/fbcompose.c index d93df454e..4fcf6998c 100644 --- a/pixman/src/fbcompose.c +++ b/pixman/src/fbcompose.c @@ -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;