Blame test/fetch-test.c

Packit 030a23
#include <assert.h>
Packit 030a23
#include <stdlib.h>
Packit 030a23
#include <stdio.h>
Packit 030a23
#include "utils.h"
Packit 030a23
Packit 030a23
#define SIZE 1024
Packit 030a23
Packit 030a23
static pixman_indexed_t mono_palette =
Packit 030a23
{
Packit 030a23
    0, { 0x00000000, 0x00ffffff },
Packit 030a23
};
Packit 030a23
Packit 030a23
Packit 030a23
typedef struct {
Packit 030a23
    pixman_format_code_t format;
Packit 030a23
    int width, height;
Packit 030a23
    int stride;
Packit 030a23
    uint32_t src[SIZE];
Packit 030a23
    uint32_t dst[SIZE];
Packit 030a23
    pixman_indexed_t *indexed;
Packit 030a23
} testcase_t;
Packit 030a23
Packit 030a23
static testcase_t testcases[] =
Packit 030a23
{
Packit 030a23
    {
Packit 030a23
	PIXMAN_a8r8g8b8,
Packit 030a23
	2, 2,
Packit 030a23
	8,
Packit 030a23
	{ 0x00112233, 0x44556677,
Packit 030a23
	  0x8899aabb, 0xccddeeff },
Packit 030a23
	{ 0x00112233, 0x44556677,
Packit 030a23
	  0x8899aabb, 0xccddeeff },
Packit 030a23
	NULL,
Packit 030a23
    },
Packit 030a23
    {
Packit 030a23
	PIXMAN_r8g8b8a8,
Packit 030a23
	2, 2,
Packit 030a23
	8,
Packit 030a23
	{ 0x11223300, 0x55667744,
Packit 030a23
	  0x99aabb88, 0xddeeffcc },
Packit 030a23
	{ 0x00112233, 0x44556677,
Packit 030a23
	  0x8899aabb, 0xccddeeff },
Packit 030a23
	NULL,
Packit 030a23
    },
Packit 030a23
    {
Packit 030a23
	PIXMAN_g1,
Packit 030a23
	8, 2,
Packit 030a23
	4,
Packit 030a23
#ifdef WORDS_BIGENDIAN
Packit 030a23
	{
Packit 030a23
	    0xaa000000,
Packit 030a23
	    0x55000000
Packit 030a23
	},
Packit 030a23
#else
Packit 030a23
	{
Packit 030a23
	    0x00000055,
Packit 030a23
	    0x000000aa
Packit 030a23
	},
Packit 030a23
#endif
Packit 030a23
	{
Packit 030a23
	    0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000,
Packit 030a23
	    0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff
Packit 030a23
	},
Packit 030a23
	&mono_palette,
Packit 030a23
    },
Packit 030a23
#if 0
Packit 030a23
    {
Packit 030a23
	PIXMAN_g8,
Packit 030a23
	4, 2,
Packit 030a23
	4,
Packit 030a23
	{ 0x01234567,
Packit 030a23
	  0x89abcdef },
Packit 030a23
	{ 0x00010101, 0x00232323, 0x00454545, 0x00676767,
Packit 030a23
	  0x00898989, 0x00ababab, 0x00cdcdcd, 0x00efefef, },
Packit 030a23
    },
Packit 030a23
#endif
Packit 030a23
    /* FIXME: make this work on big endian */
Packit 030a23
    {
Packit 030a23
	PIXMAN_yv12,
Packit 030a23
	8, 2,
Packit 030a23
	8,
Packit 030a23
#ifdef WORDS_BIGENDIAN
Packit 030a23
	{
Packit 030a23
	    0x00ff00ff, 0x00ff00ff,
Packit 030a23
	    0xff00ff00, 0xff00ff00,
Packit 030a23
	    0x80ff8000,
Packit 030a23
	    0x800080ff
Packit 030a23
	},
Packit 030a23
#else
Packit 030a23
	{
Packit 030a23
	    0xff00ff00, 0xff00ff00,
Packit 030a23
	    0x00ff00ff, 0x00ff00ff,
Packit 030a23
	    0x0080ff80,
Packit 030a23
	    0xff800080
Packit 030a23
	},
Packit 030a23
#endif
Packit 030a23
	{
Packit 030a23
	    0xff000000, 0xffffffff, 0xffb80000, 0xffffe113,
Packit 030a23
	    0xff000000, 0xffffffff, 0xff0023ee, 0xff4affff,
Packit 030a23
	    0xffffffff, 0xff000000, 0xffffe113, 0xffb80000,
Packit 030a23
	    0xffffffff, 0xff000000, 0xff4affff, 0xff0023ee,
Packit 030a23
	},
Packit 030a23
    },
Packit 030a23
};
Packit 030a23
Packit 030a23
int n_test_cases = ARRAY_LENGTH (testcases);
Packit 030a23
Packit 030a23
Packit 030a23
static uint32_t
Packit 030a23
reader (const void *src, int size)
Packit 030a23
{
Packit 030a23
    switch (size)
Packit 030a23
    {
Packit 030a23
    case 1:
Packit 030a23
	return *(uint8_t *)src;
Packit 030a23
    case 2:
Packit 030a23
	return *(uint16_t *)src;
Packit 030a23
    case 4:
Packit 030a23
	return *(uint32_t *)src;
Packit 030a23
    default:
Packit 030a23
	assert(0);
Packit 030a23
	return 0; /* silence MSVC */
Packit 030a23
    }
Packit 030a23
}
Packit 030a23
Packit 030a23
Packit 030a23
static void
Packit 030a23
writer (void *src, uint32_t value, int size)
Packit 030a23
{
Packit 030a23
    switch (size)
Packit 030a23
    {
Packit 030a23
    case 1:
Packit 030a23
	*(uint8_t *)src = value;
Packit 030a23
	break;
Packit 030a23
    case 2:
Packit 030a23
	*(uint16_t *)src = value;
Packit 030a23
	break;
Packit 030a23
    case 4:
Packit 030a23
	*(uint32_t *)src = value;
Packit 030a23
	break;
Packit 030a23
    default:
Packit 030a23
	assert(0);
Packit 030a23
    }
Packit 030a23
}
Packit 030a23
Packit 030a23
Packit 030a23
int
Packit 030a23
main (int argc, char **argv)
Packit 030a23
{
Packit 030a23
    uint32_t dst[SIZE];
Packit 030a23
    pixman_image_t *src_img;
Packit 030a23
    pixman_image_t *dst_img;
Packit 030a23
    int i, j, x, y;
Packit 030a23
    int ret = 0;
Packit 030a23
Packit 030a23
    for (i = 0; i < n_test_cases; ++i)
Packit 030a23
    {
Packit 030a23
	for (j = 0; j < 2; ++j)
Packit 030a23
	{
Packit 030a23
	    src_img = pixman_image_create_bits (testcases[i].format,
Packit 030a23
						testcases[i].width,
Packit 030a23
						testcases[i].height,
Packit 030a23
						testcases[i].src,
Packit 030a23
						testcases[i].stride);
Packit 030a23
	    pixman_image_set_indexed(src_img, testcases[i].indexed);
Packit 030a23
Packit 030a23
	    dst_img = pixman_image_create_bits (PIXMAN_a8r8g8b8,
Packit 030a23
						testcases[i].width,
Packit 030a23
						testcases[i].height,
Packit 030a23
						dst,
Packit 030a23
						testcases[i].width*4);
Packit 030a23
Packit 030a23
	    if (j)
Packit 030a23
	    {
Packit 030a23
		pixman_image_set_accessors (src_img, reader, writer);
Packit 030a23
		pixman_image_set_accessors (dst_img, reader, writer);
Packit 030a23
	    }
Packit 030a23
Packit 030a23
	    pixman_image_composite (PIXMAN_OP_SRC, src_img, NULL, dst_img,
Packit 030a23
				    0, 0, 0, 0, 0, 0, testcases[i].width, testcases[i].height);
Packit 030a23
Packit 030a23
	    pixman_image_unref (src_img);
Packit 030a23
	    pixman_image_unref (dst_img);
Packit 030a23
Packit 030a23
	    for (y = 0; y < testcases[i].height; ++y)
Packit 030a23
	    {
Packit 030a23
		for (x = 0; x < testcases[i].width; ++x)
Packit 030a23
		{
Packit 030a23
		    int offset = y * testcases[i].width + x;
Packit 030a23
Packit 030a23
		    if (dst[offset] != testcases[i].dst[offset])
Packit 030a23
		    {
Packit 030a23
			printf ("test %i%c: pixel mismatch at (x=%d,y=%d): %08x expected, %08x obtained\n",
Packit 030a23
			        i + 1, 'a' + j,
Packit 030a23
			        x, y,
Packit 030a23
			        testcases[i].dst[offset], dst[offset]);
Packit 030a23
			ret = 1;
Packit 030a23
		    }
Packit 030a23
		}
Packit 030a23
	    }
Packit 030a23
	}
Packit 030a23
    }
Packit 030a23
Packit 030a23
    return ret;
Packit 030a23
}