#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;
}