Fix vmx_combine_over_ca().
authorSøren Sandmann Pedersen <sandmann@redhat.com>
Fri, 7 Aug 2009 15:26:23 +0000 (11:26 -0400)
committerSøren Sandmann Pedersen <sandmann@redhat.com>
Sat, 8 Aug 2009 22:50:18 +0000 (18:50 -0400)
In the non-vector code, the mask needs to be multiplied with source
alpha.

pixman/pixman-vmx.c

index 511c8cb..0038752 100644 (file)
@@ -1170,30 +1170,35 @@ vmx_combine_over_ca (pixman_implementation_t *imp,
     vector unsigned int vdest, vsrc, vmask;
     vector unsigned char tmp1, tmp2, tmp3, tmp4, edges,
        dest_mask, mask_mask, src_mask, store_mask;
-    
+
     COMPUTE_SHIFT_MASKC (dest, src, mask);
+
     /* printf ("%s\n",__PRETTY_FUNCTION__); */
     for (i = width / 4; i > 0; i--)
     {
-       
+
        LOAD_VECTORSC (dest, src, mask);
-       
+
        vdest = in_over (vsrc, splat_alpha (vsrc), vmask, vdest);
-       
+
        STORE_VECTOR (dest);
-       
+
        mask += 4;
        src += 4;
        dest += 4;
     }
-    
+
     for (i = width % 4; --i >= 0;)
     {
        uint32_t a = mask[i];
        uint32_t s = src[i];
        uint32_t d = dest[i];
+       uint32_t sa = ALPHA_8 (s);
+
        UN8x4_MUL_UN8x4 (s, a);
+       UN8x4_MUL_UN8 (a, sa);
        UN8x4_MUL_UN8x4_ADD_UN8x4 (d, ~a, s);
+
        dest[i] = d;
     }
 }