[Pixman] [PATCH 1/2] Add new test of filter reduction from BILINEAR to NEAREST
Søren Sandmann Pedersen
soren.sandmann at gmail.com
Tue Mar 15 06:19:47 UTC 2016
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.
Signed-off-by: Søren Sandmann <soren.sandmann at gmail.com>
---
test/Makefile.sources | 1 +
test/filter-reduction-test.c | 119 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 120 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..72b3142
--- /dev/null
+++ b/test/filter-reduction-test.c
@@ -0,0 +1,119 @@
+/*
+ * Test program, which can detect some problems with nearest neighbour
+ * and bilinear scaling in pixman. Testing is done by running lots
+ * of random SRC and OVER compositing operations a8r8g8b8, x8a8r8g8b8
+ * and r5g6b5 color formats.
+ *
+ * Script 'fuzzer-find-diff.pl' can be used to narrow down the problem in
+ * the case of test failure.
+ */
+#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 0x40BDEAC4
+#elif BILINEAR_INTERPOLATION_BITS == 4
+#define CHECKSUM 0xF8245E72
+#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 (0xcafebabe);
+
+ 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=%08X, expected %08X)\n", crc, CHECKSUM);
+ return 1;
+ }
+ else
+ {
+ printf ("filter-reduction-test passed (checksum=%08X)\n", crc);
+ return 0;
+ }
+}
--
1.7.11.7
More information about the Pixman
mailing list