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