pixman-combine32.c: Make Color Burn routine follow the math more closely
authorSøren Sandmann Pedersen <ssp@redhat.com>
Fri, 4 Oct 2013 20:45:21 +0000 (16:45 -0400)
committerSøren Sandmann Pedersen <ssp@redhat.com>
Sat, 12 Oct 2013 19:04:27 +0000 (15:04 -0400)
For superluminescent destinations, the old code could underflow in

    uint32_t r = (ad - d) * as / s;

when (ad - d) was negative. The new code avoids this problem (and
therefore causes changes in the checksums of thread-test and
blitters-test), but it is likely still buggy due to the use of
unsigned variables and other issues in the blend mode code.

pixman/pixman-combine32.c
test/blitters-test.c
test/thread-test.c

index 25c00539a9bbd2896290a0bd2d0d4ccd24e7cf43..450114a52c40613db2f2e0eff7f2ada4d59a973f 100644 (file)
@@ -779,15 +779,14 @@ PDF_SEPARABLE_BLEND_MODE (color_dodge)
 static inline uint32_t
 blend_color_burn (uint32_t d, uint32_t ad, uint32_t s, uint32_t as)
 {
-    if (s == 0)
-    {
-       return d < ad ? 0 : DIV_ONE_UN8 (as * ad);
-    }
+    if (d >= ad)
+       return DIV_ONE_UN8 (ad * as);
+    else if (as * ad - as * d >= ad * s)
+       return 0;
+    else if (s == 0)
+       return 0;
     else
-    {
-       uint32_t r = (ad - d) * as / s;
-       return DIV_ONE_UN8 (as * (MAX (r, ad) - r));
-    }
+       return DIV_ONE_UN8 (ad * as - (as * as * (ad - d)) / s);
 }
 
 PDF_SEPARABLE_BLEND_MODE (color_burn)
index 396b5b54964f11179801eff6e7c71b7569d1c3ad..ea03f475d3b22fe8bd410ff6659ff69831c37826 100644 (file)
@@ -394,6 +394,6 @@ main (int argc, const char *argv[])
     }
 
     return fuzzer_test_main("blitters", 2000000,
-                           0x6A783AD5,
+                           0xE0A07495,
                            test_composite, argc, argv);
 }
index bf49f6bbc6c0d55a374808a7968f12efc479979c..fa219330269b79040a63b22fe30278d5e194cb63 100644 (file)
@@ -184,7 +184,7 @@ main (void)
 
     crc32 = compute_crc32 (0, crc32s, sizeof crc32s);
 
-#define EXPECTED 0x12F4B484
+#define EXPECTED 0xE299B18E
 
     if (crc32 != EXPECTED)
     {