fetch-test.c revision 6ba797d6
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{ 116ba797d6Smrg 0, { 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 { 276ba797d6Smrg PIXMAN_a8r8g8b8, 286ba797d6Smrg 2, 2, 296ba797d6Smrg 8, 306ba797d6Smrg { 0x00112233, 0x44556677, 316ba797d6Smrg 0x8899aabb, 0xccddeeff }, 326ba797d6Smrg { 0x00112233, 0x44556677, 336ba797d6Smrg 0x8899aabb, 0xccddeeff }, 346ba797d6Smrg NULL, 35b4b94579Smrg }, 36b4b94579Smrg { 376ba797d6Smrg PIXMAN_r8g8b8a8, 386ba797d6Smrg 2, 2, 396ba797d6Smrg 8, 406ba797d6Smrg { 0x11223300, 0x55667744, 416ba797d6Smrg 0x99aabb88, 0xddeeffcc }, 426ba797d6Smrg { 0x00112233, 0x44556677, 436ba797d6Smrg 0x8899aabb, 0xccddeeff }, 446ba797d6Smrg NULL, 456ba797d6Smrg }, 466ba797d6Smrg { 476ba797d6Smrg PIXMAN_g1, 486ba797d6Smrg 8, 2, 496ba797d6Smrg 4, 50a450e446Smrg#ifdef WORDS_BIGENDIAN 51952204abSmrg { 52952204abSmrg 0xaa000000, 53952204abSmrg 0x55000000 54952204abSmrg }, 55a450e446Smrg#else 56952204abSmrg { 57952204abSmrg 0x00000055, 58952204abSmrg 0x000000aa 59952204abSmrg }, 60a450e446Smrg#endif 61952204abSmrg { 62952204abSmrg 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000, 63952204abSmrg 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff 64952204abSmrg }, 656ba797d6Smrg &mono_palette, 66b4b94579Smrg }, 67b4b94579Smrg#if 0 68b4b94579Smrg { 696ba797d6Smrg PIXMAN_g8, 706ba797d6Smrg 4, 2, 716ba797d6Smrg 4, 726ba797d6Smrg { 0x01234567, 736ba797d6Smrg 0x89abcdef }, 746ba797d6Smrg { 0x00010101, 0x00232323, 0x00454545, 0x00676767, 756ba797d6Smrg 0x00898989, 0x00ababab, 0x00cdcdcd, 0x00efefef, }, 76b4b94579Smrg }, 77b4b94579Smrg#endif 78a450e446Smrg /* FIXME: make this work on big endian */ 79b4b94579Smrg { 806ba797d6Smrg PIXMAN_yv12, 816ba797d6Smrg 8, 2, 826ba797d6Smrg 8, 83a450e446Smrg#ifdef WORDS_BIGENDIAN 84952204abSmrg { 85952204abSmrg 0x00ff00ff, 0x00ff00ff, 86952204abSmrg 0xff00ff00, 0xff00ff00, 87952204abSmrg 0x80ff8000, 88952204abSmrg 0x800080ff 89a450e446Smrg }, 90a450e446Smrg#else 91952204abSmrg { 92952204abSmrg 0xff00ff00, 0xff00ff00, 93952204abSmrg 0x00ff00ff, 0x00ff00ff, 94952204abSmrg 0x0080ff80, 95952204abSmrg 0xff800080 96952204abSmrg }, 97a450e446Smrg#endif 98952204abSmrg { 99952204abSmrg 0xff000000, 0xffffffff, 0xffb80000, 0xffffe113, 100952204abSmrg 0xff000000, 0xffffffff, 0xff0023ee, 0xff4affff, 101952204abSmrg 0xffffffff, 0xff000000, 0xffffe113, 0xffb80000, 102952204abSmrg 0xffffffff, 0xff000000, 0xff4affff, 0xff0023ee, 103b4b94579Smrg }, 104b4b94579Smrg }, 105b4b94579Smrg}; 106b4b94579Smrg 107952204abSmrgint n_test_cases = sizeof(testcases)/sizeof(testcases[0]); 108b4b94579Smrg 109b4b94579Smrg 110b4b94579Smrgstatic uint32_t 111b4b94579Smrgreader (const void *src, int size) 112b4b94579Smrg{ 113b4b94579Smrg switch (size) 114b4b94579Smrg { 115b4b94579Smrg case 1: 116b4b94579Smrg return *(uint8_t *)src; 117b4b94579Smrg case 2: 118b4b94579Smrg return *(uint16_t *)src; 119b4b94579Smrg case 4: 120b4b94579Smrg return *(uint32_t *)src; 121b4b94579Smrg default: 122b4b94579Smrg assert(0); 1236ba797d6Smrg return 0; /* silence MSVC */ 124b4b94579Smrg } 125b4b94579Smrg} 126b4b94579Smrg 127b4b94579Smrg 128b4b94579Smrgstatic void 129b4b94579Smrgwriter (void *src, uint32_t value, int size) 130b4b94579Smrg{ 131b4b94579Smrg switch (size) 132b4b94579Smrg { 133b4b94579Smrg case 1: 134b4b94579Smrg *(uint8_t *)src = value; 135b4b94579Smrg break; 136b4b94579Smrg case 2: 137b4b94579Smrg *(uint16_t *)src = value; 138b4b94579Smrg break; 139b4b94579Smrg case 4: 140b4b94579Smrg *(uint32_t *)src = value; 141b4b94579Smrg break; 142b4b94579Smrg default: 143b4b94579Smrg assert(0); 144b4b94579Smrg } 145b4b94579Smrg} 146b4b94579Smrg 147b4b94579Smrg 148b4b94579Smrgint 149b4b94579Smrgmain (int argc, char **argv) 150b4b94579Smrg{ 151b4b94579Smrg uint32_t dst[SIZE]; 152b4b94579Smrg pixman_image_t *src_img; 153b4b94579Smrg pixman_image_t *dst_img; 154b4b94579Smrg int i, j, x, y; 155b4b94579Smrg int ret = 0; 156b4b94579Smrg 157952204abSmrg for (i = 0; i < n_test_cases; ++i) 158952204abSmrg { 159952204abSmrg for (j = 0; j < 2; ++j) 160952204abSmrg { 161b4b94579Smrg src_img = pixman_image_create_bits (testcases[i].format, 162952204abSmrg testcases[i].width, 163b4b94579Smrg testcases[i].height, 164b4b94579Smrg testcases[i].src, 165b4b94579Smrg testcases[i].stride); 166b4b94579Smrg pixman_image_set_indexed(src_img, testcases[i].indexed); 167b4b94579Smrg 168b4b94579Smrg dst_img = pixman_image_create_bits (PIXMAN_a8r8g8b8, 169952204abSmrg testcases[i].width, 170b4b94579Smrg testcases[i].height, 171b4b94579Smrg dst, 172b4b94579Smrg testcases[i].width*4); 173b4b94579Smrg 174952204abSmrg if (j) 175952204abSmrg { 176b4b94579Smrg pixman_image_set_accessors (src_img, reader, writer); 177b4b94579Smrg pixman_image_set_accessors (dst_img, reader, writer); 178b4b94579Smrg } 179952204abSmrg 180b4b94579Smrg pixman_image_composite (PIXMAN_OP_SRC, src_img, NULL, dst_img, 181b4b94579Smrg 0, 0, 0, 0, 0, 0, testcases[i].width, testcases[i].height); 182b4b94579Smrg 183b4b94579Smrg pixman_image_unref (src_img); 184b4b94579Smrg pixman_image_unref (dst_img); 185b4b94579Smrg 186b4b94579Smrg for (y = 0; y < testcases[i].height; ++y) 187952204abSmrg { 188952204abSmrg for (x = 0; x < testcases[i].width; ++x) 189952204abSmrg { 190952204abSmrg int offset = y * testcases[i].width + x; 191952204abSmrg 192952204abSmrg if (dst[offset] != testcases[i].dst[offset]) 193952204abSmrg { 194b4b94579Smrg printf ("test %i%c: pixel mismatch at (x=%d,y=%d): %08x expected, %08x obtained\n", 195b4b94579Smrg i + 1, 'a' + j, 196952204abSmrg x, y, 197b4b94579Smrg testcases[i].dst[offset], dst[offset]); 198b4b94579Smrg ret = 1; 199b4b94579Smrg } 200b4b94579Smrg } 201952204abSmrg } 202b4b94579Smrg } 203b4b94579Smrg } 204952204abSmrg 205b4b94579Smrg return ret; 206b4b94579Smrg} 207