Home | History | Annotate | Download | only in test
      1 #include <stdlib.h>
      2 #include <stdio.h>
      3 #include <assert.h>
      4 #include "utils.h"
      5 #include "pixman-inlines.h"
      6 
      7 /* A trivial reference implementation for
      8  * 'bilinear_pad_repeat_get_scanline_bounds'
      9  */
     10 static void
     11 bilinear_pad_repeat_get_scanline_bounds_ref (int32_t        source_image_width,
     12 					     pixman_fixed_t vx_,
     13 					     pixman_fixed_t unit_x,
     14 					     int32_t *      left_pad,
     15 					     int32_t *      left_tz,
     16 					     int32_t *      width,
     17 					     int32_t *      right_tz,
     18 					     int32_t *      right_pad)
     19 {
     20     int w = *width;
     21     int64_t vx = vx_;
     22     *left_pad = 0;
     23     *left_tz = 0;
     24     *width = 0;
     25     *right_tz = 0;
     26     *right_pad = 0;
     27     while (--w >= 0)
     28     {
     29 	if (vx < 0)
     30 	{
     31 	    if (vx + pixman_fixed_1 < 0)
     32 		*left_pad += 1;
     33 	    else
     34 		*left_tz += 1;
     35 	}
     36 	else if (vx + pixman_fixed_1 >= pixman_int_to_fixed (source_image_width))
     37 	{
     38 	    if (vx >= pixman_int_to_fixed (source_image_width))
     39 		*right_pad += 1;
     40 	    else
     41 		*right_tz += 1;
     42 	}
     43 	else
     44 	{
     45 	    *width += 1;
     46 	}
     47 	vx += unit_x;
     48     }
     49 }
     50 
     51 int
     52 main (void)
     53 {
     54     int i;
     55     prng_srand (0);
     56     for (i = 0; i < 10000; i++)
     57     {
     58 	int32_t left_pad1, left_tz1, width1, right_tz1, right_pad1;
     59 	int32_t left_pad2, left_tz2, width2, right_tz2, right_pad2;
     60 	pixman_fixed_t vx = prng_rand_n(10000 << 16) - (3000 << 16);
     61 	int32_t width = prng_rand_n(10000);
     62 	int32_t source_image_width = prng_rand_n(10000) + 1;
     63 	pixman_fixed_t unit_x = prng_rand_n(10 << 16) + 1;
     64 	width1 = width2 = width;
     65 
     66 	bilinear_pad_repeat_get_scanline_bounds_ref (source_image_width,
     67 						     vx,
     68 						     unit_x,
     69 						     &left_pad1,
     70 						     &left_tz1,
     71 						     &width1,
     72 						     &right_tz1,
     73 						     &right_pad1);
     74 
     75 	bilinear_pad_repeat_get_scanline_bounds (source_image_width,
     76 						 vx,
     77 						 unit_x,
     78 						 &left_pad2,
     79 						 &left_tz2,
     80 						 &width2,
     81 						 &right_tz2,
     82 						 &right_pad2);
     83 
     84 	assert (left_pad1 == left_pad2);
     85 	assert (left_tz1 == left_tz2);
     86 	assert (width1 == width2);
     87 	assert (right_tz1 == right_tz2);
     88 	assert (right_pad1 == right_pad2);
     89     }
     90 
     91     return 0;
     92 }
     93