• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <assert.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include "utils.h"
5 
6 #define SIZE 1024
7 
8 static pixman_indexed_t mono_palette =
9 {
10     0, { 0x00000000, 0x00ffffff },
11 };
12 
13 
14 typedef 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 
23 static 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 
106 int n_test_cases = ARRAY_LENGTH (testcases);
107 
108 
109 static uint32_t
reader(const void * src,int size)110 reader (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 
127 static void
writer(void * src,uint32_t value,int size)128 writer (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 
147 int
main(int argc,char ** argv)148 main (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