1#include <assert.h>
2#include <stdlib.h>
3#include <stdio.h>
4#include "utils.h"
5
6#define SIZE 1024
7
8static pixman_indexed_t mono_palette =
9{
10    0, { 0x00000000, 0x00ffffff },
11};
12
13
14typedef struct {
15    pixman_format_code_t format;
16    int width, height;
17    int stride;
18    uint32_t src[SIZE];
19    uint32_t dst[SIZE];
20    pixman_indexed_t *indexed;
21} testcase_t;
22
23static testcase_t testcases[] =
24{
25    {
26	PIXMAN_a8r8g8b8,
27	2, 2,
28	8,
29	{ 0x00112233, 0x44556677,
30	  0x8899aabb, 0xccddeeff },
31	{ 0x00112233, 0x44556677,
32	  0x8899aabb, 0xccddeeff },
33	NULL,
34    },
35    {
36	PIXMAN_r8g8b8a8,
37	2, 2,
38	8,
39	{ 0x11223300, 0x55667744,
40	  0x99aabb88, 0xddeeffcc },
41	{ 0x00112233, 0x44556677,
42	  0x8899aabb, 0xccddeeff },
43	NULL,
44    },
45    {
46	PIXMAN_g1,
47	8, 2,
48	4,
49#ifdef WORDS_BIGENDIAN
50	{
51	    0xaa000000,
52	    0x55000000
53	},
54#else
55	{
56	    0x00000055,
57	    0x000000aa
58	},
59#endif
60	{
61	    0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000,
62	    0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff
63	},
64	&mono_palette,
65    },
66#if 0
67    {
68	PIXMAN_g8,
69	4, 2,
70	4,
71	{ 0x01234567,
72	  0x89abcdef },
73	{ 0x00010101, 0x00232323, 0x00454545, 0x00676767,
74	  0x00898989, 0x00ababab, 0x00cdcdcd, 0x00efefef, },
75    },
76#endif
77    /* FIXME: make this work on big endian */
78    {
79	PIXMAN_yv12,
80	8, 2,
81	8,
82#ifdef WORDS_BIGENDIAN
83	{
84	    0x00ff00ff, 0x00ff00ff,
85	    0xff00ff00, 0xff00ff00,
86	    0x80ff8000,
87	    0x800080ff
88	},
89#else
90	{
91	    0xff00ff00, 0xff00ff00,
92	    0x00ff00ff, 0x00ff00ff,
93	    0x0080ff80,
94	    0xff800080
95	},
96#endif
97	{
98	    0xff000000, 0xffffffff, 0xffb80000, 0xffffe113,
99	    0xff000000, 0xffffffff, 0xff0023ee, 0xff4affff,
100	    0xffffffff, 0xff000000, 0xffffe113, 0xffb80000,
101	    0xffffffff, 0xff000000, 0xff4affff, 0xff0023ee,
102	},
103    },
104};
105
106int n_test_cases = ARRAY_LENGTH (testcases);
107
108
109static uint32_t
110reader (const void *src, int size)
111{
112    switch (size)
113    {
114    case 1:
115	return *(uint8_t *)src;
116    case 2:
117	return *(uint16_t *)src;
118    case 4:
119	return *(uint32_t *)src;
120    default:
121	assert(0);
122	return 0; /* silence MSVC */
123    }
124}
125
126
127static void
128writer (void *src, uint32_t value, int size)
129{
130    switch (size)
131    {
132    case 1:
133	*(uint8_t *)src = value;
134	break;
135    case 2:
136	*(uint16_t *)src = value;
137	break;
138    case 4:
139	*(uint32_t *)src = value;
140	break;
141    default:
142	assert(0);
143    }
144}
145
146
147int
148main (int argc, char **argv)
149{
150    uint32_t dst[SIZE];
151    pixman_image_t *src_img;
152    pixman_image_t *dst_img;
153    int i, j, x, y;
154    int ret = 0;
155
156    for (i = 0; i < n_test_cases; ++i)
157    {
158	for (j = 0; j < 2; ++j)
159	{
160	    src_img = pixman_image_create_bits (testcases[i].format,
161						testcases[i].width,
162						testcases[i].height,
163						testcases[i].src,
164						testcases[i].stride);
165	    pixman_image_set_indexed(src_img, testcases[i].indexed);
166
167	    dst_img = pixman_image_create_bits (PIXMAN_a8r8g8b8,
168						testcases[i].width,
169						testcases[i].height,
170						dst,
171						testcases[i].width*4);
172
173	    if (j)
174	    {
175		pixman_image_set_accessors (src_img, reader, writer);
176		pixman_image_set_accessors (dst_img, reader, writer);
177	    }
178
179	    pixman_image_composite (PIXMAN_OP_SRC, src_img, NULL, dst_img,
180				    0, 0, 0, 0, 0, 0, testcases[i].width, testcases[i].height);
181
182	    pixman_image_unref (src_img);
183	    pixman_image_unref (dst_img);
184
185	    for (y = 0; y < testcases[i].height; ++y)
186	    {
187		for (x = 0; x < testcases[i].width; ++x)
188		{
189		    int offset = y * testcases[i].width + x;
190
191		    if (dst[offset] != testcases[i].dst[offset])
192		    {
193			printf ("test %i%c: pixel mismatch at (x=%d,y=%d): %08x expected, %08x obtained\n",
194			        i + 1, 'a' + j,
195			        x, y,
196			        testcases[i].dst[offset], dst[offset]);
197			ret = 1;
198		    }
199		}
200	    }
201	}
202    }
203
204    return ret;
205}
206