Add a test compositing with the various PDF operators.
authorSøren Sandmann Pedersen <ssp@redhat.com>
Sat, 18 Dec 2010 11:05:52 +0000 (06:05 -0500)
committerSøren Sandmann Pedersen <ssp@redhat.com>
Tue, 21 Dec 2010 00:37:11 +0000 (19:37 -0500)
The test has floating point exceptions enabled, and currently fails
with a divide-by-zero.

test/Makefile.am
test/pdf-op-test.c [new file with mode: 0644]

index bc92e65..19c4f80 100644 (file)
@@ -6,6 +6,7 @@ INCLUDES = -I$(top_srcdir)/pixman -I$(top_builddir)/pixman
 
 TESTPROGRAMS =                 \
        a1-trap-test            \
+       pdf-op-test             \
        region-test             \
        region-translate-test   \
        fetch-test              \
@@ -28,6 +29,9 @@ oob_test_LDADD = $(TEST_LDADD)
 scaling_crash_test_LDADD = $(TEST_LDADD)
 region_translate_test_LDADD = $(TEST_LDADD)
 
+pdf_op_test_LDADD = $(TEST_LDADD)
+pdf_op_test_SOURCES = pdf-op-test.c utils.c utils.h
+
 region_test_LDADD = $(TEST_LDADD)
 region_test_SOURCES = region-test.c utils.c utils.h
 
diff --git a/test/pdf-op-test.c b/test/pdf-op-test.c
new file mode 100644 (file)
index 0000000..dc7a4fd
--- /dev/null
@@ -0,0 +1,84 @@
+#include <config.h>
+#include <stdlib.h>
+#include "utils.h"
+
+static const pixman_op_t pdf_ops[] =
+{
+    PIXMAN_OP_MULTIPLY,
+    PIXMAN_OP_SCREEN,
+    PIXMAN_OP_OVERLAY,
+    PIXMAN_OP_DARKEN,
+    PIXMAN_OP_LIGHTEN,
+    PIXMAN_OP_COLOR_DODGE,
+    PIXMAN_OP_COLOR_BURN,
+    PIXMAN_OP_HARD_LIGHT,
+    PIXMAN_OP_SOFT_LIGHT,
+    PIXMAN_OP_DIFFERENCE,
+    PIXMAN_OP_EXCLUSION,
+    PIXMAN_OP_HSL_HUE,
+    PIXMAN_OP_HSL_SATURATION,
+    PIXMAN_OP_HSL_COLOR,
+    PIXMAN_OP_HSL_LUMINOSITY
+};
+
+static const uint32_t pixels[] =
+{
+    0x00808080,
+    0x80123456,
+    0x00000000,
+    0xffffffff,
+    0x00ffffff,
+    0x80808080,
+    0x00123456,
+};
+
+int
+main ()
+{
+    int o, s, m, d;
+
+    enable_fp_exceptions();
+
+    for (o = 0; o < ARRAY_LENGTH (pdf_ops); ++o)
+    {
+       pixman_op_t op = pdf_ops[o];
+
+       for (s = 0; s < ARRAY_LENGTH (pixels); ++s)
+       {
+           pixman_image_t *src;
+
+           src = pixman_image_create_bits (
+               PIXMAN_a8r8g8b8, 1, 1, (uint32_t *)&(pixels[s]), 4);
+
+           for (m = -1; m < ARRAY_LENGTH (pixels); ++m)
+           {
+               pixman_image_t *msk = NULL;
+               if (m >= 0)
+               {
+                   msk = pixman_image_create_bits (
+                       PIXMAN_a8r8g8b8, 1, 1, (uint32_t *)&(pixels[m]), 4);
+               }
+
+               for (d = 0; d < ARRAY_LENGTH (pixels); ++d)
+               {
+                   pixman_image_t *dst;
+                   uint32_t dp = pixels[d];
+
+                   dst = pixman_image_create_bits (
+                       PIXMAN_a8r8g8b8, 1, 1, &dp, 4);
+
+                   pixman_image_composite (op, src, msk, dst,
+                                           0, 0, 0, 0, 0, 0, 1, 1);
+
+                   pixman_image_unref (dst);
+               }
+               if (msk)
+                   pixman_image_unref (msk);
+           }
+
+           pixman_image_unref (src);
+       }
+    }
+
+    return 0;
+}