fetch-test.c revision 6ba797d6
1b4b94579Smrg#include <assert.h>
2b4b94579Smrg#include <stdlib.h>
3b4b94579Smrg#include <stdio.h>
4b4b94579Smrg#include "pixman.h"
5a450e446Smrg#include <config.h>
6b4b94579Smrg
7b4b94579Smrg#define SIZE 1024
8b4b94579Smrg
9952204abSmrgstatic pixman_indexed_t mono_palette =
10952204abSmrg{
116ba797d6Smrg    0, { 0x00000000, 0x00ffffff },
12b4b94579Smrg};
13b4b94579Smrg
14b4b94579Smrg
15b4b94579Smrgtypedef struct {
16b4b94579Smrg    pixman_format_code_t format;
17b4b94579Smrg    int width, height;
18b4b94579Smrg    int stride;
19b4b94579Smrg    uint32_t src[SIZE];
20b4b94579Smrg    uint32_t dst[SIZE];
21b4b94579Smrg    pixman_indexed_t *indexed;
22b4b94579Smrg} testcase_t;
23b4b94579Smrg
24952204abSmrgstatic testcase_t testcases[] =
25952204abSmrg{
26b4b94579Smrg    {
276ba797d6Smrg	PIXMAN_a8r8g8b8,
286ba797d6Smrg	2, 2,
296ba797d6Smrg	8,
306ba797d6Smrg	{ 0x00112233, 0x44556677,
316ba797d6Smrg	  0x8899aabb, 0xccddeeff },
326ba797d6Smrg	{ 0x00112233, 0x44556677,
336ba797d6Smrg	  0x8899aabb, 0xccddeeff },
346ba797d6Smrg	NULL,
35b4b94579Smrg    },
36b4b94579Smrg    {
376ba797d6Smrg	PIXMAN_r8g8b8a8,
386ba797d6Smrg	2, 2,
396ba797d6Smrg	8,
406ba797d6Smrg	{ 0x11223300, 0x55667744,
416ba797d6Smrg	  0x99aabb88, 0xddeeffcc },
426ba797d6Smrg	{ 0x00112233, 0x44556677,
436ba797d6Smrg	  0x8899aabb, 0xccddeeff },
446ba797d6Smrg	NULL,
456ba797d6Smrg    },
466ba797d6Smrg    {
476ba797d6Smrg	PIXMAN_g1,
486ba797d6Smrg	8, 2,
496ba797d6Smrg	4,
50a450e446Smrg#ifdef WORDS_BIGENDIAN
51952204abSmrg	{
52952204abSmrg	    0xaa000000,
53952204abSmrg	    0x55000000
54952204abSmrg	},
55a450e446Smrg#else
56952204abSmrg	{
57952204abSmrg	    0x00000055,
58952204abSmrg	    0x000000aa
59952204abSmrg	},
60a450e446Smrg#endif
61952204abSmrg	{
62952204abSmrg	    0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000,
63952204abSmrg	    0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff
64952204abSmrg	},
656ba797d6Smrg	&mono_palette,
66b4b94579Smrg    },
67b4b94579Smrg#if 0
68b4b94579Smrg    {
696ba797d6Smrg	PIXMAN_g8,
706ba797d6Smrg	4, 2,
716ba797d6Smrg	4,
726ba797d6Smrg	{ 0x01234567,
736ba797d6Smrg	  0x89abcdef },
746ba797d6Smrg	{ 0x00010101, 0x00232323, 0x00454545, 0x00676767,
756ba797d6Smrg	  0x00898989, 0x00ababab, 0x00cdcdcd, 0x00efefef, },
76b4b94579Smrg    },
77b4b94579Smrg#endif
78a450e446Smrg    /* FIXME: make this work on big endian */
79b4b94579Smrg    {
806ba797d6Smrg	PIXMAN_yv12,
816ba797d6Smrg	8, 2,
826ba797d6Smrg	8,
83a450e446Smrg#ifdef WORDS_BIGENDIAN
84952204abSmrg	{
85952204abSmrg	    0x00ff00ff, 0x00ff00ff,
86952204abSmrg	    0xff00ff00, 0xff00ff00,
87952204abSmrg	    0x80ff8000,
88952204abSmrg	    0x800080ff
89a450e446Smrg	},
90a450e446Smrg#else
91952204abSmrg	{
92952204abSmrg	    0xff00ff00, 0xff00ff00,
93952204abSmrg	    0x00ff00ff, 0x00ff00ff,
94952204abSmrg	    0x0080ff80,
95952204abSmrg	    0xff800080
96952204abSmrg	},
97a450e446Smrg#endif
98952204abSmrg	{
99952204abSmrg	    0xff000000, 0xffffffff, 0xffb80000, 0xffffe113,
100952204abSmrg	    0xff000000, 0xffffffff, 0xff0023ee, 0xff4affff,
101952204abSmrg	    0xffffffff, 0xff000000, 0xffffe113, 0xffb80000,
102952204abSmrg	    0xffffffff, 0xff000000, 0xff4affff, 0xff0023ee,
103b4b94579Smrg	},
104b4b94579Smrg    },
105b4b94579Smrg};
106b4b94579Smrg
107952204abSmrgint n_test_cases = sizeof(testcases)/sizeof(testcases[0]);
108b4b94579Smrg
109b4b94579Smrg
110b4b94579Smrgstatic uint32_t
111b4b94579Smrgreader (const void *src, int size)
112b4b94579Smrg{
113b4b94579Smrg    switch (size)
114b4b94579Smrg    {
115b4b94579Smrg    case 1:
116b4b94579Smrg	return *(uint8_t *)src;
117b4b94579Smrg    case 2:
118b4b94579Smrg	return *(uint16_t *)src;
119b4b94579Smrg    case 4:
120b4b94579Smrg	return *(uint32_t *)src;
121b4b94579Smrg    default:
122b4b94579Smrg	assert(0);
1236ba797d6Smrg	return 0; /* silence MSVC */
124b4b94579Smrg    }
125b4b94579Smrg}
126b4b94579Smrg
127b4b94579Smrg
128b4b94579Smrgstatic void
129b4b94579Smrgwriter (void *src, uint32_t value, int size)
130b4b94579Smrg{
131b4b94579Smrg    switch (size)
132b4b94579Smrg    {
133b4b94579Smrg    case 1:
134b4b94579Smrg	*(uint8_t *)src = value;
135b4b94579Smrg	break;
136b4b94579Smrg    case 2:
137b4b94579Smrg	*(uint16_t *)src = value;
138b4b94579Smrg	break;
139b4b94579Smrg    case 4:
140b4b94579Smrg	*(uint32_t *)src = value;
141b4b94579Smrg	break;
142b4b94579Smrg    default:
143b4b94579Smrg	assert(0);
144b4b94579Smrg    }
145b4b94579Smrg}
146b4b94579Smrg
147b4b94579Smrg
148b4b94579Smrgint
149b4b94579Smrgmain (int argc, char **argv)
150b4b94579Smrg{
151b4b94579Smrg    uint32_t dst[SIZE];
152b4b94579Smrg    pixman_image_t *src_img;
153b4b94579Smrg    pixman_image_t *dst_img;
154b4b94579Smrg    int i, j, x, y;
155b4b94579Smrg    int ret = 0;
156b4b94579Smrg
157952204abSmrg    for (i = 0; i < n_test_cases; ++i)
158952204abSmrg    {
159952204abSmrg	for (j = 0; j < 2; ++j)
160952204abSmrg	{
161b4b94579Smrg	    src_img = pixman_image_create_bits (testcases[i].format,
162952204abSmrg						testcases[i].width,
163b4b94579Smrg						testcases[i].height,
164b4b94579Smrg						testcases[i].src,
165b4b94579Smrg						testcases[i].stride);
166b4b94579Smrg	    pixman_image_set_indexed(src_img, testcases[i].indexed);
167b4b94579Smrg
168b4b94579Smrg	    dst_img = pixman_image_create_bits (PIXMAN_a8r8g8b8,
169952204abSmrg						testcases[i].width,
170b4b94579Smrg						testcases[i].height,
171b4b94579Smrg						dst,
172b4b94579Smrg						testcases[i].width*4);
173b4b94579Smrg
174952204abSmrg	    if (j)
175952204abSmrg	    {
176b4b94579Smrg		pixman_image_set_accessors (src_img, reader, writer);
177b4b94579Smrg		pixman_image_set_accessors (dst_img, reader, writer);
178b4b94579Smrg	    }
179952204abSmrg
180b4b94579Smrg	    pixman_image_composite (PIXMAN_OP_SRC, src_img, NULL, dst_img,
181b4b94579Smrg				    0, 0, 0, 0, 0, 0, testcases[i].width, testcases[i].height);
182b4b94579Smrg
183b4b94579Smrg	    pixman_image_unref (src_img);
184b4b94579Smrg	    pixman_image_unref (dst_img);
185b4b94579Smrg
186b4b94579Smrg	    for (y = 0; y < testcases[i].height; ++y)
187952204abSmrg	    {
188952204abSmrg		for (x = 0; x < testcases[i].width; ++x)
189952204abSmrg		{
190952204abSmrg		    int offset = y * testcases[i].width + x;
191952204abSmrg
192952204abSmrg		    if (dst[offset] != testcases[i].dst[offset])
193952204abSmrg		    {
194b4b94579Smrg			printf ("test %i%c: pixel mismatch at (x=%d,y=%d): %08x expected, %08x obtained\n",
195b4b94579Smrg			        i + 1, 'a' + j,
196952204abSmrg			        x, y,
197b4b94579Smrg			        testcases[i].dst[offset], dst[offset]);
198b4b94579Smrg			ret = 1;
199b4b94579Smrg		    }
200b4b94579Smrg		}
201952204abSmrg	    }
202b4b94579Smrg	}
203b4b94579Smrg    }
204952204abSmrg
205b4b94579Smrg    return ret;
206b4b94579Smrg}
207