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