#include <stdio.h>
#include <stdlib.h>
#include "pixman.h"

typedef struct
{
    int				width;
    int				height;
    int				stride;
    pixman_format_code_t	format;
    
} image_info_t;

typedef struct
{
    pixman_op_t		op;
    
    image_info_t	src;
    image_info_t	dest;

    int			src_x;
    int			src_y;
    int			dest_x;
    int			dest_y;
    int			width;
    int			height;
} composite_info_t;

const composite_info_t info[] =
{
    {
	PIXMAN_OP_SRC,
	{  3, 6, 16, PIXMAN_a8r8g8b8 },
	{  5, 7, 20, PIXMAN_x8r8g8b8 },
	1, 8,
	1, -1,
	1, 8
    },
    {
	PIXMAN_OP_SRC,
	{ 7, 5, 36, PIXMAN_a8r8g8b8 },
	{ 6, 5, 28, PIXMAN_x8r8g8b8 },
	8, 5,
	5, 3,
	1, 2
    },
    {
	PIXMAN_OP_OVER,
	{ 10, 10, 40, PIXMAN_a2b10g10r10 },
	{ 10, 10, 40, PIXMAN_a2b10g10r10 },
	0, 0,
	0, 0,
	10, 10
    },
    {
	PIXMAN_OP_OVER,
	{ 10, 10, 40, PIXMAN_x2b10g10r10 },
	{ 10, 10, 40, PIXMAN_x2b10g10r10 },
	0, 0,
	0, 0,
	10, 10
    },
};

static pixman_image_t *
make_image (const image_info_t *info)
{
    char *data = malloc (info->stride * info->height);
    int i;

    for (i = 0; i < info->height * info->stride; ++i)
	data[i] = (i % 255) ^ (((i % 16) << 4) | (i & 0xf0));

    return pixman_image_create_bits (info->format, info->width, info->height, (uint32_t *)data, info->stride);
}
    
static void
test_composite (const composite_info_t *info)
{
    pixman_image_t *src = make_image (&info->src);
    pixman_image_t *dest = make_image (&info->dest);

    pixman_image_composite (PIXMAN_OP_SRC, src, NULL, dest,
			    info->src_x, info->src_y,
			    0, 0,
			    info->dest_x, info->dest_y,
			    info->width, info->height);
}



int
main (int argc, char **argv)
{
    int i;

    for (i = 0; i < sizeof (info) / sizeof (info[0]); ++i)
	test_composite (&info[i]);
    
    return 0;
}
