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