diff options
author | Siarhei Siamashka <siarhei.siamashka@nokia.com> | 2011-02-21 02:07:09 +0200 |
---|---|---|
committer | Siarhei Siamashka <siarhei.siamashka@nokia.com> | 2011-02-28 15:29:23 +0200 |
commit | 0df43b8ae5031dd83775d00b57b6bed809db0e89 (patch) | |
tree | 1c8fbfeea8040e92f072ff48b9fc805f7e8ea4ba | |
parent | d506bf68fd0e9a1c5dd484daee70631699918387 (diff) |
test: check correctness of 'bilinear_pad_repeat_get_scanline_bounds'
Individual correctness check for the new bilinear scaling related
supplementary function. This test program uses a bit wider range
of input arguments, not covered by other tests.
-rw-r--r-- | test/Makefile.am | 2 | ||||
-rw-r--r-- | test/scaling-helpers-test.c | 93 |
2 files changed, 95 insertions, 0 deletions
diff --git a/test/Makefile.am b/test/Makefile.am index 057e9ced..9dc72199 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -13,6 +13,7 @@ TESTPROGRAMS = \ trap-crasher \ alpha-loop \ scaling-crash-test \ + scaling-helpers-test \ gradient-crash-test \ alphamap \ stress-test \ @@ -33,6 +34,7 @@ alpha_loop_SOURCES = alpha-loop.c utils.c utils.h composite_SOURCES = composite.c utils.c utils.h gradient_crash_test_SOURCES = gradient-crash-test.c utils.c utils.h stress_test_SOURCES = stress-test.c utils.c utils.h +scaling_helpers_test_SOURCES = scaling-helpers-test.c utils.c utils.h # Benchmarks diff --git a/test/scaling-helpers-test.c b/test/scaling-helpers-test.c new file mode 100644 index 00000000..c1861389 --- /dev/null +++ b/test/scaling-helpers-test.c @@ -0,0 +1,93 @@ +#include <config.h> +#include <stdint.h> +#include <stdlib.h> +#include <stdio.h> +#include <assert.h> +#include "utils.h" +#include "pixman-fast-path.h" + +/* A trivial reference implementation for + * 'bilinear_pad_repeat_get_scanline_bounds' + */ +static void +bilinear_pad_repeat_get_scanline_bounds_ref (int32_t source_image_width, + pixman_fixed_t vx_, + pixman_fixed_t unit_x, + int32_t * left_pad, + int32_t * left_tz, + int32_t * width, + int32_t * right_tz, + int32_t * right_pad) +{ + int w = *width; + *left_pad = 0; + *left_tz = 0; + *width = 0; + *right_tz = 0; + *right_pad = 0; + int64_t vx = vx_; + while (--w >= 0) + { + if (vx < 0) + { + if (vx + pixman_fixed_1 < 0) + *left_pad += 1; + else + *left_tz += 1; + } + else if (vx + pixman_fixed_1 >= pixman_int_to_fixed (source_image_width)) + { + if (vx >= pixman_int_to_fixed (source_image_width)) + *right_pad += 1; + else + *right_tz += 1; + } + else + { + *width += 1; + } + vx += unit_x; + } +} + +int +main (void) +{ + int i; + for (i = 0; i < 10000; i++) + { + int32_t left_pad1, left_tz1, width1, right_tz1, right_pad1; + int32_t left_pad2, left_tz2, width2, right_tz2, right_pad2; + pixman_fixed_t vx = lcg_rand_N(10000 << 16) - (3000 << 16); + int32_t width = lcg_rand_N(10000); + int32_t source_image_width = lcg_rand_N(10000) + 1; + pixman_fixed_t unit_x = lcg_rand_N(10 << 16) + 1; + width1 = width2 = width; + + bilinear_pad_repeat_get_scanline_bounds_ref (source_image_width, + vx, + unit_x, + &left_pad1, + &left_tz1, + &width1, + &right_tz1, + &right_pad1); + + bilinear_pad_repeat_get_scanline_bounds (source_image_width, + vx, + unit_x, + &left_pad2, + &left_tz2, + &width2, + &right_tz2, + &right_pad2); + + assert (left_pad1 == left_pad2); + assert (left_tz1 == left_tz2); + assert (width1 == width2); + assert (right_tz1 == right_tz2); + assert (right_pad1 == right_pad2); + } + + return 0; +} |