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