fetch-test.c revision 952204ab
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{
11b4b94579Smrg    .rgba = { 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    {
27b4b94579Smrg	.format = PIXMAN_a8r8g8b8,
28b4b94579Smrg	.width = 2, .height = 2,
29b4b94579Smrg	.stride = 8,
30952204abSmrg	.src = { 0x00112233, 0x44556677,
31b4b94579Smrg	         0x8899aabb, 0xccddeeff },
32952204abSmrg	.dst = { 0x00112233, 0x44556677,
33b4b94579Smrg	         0x8899aabb, 0xccddeeff },
34b4b94579Smrg	.indexed = NULL,
35b4b94579Smrg    },
36b4b94579Smrg    {
37b4b94579Smrg	.format = PIXMAN_g1,
38b4b94579Smrg	.width = 8, .height = 2,
39b4b94579Smrg	.stride = 4,
40a450e446Smrg#ifdef WORDS_BIGENDIAN
41952204abSmrg	.src =
42952204abSmrg	{
43952204abSmrg	    0xaa000000,
44952204abSmrg	    0x55000000
45952204abSmrg	},
46a450e446Smrg#else
47952204abSmrg	.src =
48952204abSmrg	{
49952204abSmrg	    0x00000055,
50952204abSmrg	    0x000000aa
51952204abSmrg	},
52a450e446Smrg#endif
53952204abSmrg	.dst =
54952204abSmrg	{
55952204abSmrg	    0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000,
56952204abSmrg	    0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff
57952204abSmrg	},
58952204abSmrg	.indexed = &mono_palette,
59b4b94579Smrg    },
60b4b94579Smrg#if 0
61b4b94579Smrg    {
62b4b94579Smrg	.format = PIXMAN_g8,
63b4b94579Smrg	.width = 4, .height = 2,
64b4b94579Smrg	.stride = 4,
65952204abSmrg	.src = { 0x01234567,
66b4b94579Smrg	         0x89abcdef },
67952204abSmrg	.dst = { 0x00010101, 0x00232323, 0x00454545, 0x00676767,
68b4b94579Smrg	         0x00898989, 0x00ababab, 0x00cdcdcd, 0x00efefef, },
69b4b94579Smrg    },
70b4b94579Smrg#endif
71a450e446Smrg    /* FIXME: make this work on big endian */
72b4b94579Smrg    {
73b4b94579Smrg	.format = PIXMAN_yv12,
74b4b94579Smrg	.width = 8, .height = 2,
75b4b94579Smrg	.stride = 8,
76a450e446Smrg#ifdef WORDS_BIGENDIAN
77952204abSmrg	.src =
78952204abSmrg	{
79952204abSmrg	    0x00ff00ff, 0x00ff00ff,
80952204abSmrg	    0xff00ff00, 0xff00ff00,
81952204abSmrg	    0x80ff8000,
82952204abSmrg	    0x800080ff
83a450e446Smrg	},
84a450e446Smrg#else
85952204abSmrg	.src =
86952204abSmrg	{
87952204abSmrg	    0xff00ff00, 0xff00ff00,
88952204abSmrg	    0x00ff00ff, 0x00ff00ff,
89952204abSmrg	    0x0080ff80,
90952204abSmrg	    0xff800080
91952204abSmrg	},
92a450e446Smrg#endif
93952204abSmrg	.dst =
94952204abSmrg	{
95952204abSmrg	    0xff000000, 0xffffffff, 0xffb80000, 0xffffe113,
96952204abSmrg	    0xff000000, 0xffffffff, 0xff0023ee, 0xff4affff,
97952204abSmrg	    0xffffffff, 0xff000000, 0xffffe113, 0xffb80000,
98952204abSmrg	    0xffffffff, 0xff000000, 0xff4affff, 0xff0023ee,
99b4b94579Smrg	},
100b4b94579Smrg    },
101b4b94579Smrg};
102b4b94579Smrg
103952204abSmrgint n_test_cases = sizeof(testcases)/sizeof(testcases[0]);
104b4b94579Smrg
105b4b94579Smrg
106b4b94579Smrgstatic uint32_t
107b4b94579Smrgreader (const void *src, int size)
108b4b94579Smrg{
109b4b94579Smrg    switch (size)
110b4b94579Smrg    {
111b4b94579Smrg    case 1:
112b4b94579Smrg	return *(uint8_t *)src;
113b4b94579Smrg    case 2:
114b4b94579Smrg	return *(uint16_t *)src;
115b4b94579Smrg    case 4:
116b4b94579Smrg	return *(uint32_t *)src;
117b4b94579Smrg    default:
118b4b94579Smrg	assert(0);
119b4b94579Smrg    }
120b4b94579Smrg}
121b4b94579Smrg
122b4b94579Smrg
123b4b94579Smrgstatic void
124b4b94579Smrgwriter (void *src, uint32_t value, int size)
125b4b94579Smrg{
126b4b94579Smrg    switch (size)
127b4b94579Smrg    {
128b4b94579Smrg    case 1:
129b4b94579Smrg	*(uint8_t *)src = value;
130b4b94579Smrg	break;
131b4b94579Smrg    case 2:
132b4b94579Smrg	*(uint16_t *)src = value;
133b4b94579Smrg	break;
134b4b94579Smrg    case 4:
135b4b94579Smrg	*(uint32_t *)src = value;
136b4b94579Smrg	break;
137b4b94579Smrg    default:
138b4b94579Smrg	assert(0);
139b4b94579Smrg    }
140b4b94579Smrg}
141b4b94579Smrg
142b4b94579Smrg
143b4b94579Smrgint
144b4b94579Smrgmain (int argc, char **argv)
145b4b94579Smrg{
146b4b94579Smrg    uint32_t dst[SIZE];
147b4b94579Smrg    pixman_image_t *src_img;
148b4b94579Smrg    pixman_image_t *dst_img;
149b4b94579Smrg    int i, j, x, y;
150b4b94579Smrg    int ret = 0;
151b4b94579Smrg
152952204abSmrg    for (i = 0; i < n_test_cases; ++i)
153952204abSmrg    {
154952204abSmrg	for (j = 0; j < 2; ++j)
155952204abSmrg	{
156b4b94579Smrg	    src_img = pixman_image_create_bits (testcases[i].format,
157952204abSmrg						testcases[i].width,
158b4b94579Smrg						testcases[i].height,
159b4b94579Smrg						testcases[i].src,
160b4b94579Smrg						testcases[i].stride);
161b4b94579Smrg	    pixman_image_set_indexed(src_img, testcases[i].indexed);
162b4b94579Smrg
163b4b94579Smrg	    dst_img = pixman_image_create_bits (PIXMAN_a8r8g8b8,
164952204abSmrg						testcases[i].width,
165b4b94579Smrg						testcases[i].height,
166b4b94579Smrg						dst,
167b4b94579Smrg						testcases[i].width*4);
168b4b94579Smrg
169952204abSmrg	    if (j)
170952204abSmrg	    {
171b4b94579Smrg		pixman_image_set_accessors (src_img, reader, writer);
172b4b94579Smrg		pixman_image_set_accessors (dst_img, reader, writer);
173b4b94579Smrg	    }
174952204abSmrg
175b4b94579Smrg	    pixman_image_composite (PIXMAN_OP_SRC, src_img, NULL, dst_img,
176b4b94579Smrg				    0, 0, 0, 0, 0, 0, testcases[i].width, testcases[i].height);
177b4b94579Smrg
178b4b94579Smrg	    pixman_image_unref (src_img);
179b4b94579Smrg	    pixman_image_unref (dst_img);
180b4b94579Smrg
181b4b94579Smrg	    for (y = 0; y < testcases[i].height; ++y)
182952204abSmrg	    {
183952204abSmrg		for (x = 0; x < testcases[i].width; ++x)
184952204abSmrg		{
185952204abSmrg		    int offset = y * testcases[i].width + x;
186952204abSmrg
187952204abSmrg		    if (dst[offset] != testcases[i].dst[offset])
188952204abSmrg		    {
189b4b94579Smrg			printf ("test %i%c: pixel mismatch at (x=%d,y=%d): %08x expected, %08x obtained\n",
190b4b94579Smrg			        i + 1, 'a' + j,
191952204abSmrg			        x, y,
192b4b94579Smrg			        testcases[i].dst[offset], dst[offset]);
193b4b94579Smrg			ret = 1;
194b4b94579Smrg		    }
195b4b94579Smrg		}
196952204abSmrg	    }
197b4b94579Smrg	}
198b4b94579Smrg    }
199952204abSmrg
200b4b94579Smrg    return ret;
201b4b94579Smrg}
202