Blame test/scaling-helpers-test.c

Packit 030a23
#include <stdlib.h>
Packit 030a23
#include <stdio.h>
Packit 030a23
#include <assert.h>
Packit 030a23
#include "utils.h"
Packit 030a23
#include "pixman-inlines.h"
Packit 030a23
Packit 030a23
/* A trivial reference implementation for
Packit 030a23
 * 'bilinear_pad_repeat_get_scanline_bounds'
Packit 030a23
 */
Packit 030a23
static void
Packit 030a23
bilinear_pad_repeat_get_scanline_bounds_ref (int32_t        source_image_width,
Packit 030a23
					     pixman_fixed_t vx_,
Packit 030a23
					     pixman_fixed_t unit_x,
Packit 030a23
					     int32_t *      left_pad,
Packit 030a23
					     int32_t *      left_tz,
Packit 030a23
					     int32_t *      width,
Packit 030a23
					     int32_t *      right_tz,
Packit 030a23
					     int32_t *      right_pad)
Packit 030a23
{
Packit 030a23
    int w = *width;
Packit 030a23
    int64_t vx = vx_;
Packit 030a23
    *left_pad = 0;
Packit 030a23
    *left_tz = 0;
Packit 030a23
    *width = 0;
Packit 030a23
    *right_tz = 0;
Packit 030a23
    *right_pad = 0;
Packit 030a23
    while (--w >= 0)
Packit 030a23
    {
Packit 030a23
	if (vx < 0)
Packit 030a23
	{
Packit 030a23
	    if (vx + pixman_fixed_1 < 0)
Packit 030a23
		*left_pad += 1;
Packit 030a23
	    else
Packit 030a23
		*left_tz += 1;
Packit 030a23
	}
Packit 030a23
	else if (vx + pixman_fixed_1 >= pixman_int_to_fixed (source_image_width))
Packit 030a23
	{
Packit 030a23
	    if (vx >= pixman_int_to_fixed (source_image_width))
Packit 030a23
		*right_pad += 1;
Packit 030a23
	    else
Packit 030a23
		*right_tz += 1;
Packit 030a23
	}
Packit 030a23
	else
Packit 030a23
	{
Packit 030a23
	    *width += 1;
Packit 030a23
	}
Packit 030a23
	vx += unit_x;
Packit 030a23
    }
Packit 030a23
}
Packit 030a23
Packit 030a23
int
Packit 030a23
main (void)
Packit 030a23
{
Packit 030a23
    int i;
Packit 030a23
    prng_srand (0);
Packit 030a23
    for (i = 0; i < 10000; i++)
Packit 030a23
    {
Packit 030a23
	int32_t left_pad1, left_tz1, width1, right_tz1, right_pad1;
Packit 030a23
	int32_t left_pad2, left_tz2, width2, right_tz2, right_pad2;
Packit 030a23
	pixman_fixed_t vx = prng_rand_n(10000 << 16) - (3000 << 16);
Packit 030a23
	int32_t width = prng_rand_n(10000);
Packit 030a23
	int32_t source_image_width = prng_rand_n(10000) + 1;
Packit 030a23
	pixman_fixed_t unit_x = prng_rand_n(10 << 16) + 1;
Packit 030a23
	width1 = width2 = width;
Packit 030a23
Packit 030a23
	bilinear_pad_repeat_get_scanline_bounds_ref (source_image_width,
Packit 030a23
						     vx,
Packit 030a23
						     unit_x,
Packit 030a23
						     &left_pad1,
Packit 030a23
						     &left_tz1,
Packit 030a23
						     &width1,
Packit 030a23
						     &right_tz1,
Packit 030a23
						     &right_pad1);
Packit 030a23
Packit 030a23
	bilinear_pad_repeat_get_scanline_bounds (source_image_width,
Packit 030a23
						 vx,
Packit 030a23
						 unit_x,
Packit 030a23
						 &left_pad2,
Packit 030a23
						 &left_tz2,
Packit 030a23
						 &width2,
Packit 030a23
						 &right_tz2,
Packit 030a23
						 &right_pad2);
Packit 030a23
Packit 030a23
	assert (left_pad1 == left_pad2);
Packit 030a23
	assert (left_tz1 == left_tz2);
Packit 030a23
	assert (width1 == width2);
Packit 030a23
	assert (right_tz1 == right_tz2);
Packit 030a23
	assert (right_pad1 == right_pad2);
Packit 030a23
    }
Packit 030a23
Packit 030a23
    return 0;
Packit 030a23
}