--- a/pixman/src/fbcompose.c +++ b/pixman/src/fbcompose.c @@ -2057,88 +2057,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 x; - CARD16 xa; + CARD32 a = *mask; - if (!a) - { - src[i] = 0; - continue; - } + CARD32 x; + CARD16 xa; - x = src[i]; - if (a == 0xffffffff) - { - x = x >> 24; - x |= x << 8; - x |= x << 16; - mask[i] = x; - continue; - } + if (!a) + { + *src = 0; + return; + } - xa = x >> 24; - FbByteMulC(x, a); - src[i] = x; - FbByteMul(a, xa); - mask[i] = a; + 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) + { + *src = 0; + return; + } - if (a == 0xffffffff) - continue; + if (a == 0xffffffff) + return; - x = src[i]; - FbByteMulC(x, a); - src[i] = x; - } + 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 @@ -2150,19 +2141,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]; + CARD32 s = src[i]; + CARD32 m = mask[i]; + CARD32 a; + + fbCombineMaskC (&s, &m); + a = ~m; if (a != 0xffffffff) { if (a) @@ -2180,7 +2183,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; @@ -2188,6 +2191,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); @@ -2201,14 +2208,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); @@ -2222,10 +2232,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]; + CARD32 s = src[i]; + CARD32 m = mask[i]; + CARD32 a; + + fbCombineMaskAlphaC (&s, &m); + a = m; if (a != 0xffffffff) { CARD32 d = 0; @@ -2243,14 +2258,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); @@ -2264,10 +2283,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]; + CARD32 s = src[i]; + CARD32 m = mask[i]; + CARD32 a; + + fbCombineMaskAlphaC (&s, &m); + a = ~m; if (a != 0xffffffff) { CARD32 d = 0; @@ -2285,12 +2309,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; } @@ -2300,13 +2330,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; } @@ -2316,12 +2352,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; } @@ -2331,10 +2373,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; } @@ -2344,7 +2390,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; @@ -2353,10 +2399,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) @@ -2387,7 +2437,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; @@ -2397,10 +2447,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; @@ -2507,7 +2561,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; @@ -2517,10 +2571,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;