Optimize 1x1 repeating images in the general case
authorSøren Sandmann Pedersen <sandmann@redhat.com>
Sat, 16 Jun 2007 18:49:11 +0000 (14:49 -0400)
committerSøren Sandmann Pedersen <sandmann@redhat.com>
Sat, 16 Jun 2007 18:49:11 +0000 (14:49 -0400)
Reinstate checks for empty masks in mmxCombineOverU() and mmxCombineMaskU()

pixman/pixman-mmx.c
pixman/pixman-pict.c

index bda9bf4..9ec0429 100644 (file)
@@ -431,13 +431,19 @@ mmxCombineMaskU (uint32_t *src, const uint32_t *mask, int width)
 {
     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();
 }
@@ -447,14 +453,20 @@ static FASTCALL void
 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();
 }
index 8b72ffb..f444713 100644 (file)
@@ -1703,6 +1703,25 @@ pixman_image_composite (pixman_op_t      op,
 
     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 */