diff options
Diffstat (limited to 'pixman/test/scaling-helpers-test.c')
-rw-r--r-- | pixman/test/scaling-helpers-test.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/pixman/test/scaling-helpers-test.c b/pixman/test/scaling-helpers-test.c new file mode 100644 index 000000000..c1861389b --- /dev/null +++ b/pixman/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; +} |