Blame test/gradient-crash-test.c

Packit 030a23
#include <stdio.h>
Packit 030a23
#include <stdlib.h>
Packit 030a23
#include "utils.h"
Packit 030a23
Packit 030a23
int
Packit 030a23
main (int argc, char **argv)
Packit 030a23
{
Packit 030a23
#define WIDTH 400
Packit 030a23
#define HEIGHT 200
Packit 030a23
    
Packit 030a23
    uint32_t *dest = malloc (WIDTH * HEIGHT * 4);
Packit 030a23
    pixman_image_t *src_img;
Packit 030a23
    pixman_image_t *dest_img;
Packit 030a23
    int i, j, k, p;
Packit 030a23
Packit 030a23
    typedef struct
Packit 030a23
    {
Packit 030a23
	pixman_point_fixed_t p0;
Packit 030a23
	pixman_point_fixed_t p1;
Packit 030a23
    } point_pair_t;
Packit 030a23
    
Packit 030a23
    pixman_gradient_stop_t onestop[1] =
Packit 030a23
	{
Packit 030a23
	    { pixman_int_to_fixed (1), { 0xffff, 0xeeee, 0xeeee, 0xeeee } },
Packit 030a23
	};
Packit 030a23
Packit 030a23
    pixman_gradient_stop_t subsetstops[2] =
Packit 030a23
	{
Packit 030a23
	    { pixman_int_to_fixed (1), { 0xffff, 0xeeee, 0xeeee, 0xeeee } },
Packit 030a23
	    { pixman_int_to_fixed (1), { 0xffff, 0xeeee, 0xeeee, 0xeeee } },
Packit 030a23
	};
Packit 030a23
Packit 030a23
    pixman_gradient_stop_t stops01[2] =
Packit 030a23
	{
Packit 030a23
	    { pixman_int_to_fixed (0), { 0xffff, 0xeeee, 0xeeee, 0xeeee } },
Packit 030a23
	    { pixman_int_to_fixed (1), { 0xffff, 0x1111, 0x1111, 0x1111 } }
Packit 030a23
	};
Packit 030a23
Packit 030a23
    point_pair_t point_pairs [] =
Packit 030a23
	{ { { pixman_double_to_fixed (0), 0 },
Packit 030a23
	    { pixman_double_to_fixed (WIDTH / 8.), pixman_int_to_fixed (0) } },
Packit 030a23
	  { { pixman_double_to_fixed (WIDTH / 2.0), pixman_double_to_fixed (HEIGHT / 2.0) },
Packit 030a23
	    { pixman_double_to_fixed (WIDTH / 2.0), pixman_double_to_fixed (HEIGHT / 2.0) } }
Packit 030a23
	};
Packit 030a23
    
Packit 030a23
    pixman_transform_t transformations[] = {
Packit 030a23
	{
Packit 030a23
	    { { pixman_double_to_fixed (2), pixman_double_to_fixed (0.5), pixman_double_to_fixed (-100), },
Packit 030a23
	      { pixman_double_to_fixed (0), pixman_double_to_fixed (3), pixman_double_to_fixed (0), },
Packit 030a23
	      { pixman_double_to_fixed (0), pixman_double_to_fixed (0.000), pixman_double_to_fixed (1.0) } 
Packit 030a23
	    }
Packit 030a23
	},
Packit 030a23
	{
Packit 030a23
	    { { pixman_double_to_fixed (1), pixman_double_to_fixed (0), pixman_double_to_fixed (0), },
Packit 030a23
	      { pixman_double_to_fixed (0), pixman_double_to_fixed (1), pixman_double_to_fixed (0), },
Packit 030a23
	      { pixman_double_to_fixed (0), pixman_double_to_fixed (0.000), pixman_double_to_fixed (1.0) } 
Packit 030a23
	    }
Packit 030a23
	},
Packit 030a23
	{
Packit 030a23
	    { { pixman_double_to_fixed (2), pixman_double_to_fixed (1), pixman_double_to_fixed (0), },
Packit 030a23
	      { pixman_double_to_fixed (1), pixman_double_to_fixed (1), pixman_double_to_fixed (0), },
Packit 030a23
	      { pixman_double_to_fixed (2), pixman_double_to_fixed (1.000), pixman_double_to_fixed (1.0) } 
Packit 030a23
	    }
Packit 030a23
	},
Packit 030a23
	{
Packit 030a23
	    { { pixman_double_to_fixed (2), pixman_double_to_fixed (1), pixman_double_to_fixed (0), },
Packit 030a23
	      { pixman_double_to_fixed (1), pixman_double_to_fixed (1), pixman_double_to_fixed (0), },
Packit 030a23
	      { pixman_double_to_fixed (0), pixman_double_to_fixed (0), pixman_double_to_fixed (0) } 
Packit 030a23
	    }
Packit 030a23
	},
Packit 030a23
	{
Packit 030a23
	    { { pixman_double_to_fixed (2), pixman_double_to_fixed (1), pixman_double_to_fixed (0), },
Packit 030a23
	      { pixman_double_to_fixed (1), pixman_double_to_fixed (1), pixman_double_to_fixed (0), },
Packit 030a23
	      { pixman_double_to_fixed (2), pixman_double_to_fixed (-1), pixman_double_to_fixed (0) } 
Packit 030a23
	    }
Packit 030a23
	},
Packit 030a23
	{
Packit 030a23
	    { { pixman_double_to_fixed (2), pixman_double_to_fixed (1), pixman_double_to_fixed (3), },
Packit 030a23
	      { pixman_double_to_fixed (1), pixman_double_to_fixed (1), pixman_double_to_fixed (0), },
Packit 030a23
	      { pixman_double_to_fixed (2), pixman_double_to_fixed (-1), pixman_double_to_fixed (0) } 
Packit 030a23
	    }
Packit 030a23
	},
Packit 030a23
    };
Packit 030a23
    
Packit 030a23
    pixman_fixed_t r_inner;
Packit 030a23
    pixman_fixed_t r_outer;
Packit 030a23
Packit 030a23
    enable_divbyzero_exceptions();
Packit 030a23
    
Packit 030a23
    for (i = 0; i < WIDTH * HEIGHT; ++i)
Packit 030a23
	dest[i] = 0x4f00004f; /* pale blue */
Packit 030a23
    
Packit 030a23
    dest_img = pixman_image_create_bits (PIXMAN_a8r8g8b8,
Packit 030a23
					 WIDTH, HEIGHT, 
Packit 030a23
					 dest,
Packit 030a23
					 WIDTH * 4);
Packit 030a23
Packit 030a23
    r_inner = 0;
Packit 030a23
    r_outer = pixman_double_to_fixed (50.0);
Packit 030a23
    
Packit 030a23
    for (i = 0; i < 3; ++i)
Packit 030a23
    {
Packit 030a23
	pixman_gradient_stop_t *stops;
Packit 030a23
        int num_stops;
Packit 030a23
Packit 030a23
	if (i == 0)
Packit 030a23
	{
Packit 030a23
	    stops = onestop;
Packit 030a23
	    num_stops = ARRAY_LENGTH (onestop);
Packit 030a23
	}
Packit 030a23
	else if (i == 1)
Packit 030a23
	{
Packit 030a23
	    stops = subsetstops;
Packit 030a23
	    num_stops = ARRAY_LENGTH (subsetstops);
Packit 030a23
	}
Packit 030a23
	else
Packit 030a23
	{
Packit 030a23
	    stops = stops01;
Packit 030a23
	    num_stops = ARRAY_LENGTH (stops01);
Packit 030a23
	}
Packit 030a23
	
Packit 030a23
	for (j = 0; j < 3; ++j)
Packit 030a23
	{
Packit 030a23
	    for (p = 0; p < ARRAY_LENGTH (point_pairs); ++p)
Packit 030a23
	    {
Packit 030a23
		point_pair_t *pair = &(point_pairs[p]);
Packit 030a23
Packit 030a23
		if (j == 0)
Packit 030a23
		    src_img = pixman_image_create_conical_gradient (&(pair->p0), r_inner,
Packit 030a23
								    stops, num_stops);
Packit 030a23
		else if (j == 1)
Packit 030a23
		    src_img = pixman_image_create_radial_gradient  (&(pair->p0), &(pair->p1),
Packit 030a23
								    r_inner, r_outer,
Packit 030a23
								    stops, num_stops);
Packit 030a23
		else
Packit 030a23
		    src_img = pixman_image_create_linear_gradient  (&(pair->p0), &(pair->p1),
Packit 030a23
								    stops, num_stops);
Packit 030a23
		
Packit 030a23
		for (k = 0; k < ARRAY_LENGTH (transformations); ++k)
Packit 030a23
		{
Packit 030a23
		    pixman_image_set_transform (src_img, &transformations[k]);
Packit 030a23
		    
Packit 030a23
		    pixman_image_set_repeat (src_img, PIXMAN_REPEAT_NONE);
Packit 030a23
		    pixman_image_composite (PIXMAN_OP_OVER, src_img, NULL, dest_img,
Packit 030a23
					    0, 0, 0, 0, 0, 0, 10 * WIDTH, HEIGHT);
Packit 030a23
		}
Packit 030a23
Packit 030a23
		pixman_image_unref (src_img);
Packit 030a23
	    }
Packit 030a23
Packit 030a23
	}
Packit 030a23
    }
Packit 030a23
Packit 030a23
    pixman_image_unref (dest_img);
Packit 030a23
    free (dest);
Packit 030a23
    
Packit 030a23
    return 0;
Packit 030a23
}