{
const uint32_t *end = mask + width;
while (mask < end) {
- __m64 a = load8888(*mask);
- __m64 s = load8888(*src);
- a = expand_alpha(a);
- s = pix_multiply(s, a);
- *src = store8888(s);
- ++src;
- ++mask;
+ uint32_t mmask = *mask;
+ uint32_t maska = mmask >> 24;
+ if (maska == 0) {
+ *src = 0;
+ } else if (maska != 0xff) {
+ __m64 a = load8888(mmask);
+ __m64 s = load8888(*src);
+ a = expand_alpha(a);
+ s = pix_multiply(s, a);
+ *src = store8888(s);
+ }
+ ++src;
+ ++mask;
}
_mm_empty();
}
mmxCombineOverU (uint32_t *dest, const uint32_t *src, int width)
{
const uint32_t *end = dest + width;
-
+
while (dest < end) {
- __m64 s, sa;
- s = load8888(*src);
- sa = expand_alpha(s);
- *dest = store8888(over(s, sa, load8888(*dest)));
- ++dest;
- ++src;
+ uint32_t ssrc = *src;
+ uint32_t a = ssrc >> 24;
+ if (a == 0xff) {
+ *dest = ssrc;
+ } else if (a) {
+ __m64 s, sa;
+ s = load8888(ssrc);
+ sa = expand_alpha(s);
+ *dest = store8888(over(s, sa, load8888(*dest)));
+ }
+ ++dest;
+ ++src;
}
_mm_empty();
}
if (!func) {
func = pixman_image_composite_rect;
+
+ /* CompositeGeneral optimizes 1x1 repeating images itself */
+ if (pSrc->type == BITS)
+ {
+ srcRepeat =
+ pSrc->common.repeat == PIXMAN_REPEAT_NORMAL &&
+ !pSrc->common.transform &&
+ pSrc->bits.width != 1 &&
+ pSrc->bits.height != 1;
+ }
+
+ if (pMask && pMask->type == BITS)
+ {
+ maskRepeat =
+ pMask->common.repeat == PIXMAN_REPEAT_NORMAL &&
+ !pMask->common.transform &&
+ pMask->bits.width != 1 &&
+ pMask->bits.height != 1;
+ }
}
/* if we are transforming, we handle repeats in fbFetchTransformed */