From: Søren Sandmann Pedersen <soren.sandm...@gmail.com>

This new test tests a bunch of bilinear downscalings, where many have
a transformation such that the BILINEAR filter can be reduced to
NEAREST (and many don't).

A CRC32 is computed for all the resulting images and compared to a
known-good value for both 4-bit and 7-bit interpolation.

V2: Remove leftover comment, some minor formatting fixes, use a
timestamp as the PRNG seed.

Signed-off-by: Søren Sandmann <soren.sandm...@gmail.com>
Reviewed-by: Bill Spitzak <spit...@gmail.com>
---
 test/Makefile.sources        |   1 +
 test/filter-reduction-test.c | 112 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 113 insertions(+)
 create mode 100644 test/filter-reduction-test.c

diff --git a/test/Makefile.sources b/test/Makefile.sources
index 5d55e67..0a56231 100644
--- a/test/Makefile.sources
+++ b/test/Makefile.sources
@@ -21,6 +21,7 @@ TESTPROGRAMS =                              \
        gradient-crash-test           \
        pixel-test                    \
        matrix-test                   \
+       filter-reduction-test         \
        composite-traps-test          \
        region-contains-test          \
        glyph-test                    \
diff --git a/test/filter-reduction-test.c b/test/filter-reduction-test.c
new file mode 100644
index 0000000..705fa4b
--- /dev/null
+++ b/test/filter-reduction-test.c
@@ -0,0 +1,112 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include "utils.h"
+
+static const pixman_fixed_t entries[] =
+{
+    pixman_double_to_fixed (-1.0),
+    pixman_double_to_fixed (-0.5),
+    pixman_double_to_fixed (-1/3.0),
+    pixman_double_to_fixed (0.0),
+    pixman_double_to_fixed (0.5),
+    pixman_double_to_fixed (1.0),
+    pixman_double_to_fixed (1.5),
+    pixman_double_to_fixed (2.0),
+    pixman_double_to_fixed (3.0),
+};
+
+#define SIZE 12
+
+static uint32_t
+test_scale (const pixman_transform_t *xform, uint32_t crc)
+{
+    uint32_t *srcbuf, *dstbuf;
+    pixman_image_t *src, *dest;
+
+    srcbuf = malloc (SIZE * SIZE * 4);
+    prng_randmemset (srcbuf, SIZE * SIZE * 4, 0);
+    src = pixman_image_create_bits (
+       PIXMAN_a8r8g8b8, SIZE, SIZE, srcbuf, SIZE * 4);
+
+    dstbuf = malloc (SIZE * SIZE * 4);
+    prng_randmemset (dstbuf, SIZE * SIZE * 4, 0);
+    dest = pixman_image_create_bits (
+       PIXMAN_a8r8g8b8, SIZE, SIZE, dstbuf, SIZE * 4);
+
+    pixman_image_set_transform (src, xform);
+    pixman_image_set_repeat (src, PIXMAN_REPEAT_NORMAL);
+    pixman_image_set_filter (src, PIXMAN_FILTER_BILINEAR, NULL, 0);
+
+    image_endian_swap (src);
+    image_endian_swap (dest);
+
+    pixman_image_composite (PIXMAN_OP_SRC,
+                           src, NULL, dest,
+                           0, 0, 0, 0, 0, 0,
+                           SIZE, SIZE);
+
+    crc = compute_crc32_for_image (crc, dest);
+
+    pixman_image_unref (src);
+    pixman_image_unref (dest);
+
+    free (srcbuf);
+    free (dstbuf);
+
+    return crc;
+}
+
+#if BILINEAR_INTERPOLATION_BITS == 7
+#define CHECKSUM 0x02169677
+#elif BILINEAR_INTERPOLATION_BITS == 4
+#define CHECKSUM 0xE44B29AC
+#else
+#define CHECKSUM 0x00000000
+#endif
+
+int
+main (int argc, const char *argv[])
+{
+    const pixman_fixed_t *end = entries + ARRAY_LENGTH (entries);
+    const pixman_fixed_t *t0, *t1, *t2, *t3, *t4, *t5;
+    uint32_t crc = 0;
+
+    prng_srand (0x56EA1DBD);
+
+    for (t0 = entries; t0 < end; ++t0)
+    {
+       for (t1 = entries; t1 < end; ++t1)
+       {
+           for (t2 = entries; t2 < end; ++t2)
+           {
+               for (t3 = entries; t3 < end; ++t3)
+               {
+                   for (t4 = entries; t4 < end; ++t4)
+                   {
+                       for (t5 = entries; t5 < end; ++t5)
+                       {
+                           pixman_transform_t xform = {
+                               { { *t0, *t1, *t2 },
+                                 { *t3, *t4, *t5 },
+                                 { 0, 0, pixman_fixed_1 } }
+                           };
+
+                           crc = test_scale (&xform, crc);
+                       }
+                   }
+               }
+           }
+       }
+    }
+
+    if (crc != CHECKSUM)
+    {
+       printf ("filter-reduction-test failed! (checksum=0x%08X, expected 
0x%08X)\n", crc, CHECKSUM);
+       return 1;
+    }
+    else
+    {
+       printf ("filter-reduction-test passed (checksum=0x%08X)\n", crc);
+       return 0;
+    }
+}
-- 
1.9.1

_______________________________________________
Pixman mailing list
Pixman@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/pixman

Reply via email to