Add qemu 2.4.0
[kvmfornfv.git] / qemu / pixman / test / fetch-test.c
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
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
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
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 }