diff options
author | Søren Sandmann Pedersen <soren.sandmann@gmail.com> | 2016-08-30 22:03:02 -0700 |
---|---|---|
committer | Søren Sandmann Pedersen <soren.sandmann@gmail.com> | 2016-09-02 00:40:11 -0400 |
commit | 76123690139a7f342776a885a7478a6c81712145 (patch) | |
tree | 533c7cc7d9562f99090b9ba4f9c94bb40db4b801 | |
parent | eb4a832ec22e4257b59cac752b02a1d27f4363bc (diff) |
Add new test of filter reduction from BILINEAR to NEAREST
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.sandmann@gmail.com>
Reviewed-by: Bill Spitzak <spitzak@gmail.com>
-rw-r--r-- | test/Makefile.sources | 1 | ||||
-rw-r--r-- | test/filter-reduction-test.c | 112 |
2 files changed, 113 insertions, 0 deletions
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; + } +} |