Edit

IABSD.fr/xenocara/lib/pixman/test/scaling-helpers-test.c

Branch :

  • Show log

    Commit

  • Author : matthieu
    Date : 2013-06-07 17:18:00
    Hash : a9e7c8ad
    Message : Update to pixman 0.30.0. Tested by several people during t2k13. Thanks.

  • lib/pixman/test/scaling-helpers-test.c
  • #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;
    }