#include <stdlib.h> #include <stdio.h> #include <assert.h> #include "utils.h" #include "pixman-inlines.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; int64_t vx = vx_; *left_pad = 0; *left_tz = 0; *width = 0; *right_tz = 0; *right_pad = 0; 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; prng_srand (0); 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 = prng_rand_n(10000 << 16) - (3000 << 16); int32_t width = prng_rand_n(10000); int32_t source_image_width = prng_rand_n(10000) + 1; pixman_fixed_t unit_x = prng_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; }