11176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include <stdlib.h>
21176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include <stdio.h>
31176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include <assert.h>
41176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include "utils.h"
51176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include "pixman-inlines.h"
61176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
71176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* A trivial reference implementation for
81176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * 'bilinear_pad_repeat_get_scanline_bounds'
91176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */
101176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic void
111176bdada62cabc6ec4b0308a930e83b679d5d36John Reckbilinear_pad_repeat_get_scanline_bounds_ref (int32_t        source_image_width,
121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck					     pixman_fixed_t vx_,
131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck					     pixman_fixed_t unit_x,
141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck					     int32_t *      left_pad,
151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck					     int32_t *      left_tz,
161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck					     int32_t *      width,
171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck					     int32_t *      right_tz,
181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck					     int32_t *      right_pad)
191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{
201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    int w = *width;
211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    int64_t vx = vx_;
221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    *left_pad = 0;
231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    *left_tz = 0;
241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    *width = 0;
251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    *right_tz = 0;
261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    *right_pad = 0;
271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    while (--w >= 0)
281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    {
291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	if (vx < 0)
301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	{
311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	    if (vx + pixman_fixed_1 < 0)
321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck		*left_pad += 1;
331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	    else
341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck		*left_tz += 1;
351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	}
361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	else if (vx + pixman_fixed_1 >= pixman_int_to_fixed (source_image_width))
371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	{
381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	    if (vx >= pixman_int_to_fixed (source_image_width))
391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck		*right_pad += 1;
401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	    else
411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck		*right_tz += 1;
421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	}
431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	else
441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	{
451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	    *width += 1;
461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	}
471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	vx += unit_x;
481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    }
491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck}
501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
511176bdada62cabc6ec4b0308a930e83b679d5d36John Reckint
521176bdada62cabc6ec4b0308a930e83b679d5d36John Reckmain (void)
531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{
541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    int i;
551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    prng_srand (0);
561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    for (i = 0; i < 10000; i++)
571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    {
581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	int32_t left_pad1, left_tz1, width1, right_tz1, right_pad1;
591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	int32_t left_pad2, left_tz2, width2, right_tz2, right_pad2;
601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	pixman_fixed_t vx = prng_rand_n(10000 << 16) - (3000 << 16);
611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	int32_t width = prng_rand_n(10000);
621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	int32_t source_image_width = prng_rand_n(10000) + 1;
631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	pixman_fixed_t unit_x = prng_rand_n(10 << 16) + 1;
641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	width1 = width2 = width;
651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	bilinear_pad_repeat_get_scanline_bounds_ref (source_image_width,
671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck						     vx,
681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck						     unit_x,
691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck						     &left_pad1,
701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck						     &left_tz1,
711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck						     &width1,
721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck						     &right_tz1,
731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck						     &right_pad1);
741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	bilinear_pad_repeat_get_scanline_bounds (source_image_width,
761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck						 vx,
771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck						 unit_x,
781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck						 &left_pad2,
791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck						 &left_tz2,
801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck						 &width2,
811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck						 &right_tz2,
821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck						 &right_pad2);
831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	assert (left_pad1 == left_pad2);
851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	assert (left_tz1 == left_tz2);
861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	assert (width1 == width2);
871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	assert (right_tz1 == right_tz2);
881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	assert (right_pad1 == right_pad2);
891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    }
901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
911176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    return 0;
921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck}
93