stress-test.c revision 4f2886e8
16ba797d6Smrg#include <stdio.h> 29ad247e8Sjmcneill#include <stdlib.h> 3953d7d37Smrg#include "utils.h" 46ba797d6Smrg#include <sys/types.h> 5953d7d37Smrg 6953d7d37Smrg#if 0 7953d7d37Smrg#define fence_malloc malloc 8953d7d37Smrg#define fence_free free 9953d7d37Smrg#define make_random_bytes malloc 10953d7d37Smrg#endif 11953d7d37Smrg 12953d7d37Smrgstatic const pixman_format_code_t image_formats[] = 13953d7d37Smrg{ 144f2886e8Smrg PIXMAN_rgba_float, 154f2886e8Smrg PIXMAN_rgb_float, 16953d7d37Smrg PIXMAN_a8r8g8b8, 17953d7d37Smrg PIXMAN_x8r8g8b8, 18953d7d37Smrg PIXMAN_r5g6b5, 19953d7d37Smrg PIXMAN_r3g3b2, 20953d7d37Smrg PIXMAN_a8, 21953d7d37Smrg PIXMAN_a8b8g8r8, 22953d7d37Smrg PIXMAN_x8b8g8r8, 23953d7d37Smrg PIXMAN_b8g8r8a8, 24953d7d37Smrg PIXMAN_b8g8r8x8, 256ba797d6Smrg PIXMAN_r8g8b8a8, 266ba797d6Smrg PIXMAN_r8g8b8x8, 27953d7d37Smrg PIXMAN_x14r6g6b6, 28953d7d37Smrg PIXMAN_r8g8b8, 29953d7d37Smrg PIXMAN_b8g8r8, 309ad247e8Sjmcneill PIXMAN_a8r8g8b8_sRGB, 31953d7d37Smrg PIXMAN_r5g6b5, 32953d7d37Smrg PIXMAN_b5g6r5, 33953d7d37Smrg PIXMAN_x2r10g10b10, 34953d7d37Smrg PIXMAN_a2r10g10b10, 35953d7d37Smrg PIXMAN_x2b10g10r10, 36953d7d37Smrg PIXMAN_a2b10g10r10, 37953d7d37Smrg PIXMAN_a1r5g5b5, 38953d7d37Smrg PIXMAN_x1r5g5b5, 39953d7d37Smrg PIXMAN_a1b5g5r5, 40953d7d37Smrg PIXMAN_x1b5g5r5, 41953d7d37Smrg PIXMAN_a4r4g4b4, 42953d7d37Smrg PIXMAN_x4r4g4b4, 43953d7d37Smrg PIXMAN_a4b4g4r4, 44953d7d37Smrg PIXMAN_x4b4g4r4, 45953d7d37Smrg PIXMAN_a8, 46953d7d37Smrg PIXMAN_r3g3b2, 47953d7d37Smrg PIXMAN_b2g3r3, 48953d7d37Smrg PIXMAN_a2r2g2b2, 49953d7d37Smrg PIXMAN_a2b2g2r2, 50953d7d37Smrg PIXMAN_c8, 51953d7d37Smrg PIXMAN_g8, 52953d7d37Smrg PIXMAN_x4c4, 53953d7d37Smrg PIXMAN_x4g4, 54953d7d37Smrg PIXMAN_c4, 55953d7d37Smrg PIXMAN_g4, 56953d7d37Smrg PIXMAN_g1, 57953d7d37Smrg PIXMAN_x4a4, 58953d7d37Smrg PIXMAN_a4, 59953d7d37Smrg PIXMAN_r1g2b1, 60953d7d37Smrg PIXMAN_b1g2r1, 61953d7d37Smrg PIXMAN_a1r1g1b1, 62953d7d37Smrg PIXMAN_a1b1g1r1, 63953d7d37Smrg PIXMAN_a1 64953d7d37Smrg}; 65953d7d37Smrg 66953d7d37Smrgstatic pixman_filter_t filters[] = 67953d7d37Smrg{ 68953d7d37Smrg PIXMAN_FILTER_NEAREST, 69953d7d37Smrg PIXMAN_FILTER_BILINEAR, 70953d7d37Smrg PIXMAN_FILTER_FAST, 71953d7d37Smrg PIXMAN_FILTER_GOOD, 72953d7d37Smrg PIXMAN_FILTER_BEST, 73953d7d37Smrg PIXMAN_FILTER_CONVOLUTION 74953d7d37Smrg}; 75953d7d37Smrg 76953d7d37Smrgstatic int 77953d7d37Smrgget_size (void) 78953d7d37Smrg{ 79f4f78bb6Smrg switch (prng_rand_n (28)) 80953d7d37Smrg { 81953d7d37Smrg case 0: 82953d7d37Smrg return 1; 83953d7d37Smrg 84953d7d37Smrg case 1: 85953d7d37Smrg return 2; 86953d7d37Smrg 87953d7d37Smrg default: 88953d7d37Smrg case 2: 89f4f78bb6Smrg return prng_rand_n (100); 90953d7d37Smrg 91953d7d37Smrg case 4: 92f4f78bb6Smrg return prng_rand_n (2000) + 1000; 93953d7d37Smrg 94953d7d37Smrg case 5: 95953d7d37Smrg return 65535; 96953d7d37Smrg 97953d7d37Smrg case 6: 98953d7d37Smrg return 65536; 99953d7d37Smrg 100953d7d37Smrg case 7: 101f4f78bb6Smrg return prng_rand_n (64000) + 63000; 102953d7d37Smrg } 103953d7d37Smrg} 104953d7d37Smrg 1054f2886e8Smrgstatic uint32_t 1064f2886e8Smrgreal_reader (const void *src, int size); 1074f2886e8Smrg 1084f2886e8Smrgstatic void *xor_ptr(const void *ptr) 1094f2886e8Smrg{ 1104f2886e8Smrg return (void *)(((intptr_t)ptr) ^ (intptr_t)0x8000000080000000); 1114f2886e8Smrg} 1124f2886e8Smrg 113953d7d37Smrgstatic void 114953d7d37Smrgdestroy (pixman_image_t *image, void *data) 115953d7d37Smrg{ 116953d7d37Smrg if (image->type == BITS && image->bits.free_me != image->bits.bits) 117953d7d37Smrg { 118953d7d37Smrg uint32_t *bits; 119953d7d37Smrg 120953d7d37Smrg if (image->bits.bits != (void *)0x01) 121953d7d37Smrg { 122953d7d37Smrg bits = image->bits.bits; 123953d7d37Smrg 124953d7d37Smrg if (image->bits.rowstride < 0) 125953d7d37Smrg bits -= (- image->bits.rowstride * (image->bits.height - 1)); 126953d7d37Smrg 1274f2886e8Smrg if (image->bits.read_func == real_reader) 1284f2886e8Smrg bits = xor_ptr(bits); 1294f2886e8Smrg 130953d7d37Smrg fence_free (bits); 131953d7d37Smrg } 132953d7d37Smrg } 133953d7d37Smrg 134953d7d37Smrg free (data); 135953d7d37Smrg} 136953d7d37Smrg 137953d7d37Smrgstatic uint32_t 138953d7d37Smrgreal_reader (const void *src, int size) 139953d7d37Smrg{ 1404f2886e8Smrg src = xor_ptr(src); 141953d7d37Smrg switch (size) 142953d7d37Smrg { 143953d7d37Smrg case 1: 144953d7d37Smrg return *(uint8_t *)src; 145953d7d37Smrg case 2: 146953d7d37Smrg return *(uint16_t *)src; 147953d7d37Smrg case 4: 148953d7d37Smrg return *(uint32_t *)src; 149953d7d37Smrg default: 150953d7d37Smrg assert (0); 1516ba797d6Smrg return 0; /* silence MSVC */ 152953d7d37Smrg } 153953d7d37Smrg} 154953d7d37Smrg 155953d7d37Smrgstatic void 156953d7d37Smrgreal_writer (void *src, uint32_t value, int size) 157953d7d37Smrg{ 1584f2886e8Smrg src = xor_ptr(src); 159953d7d37Smrg switch (size) 160953d7d37Smrg { 161953d7d37Smrg case 1: 162953d7d37Smrg *(uint8_t *)src = value; 163953d7d37Smrg break; 164953d7d37Smrg 165953d7d37Smrg case 2: 166953d7d37Smrg *(uint16_t *)src = value; 167953d7d37Smrg break; 168953d7d37Smrg 169953d7d37Smrg case 4: 170953d7d37Smrg *(uint32_t *)src = value; 171953d7d37Smrg break; 172953d7d37Smrg 173953d7d37Smrg default: 174953d7d37Smrg assert (0); 175953d7d37Smrg break; 176953d7d37Smrg } 177953d7d37Smrg} 178953d7d37Smrg 179953d7d37Smrgstatic uint32_t 180953d7d37Smrgfake_reader (const void *src, int size) 181953d7d37Smrg{ 182f4f78bb6Smrg uint32_t r = prng_rand (); 183953d7d37Smrg 184953d7d37Smrg assert (size == 1 || size == 2 || size == 4); 1859ad247e8Sjmcneill 1869ad247e8Sjmcneill return r >> (32 - (size * 8)); 187953d7d37Smrg} 188953d7d37Smrg 189953d7d37Smrgstatic void 190953d7d37Smrgfake_writer (void *src, uint32_t value, int size) 191953d7d37Smrg{ 192953d7d37Smrg assert (size == 1 || size == 2 || size == 4); 193953d7d37Smrg} 194953d7d37Smrg 195953d7d37Smrgstatic int32_t 196953d7d37Smrglog_rand (void) 197953d7d37Smrg{ 198953d7d37Smrg uint32_t mask; 199953d7d37Smrg 200f4f78bb6Smrg mask = (1 << prng_rand_n (10)) - 1; 2019ad247e8Sjmcneill 202f4f78bb6Smrg return (prng_rand () & mask) - (mask >> 1); 2039ad247e8Sjmcneill} 204953d7d37Smrg 2059ad247e8Sjmcneillstatic int32_t 2069ad247e8Sjmcneillrand_x (pixman_image_t *image) 2079ad247e8Sjmcneill{ 2089ad247e8Sjmcneill if (image->type == BITS) 209f4f78bb6Smrg return prng_rand_n (image->bits.width); 2109ad247e8Sjmcneill else 2119ad247e8Sjmcneill return log_rand (); 2129ad247e8Sjmcneill} 2139ad247e8Sjmcneill 2149ad247e8Sjmcneillstatic int32_t 2159ad247e8Sjmcneillrand_y (pixman_image_t *image) 2169ad247e8Sjmcneill{ 2179ad247e8Sjmcneill if (image->type == BITS) 218f4f78bb6Smrg return prng_rand_n (image->bits.height); 2199ad247e8Sjmcneill else 2209ad247e8Sjmcneill return log_rand (); 221953d7d37Smrg} 222953d7d37Smrg 223f4f78bb6Smrgtypedef enum 224f4f78bb6Smrg{ 225f4f78bb6Smrg DONT_CARE, 226f4f78bb6Smrg PREFER_ALPHA, 227f4f78bb6Smrg REQUIRE_ALPHA 228f4f78bb6Smrg} alpha_preference_t; 229f4f78bb6Smrg 230f4f78bb6Smrgstatic pixman_format_code_t 231f4f78bb6Smrgrandom_format (alpha_preference_t alpha) 232f4f78bb6Smrg{ 233f4f78bb6Smrg pixman_format_code_t format; 234f4f78bb6Smrg int n = prng_rand_n (ARRAY_LENGTH (image_formats)); 235f4f78bb6Smrg 236f4f78bb6Smrg if (alpha >= PREFER_ALPHA && 237f4f78bb6Smrg (alpha == REQUIRE_ALPHA || prng_rand_n (4) != 0)) 238f4f78bb6Smrg { 239f4f78bb6Smrg do 240f4f78bb6Smrg { 241f4f78bb6Smrg format = image_formats[n++ % ARRAY_LENGTH (image_formats)]; 242f4f78bb6Smrg } while (PIXMAN_FORMAT_TYPE (format) != PIXMAN_TYPE_A); 243f4f78bb6Smrg } 244f4f78bb6Smrg else 245f4f78bb6Smrg { 246f4f78bb6Smrg format = image_formats[n]; 247f4f78bb6Smrg } 248f4f78bb6Smrg 249f4f78bb6Smrg return format; 250f4f78bb6Smrg} 251f4f78bb6Smrg 252953d7d37Smrgstatic pixman_image_t * 253f4f78bb6Smrgcreate_random_bits_image (alpha_preference_t alpha_preference) 254953d7d37Smrg{ 255953d7d37Smrg pixman_format_code_t format; 256953d7d37Smrg pixman_indexed_t *indexed; 257953d7d37Smrg pixman_image_t *image; 258953d7d37Smrg int width, height, stride; 259953d7d37Smrg uint32_t *bits; 260953d7d37Smrg pixman_read_memory_func_t read_func = NULL; 261953d7d37Smrg pixman_write_memory_func_t write_func = NULL; 262953d7d37Smrg pixman_filter_t filter; 263953d7d37Smrg pixman_fixed_t *coefficients = NULL; 264953d7d37Smrg int n_coefficients = 0; 2654f2886e8Smrg int align_add, align_mask; 266953d7d37Smrg 267953d7d37Smrg /* format */ 268f4f78bb6Smrg format = random_format (alpha_preference); 2694f2886e8Smrg switch (PIXMAN_FORMAT_BPP (format)) { 2704f2886e8Smrg case 128: 2714f2886e8Smrg align_mask = 15; 2724f2886e8Smrg align_add = align_mask + prng_rand_n (65); 2734f2886e8Smrg break; 2744f2886e8Smrg default: 2754f2886e8Smrg align_mask = 3; 2764f2886e8Smrg align_add = align_mask + prng_rand_n (17); 2774f2886e8Smrg break; 2784f2886e8Smrg } 279953d7d37Smrg 280953d7d37Smrg indexed = NULL; 281953d7d37Smrg if (PIXMAN_FORMAT_TYPE (format) == PIXMAN_TYPE_COLOR) 282953d7d37Smrg { 283953d7d37Smrg indexed = malloc (sizeof (pixman_indexed_t)); 284953d7d37Smrg 285953d7d37Smrg initialize_palette (indexed, PIXMAN_FORMAT_BPP (format), TRUE); 286953d7d37Smrg } 287953d7d37Smrg else if (PIXMAN_FORMAT_TYPE (format) == PIXMAN_TYPE_GRAY) 288953d7d37Smrg { 289953d7d37Smrg indexed = malloc (sizeof (pixman_indexed_t)); 290953d7d37Smrg 291953d7d37Smrg initialize_palette (indexed, PIXMAN_FORMAT_BPP (format), FALSE); 292953d7d37Smrg } 293953d7d37Smrg else 294953d7d37Smrg { 295953d7d37Smrg indexed = NULL; 296953d7d37Smrg } 297953d7d37Smrg 298953d7d37Smrg /* size */ 299953d7d37Smrg width = get_size (); 300953d7d37Smrg height = get_size (); 301953d7d37Smrg 3029ad247e8Sjmcneill while ((uint64_t)width * height > 200000) 303953d7d37Smrg { 304f4f78bb6Smrg if (prng_rand_n(2) == 0) 305953d7d37Smrg height = 200000 / width; 306953d7d37Smrg else 307953d7d37Smrg width = 200000 / height; 308953d7d37Smrg } 309953d7d37Smrg 310953d7d37Smrg if (height == 0) 311953d7d37Smrg height = 1; 312953d7d37Smrg if (width == 0) 313953d7d37Smrg width = 1; 314953d7d37Smrg 315953d7d37Smrg /* bits */ 316f4f78bb6Smrg switch (prng_rand_n (7)) 317953d7d37Smrg { 318953d7d37Smrg default: 319953d7d37Smrg case 0: 3204f2886e8Smrg stride = (width * PIXMAN_FORMAT_BPP (format) + 7) / 8; 3214f2886e8Smrg stride = (stride + align_add) & (~align_mask); 3224f2886e8Smrg if (format == PIXMAN_rgb_float || format == PIXMAN_rgba_float) 3234f2886e8Smrg bits = (uint32_t *)make_random_floats (height * stride); 3244f2886e8Smrg else 3254f2886e8Smrg bits = (uint32_t *)make_random_bytes (height * stride); 326953d7d37Smrg break; 327953d7d37Smrg 328953d7d37Smrg case 1: 329953d7d37Smrg stride = 0; 330953d7d37Smrg bits = NULL; 331953d7d37Smrg break; 332953d7d37Smrg 333953d7d37Smrg case 2: /* Zero-filled */ 3344f2886e8Smrg stride = (width * PIXMAN_FORMAT_BPP (format) + 7) / 8; 3354f2886e8Smrg stride = (stride + align_add) & (~align_mask); 336953d7d37Smrg bits = fence_malloc (height * stride); 337953d7d37Smrg if (!bits) 338953d7d37Smrg return NULL; 339953d7d37Smrg memset (bits, 0, height * stride); 340953d7d37Smrg break; 341953d7d37Smrg 342953d7d37Smrg case 3: /* Filled with 0xFF */ 3434f2886e8Smrg stride = (width * PIXMAN_FORMAT_BPP (format) + 7) / 8; 3444f2886e8Smrg stride = (stride + align_add) & (~align_mask); 345953d7d37Smrg bits = fence_malloc (height * stride); 346953d7d37Smrg if (!bits) 347953d7d37Smrg return NULL; 348953d7d37Smrg memset (bits, 0xff, height * stride); 349953d7d37Smrg break; 350953d7d37Smrg 351953d7d37Smrg case 4: /* bits is a bad pointer, has read/write functions */ 3524f2886e8Smrg if (PIXMAN_FORMAT_BPP (format) <= 32) { 3534f2886e8Smrg stride = 232; 3544f2886e8Smrg bits = (void *)0x01; 3554f2886e8Smrg read_func = fake_reader; 3564f2886e8Smrg write_func = fake_writer; 3574f2886e8Smrg break; 3584f2886e8Smrg } 359953d7d37Smrg 360953d7d37Smrg case 5: /* bits is a real pointer, has read/write functions */ 3614f2886e8Smrg stride = (width * PIXMAN_FORMAT_BPP (format) + 7) / 8; 3624f2886e8Smrg stride = (stride + align_add) & (~align_mask); 363953d7d37Smrg bits = fence_malloc (height * stride); 364953d7d37Smrg if (!bits) 365953d7d37Smrg return NULL; 366953d7d37Smrg memset (bits, 0xff, height * stride); 3674f2886e8Smrg if (PIXMAN_FORMAT_BPP (format) <= 32) { 3684f2886e8Smrg bits = xor_ptr(bits); 3694f2886e8Smrg read_func = real_reader; 3704f2886e8Smrg write_func = real_writer; 3714f2886e8Smrg } 372953d7d37Smrg break; 373953d7d37Smrg 374953d7d37Smrg case 6: /* bits is a real pointer, stride is negative */ 3754f2886e8Smrg stride = (width * PIXMAN_FORMAT_BPP (format) + 7) / 8; 3764f2886e8Smrg stride = (stride + align_add) & (~align_mask); 3774f2886e8Smrg if (format == PIXMAN_rgb_float || format == PIXMAN_rgba_float) 3784f2886e8Smrg bits = (uint32_t *)make_random_floats (height * stride); 3794f2886e8Smrg else 3804f2886e8Smrg bits = (uint32_t *)make_random_bytes (height * stride); 381953d7d37Smrg if (!bits) 382953d7d37Smrg return NULL; 383953d7d37Smrg bits += ((height - 1) * stride) / 4; 384953d7d37Smrg stride = - stride; 385953d7d37Smrg break; 386953d7d37Smrg } 387953d7d37Smrg 388953d7d37Smrg /* Filter */ 389f4f78bb6Smrg filter = filters[prng_rand_n (ARRAY_LENGTH (filters))]; 390953d7d37Smrg if (filter == PIXMAN_FILTER_CONVOLUTION) 391953d7d37Smrg { 392f4f78bb6Smrg int width = prng_rand_n (3); 393f4f78bb6Smrg int height = prng_rand_n (4); 394953d7d37Smrg 395953d7d37Smrg n_coefficients = width * height + 2; 396953d7d37Smrg coefficients = malloc (n_coefficients * sizeof (pixman_fixed_t)); 397953d7d37Smrg 398953d7d37Smrg if (coefficients) 399953d7d37Smrg { 400953d7d37Smrg int i; 401953d7d37Smrg 402953d7d37Smrg for (i = 0; i < width * height; ++i) 403f4f78bb6Smrg coefficients[i + 2] = prng_rand(); 404953d7d37Smrg 405953d7d37Smrg coefficients[0] = width << 16; 406953d7d37Smrg coefficients[1] = height << 16; 407953d7d37Smrg } 408953d7d37Smrg else 409953d7d37Smrg { 410953d7d37Smrg filter = PIXMAN_FILTER_BEST; 411953d7d37Smrg } 412953d7d37Smrg } 413953d7d37Smrg 414953d7d37Smrg /* Finally create the image */ 415953d7d37Smrg image = pixman_image_create_bits (format, width, height, bits, stride); 416953d7d37Smrg if (!image) 417953d7d37Smrg return NULL; 418953d7d37Smrg 419953d7d37Smrg pixman_image_set_indexed (image, indexed); 420953d7d37Smrg pixman_image_set_destroy_function (image, destroy, indexed); 421953d7d37Smrg pixman_image_set_accessors (image, read_func, write_func); 422953d7d37Smrg pixman_image_set_filter (image, filter, coefficients, n_coefficients); 423953d7d37Smrg 424953d7d37Smrg return image; 425953d7d37Smrg} 426953d7d37Smrg 427953d7d37Smrgstatic pixman_repeat_t repeats[] = 428953d7d37Smrg{ 429953d7d37Smrg PIXMAN_REPEAT_NONE, 430953d7d37Smrg PIXMAN_REPEAT_NORMAL, 431953d7d37Smrg PIXMAN_REPEAT_REFLECT, 432953d7d37Smrg PIXMAN_REPEAT_PAD 433953d7d37Smrg}; 434953d7d37Smrg 435953d7d37Smrgstatic uint32_t 436953d7d37Smrgabsolute (int32_t i) 437953d7d37Smrg{ 438953d7d37Smrg return i < 0? -i : i; 439953d7d37Smrg} 440953d7d37Smrg 441953d7d37Smrgstatic void 442953d7d37Smrgset_general_properties (pixman_image_t *image, pixman_bool_t allow_alpha_map) 443953d7d37Smrg{ 444953d7d37Smrg pixman_repeat_t repeat; 445953d7d37Smrg 446953d7d37Smrg /* Set properties that are generic to all images */ 447953d7d37Smrg 448953d7d37Smrg /* Repeat */ 449f4f78bb6Smrg repeat = repeats[prng_rand_n (ARRAY_LENGTH (repeats))]; 450953d7d37Smrg pixman_image_set_repeat (image, repeat); 451953d7d37Smrg 452953d7d37Smrg /* Alpha map */ 453f4f78bb6Smrg if (allow_alpha_map && prng_rand_n (4) == 0) 454953d7d37Smrg { 455953d7d37Smrg pixman_image_t *alpha_map; 456953d7d37Smrg int16_t x, y; 457953d7d37Smrg 458f4f78bb6Smrg alpha_map = create_random_bits_image (DONT_CARE); 459953d7d37Smrg 460953d7d37Smrg if (alpha_map) 461953d7d37Smrg { 462953d7d37Smrg set_general_properties (alpha_map, FALSE); 463953d7d37Smrg 4649ad247e8Sjmcneill x = rand_x (image) - image->bits.width / 2; 4659ad247e8Sjmcneill y = rand_y (image) - image->bits.height / 2; 466953d7d37Smrg 467953d7d37Smrg pixman_image_set_alpha_map (image, alpha_map, x, y); 468953d7d37Smrg 469953d7d37Smrg pixman_image_unref (alpha_map); 470953d7d37Smrg } 471953d7d37Smrg } 472953d7d37Smrg 473953d7d37Smrg /* Component alpha */ 474f4f78bb6Smrg pixman_image_set_component_alpha (image, prng_rand_n (3) == 0); 475953d7d37Smrg 476953d7d37Smrg /* Clip region */ 477f4f78bb6Smrg if (prng_rand_n (8) < 2) 478953d7d37Smrg { 479953d7d37Smrg pixman_region32_t region; 480953d7d37Smrg int i, n_rects; 481953d7d37Smrg 482953d7d37Smrg pixman_region32_init (®ion); 483953d7d37Smrg 484f4f78bb6Smrg switch (prng_rand_n (12)) 485953d7d37Smrg { 486953d7d37Smrg case 0: 487953d7d37Smrg n_rects = 0; 488953d7d37Smrg break; 489953d7d37Smrg 490953d7d37Smrg case 1: case 2: case 3: 491953d7d37Smrg n_rects = 1; 492953d7d37Smrg break; 493953d7d37Smrg 494953d7d37Smrg case 4: case 5: 495953d7d37Smrg n_rects = 2; 496953d7d37Smrg break; 497953d7d37Smrg 498953d7d37Smrg case 6: case 7: 499953d7d37Smrg n_rects = 3; 5009ad247e8Sjmcneill break; 501953d7d37Smrg 502953d7d37Smrg default: 503f4f78bb6Smrg n_rects = prng_rand_n (100); 504953d7d37Smrg break; 505953d7d37Smrg } 506953d7d37Smrg 507953d7d37Smrg for (i = 0; i < n_rects; ++i) 508953d7d37Smrg { 509953d7d37Smrg uint32_t width, height; 510953d7d37Smrg int x, y; 511953d7d37Smrg 512953d7d37Smrg x = log_rand(); 513953d7d37Smrg y = log_rand(); 514953d7d37Smrg width = absolute (log_rand ()) + 1; 515953d7d37Smrg height = absolute (log_rand ()) + 1; 516953d7d37Smrg 517953d7d37Smrg pixman_region32_union_rect ( 518953d7d37Smrg ®ion, ®ion, x, y, width, height); 519953d7d37Smrg } 520953d7d37Smrg 521f4f78bb6Smrg if (image->type == BITS && prng_rand_n (8) != 0) 5229ad247e8Sjmcneill { 5239ad247e8Sjmcneill uint32_t width, height; 5249ad247e8Sjmcneill int x, y; 5259ad247e8Sjmcneill int i; 5269ad247e8Sjmcneill 5279ad247e8Sjmcneill /* Also add a couple of clip rectangles inside the image 5289ad247e8Sjmcneill * so that compositing will actually take place. 5299ad247e8Sjmcneill */ 5309ad247e8Sjmcneill for (i = 0; i < 5; ++i) 5319ad247e8Sjmcneill { 532f4f78bb6Smrg x = prng_rand_n (2 * image->bits.width) - image->bits.width; 533f4f78bb6Smrg y = prng_rand_n (2 * image->bits.height) - image->bits.height; 534f4f78bb6Smrg width = prng_rand_n (image->bits.width) - x + 10; 535f4f78bb6Smrg height = prng_rand_n (image->bits.height) - y + 10; 5369ad247e8Sjmcneill 5379ad247e8Sjmcneill if (width + x < x) 5389ad247e8Sjmcneill width = INT32_MAX - x; 5399ad247e8Sjmcneill if (height + y < y) 5409ad247e8Sjmcneill height = INT32_MAX - y; 541f4f78bb6Smrg 5429ad247e8Sjmcneill pixman_region32_union_rect ( 5439ad247e8Sjmcneill ®ion, ®ion, x, y, width, height); 5449ad247e8Sjmcneill } 5459ad247e8Sjmcneill } 5469ad247e8Sjmcneill 547953d7d37Smrg pixman_image_set_clip_region32 (image, ®ion); 548953d7d37Smrg 549953d7d37Smrg pixman_region32_fini (®ion); 550953d7d37Smrg } 551953d7d37Smrg 552953d7d37Smrg /* Whether source clipping is enabled */ 553f4f78bb6Smrg pixman_image_set_source_clipping (image, !!prng_rand_n (2)); 554953d7d37Smrg 555953d7d37Smrg /* Client clip */ 556f4f78bb6Smrg pixman_image_set_has_client_clip (image, !!prng_rand_n (2)); 557953d7d37Smrg 558953d7d37Smrg /* Transform */ 559f4f78bb6Smrg if (prng_rand_n (5) < 2) 560953d7d37Smrg { 561953d7d37Smrg pixman_transform_t xform; 562953d7d37Smrg int i, j, k; 563953d7d37Smrg uint32_t tx, ty, sx, sy; 564953d7d37Smrg uint32_t c, s; 565953d7d37Smrg 566953d7d37Smrg memset (&xform, 0, sizeof xform); 567953d7d37Smrg xform.matrix[0][0] = pixman_fixed_1; 568953d7d37Smrg xform.matrix[1][1] = pixman_fixed_1; 569953d7d37Smrg xform.matrix[2][2] = pixman_fixed_1; 570953d7d37Smrg 571953d7d37Smrg for (k = 0; k < 3; ++k) 572953d7d37Smrg { 573f4f78bb6Smrg switch (prng_rand_n (4)) 574953d7d37Smrg { 575953d7d37Smrg case 0: 576953d7d37Smrg /* rotation */ 577f4f78bb6Smrg c = prng_rand_n (2 * 65536) - 65536; 578f4f78bb6Smrg s = prng_rand_n (2 * 65536) - 65536; 579953d7d37Smrg pixman_transform_rotate (&xform, NULL, c, s); 580953d7d37Smrg break; 581953d7d37Smrg 582953d7d37Smrg case 1: 583953d7d37Smrg /* translation */ 584f4f78bb6Smrg tx = prng_rand(); 585f4f78bb6Smrg ty = prng_rand(); 586953d7d37Smrg pixman_transform_translate (&xform, NULL, tx, ty); 587953d7d37Smrg break; 588953d7d37Smrg 589953d7d37Smrg case 2: 590953d7d37Smrg /* scale */ 591f4f78bb6Smrg sx = prng_rand(); 592f4f78bb6Smrg sy = prng_rand(); 593953d7d37Smrg pixman_transform_scale (&xform, NULL, sx, sy); 594953d7d37Smrg break; 595953d7d37Smrg 596953d7d37Smrg case 3: 597f4f78bb6Smrg if (prng_rand_n (16) == 0) 598953d7d37Smrg { 599953d7d37Smrg /* random */ 600953d7d37Smrg for (i = 0; i < 3; ++i) 601953d7d37Smrg for (j = 0; j < 3; ++j) 602f4f78bb6Smrg xform.matrix[i][j] = prng_rand(); 603953d7d37Smrg break; 604953d7d37Smrg } 605f4f78bb6Smrg else if (prng_rand_n (16) == 0) 606953d7d37Smrg { 607953d7d37Smrg /* zero */ 608953d7d37Smrg memset (&xform, 0, sizeof xform); 609953d7d37Smrg } 610953d7d37Smrg break; 611953d7d37Smrg } 612953d7d37Smrg } 613953d7d37Smrg 614953d7d37Smrg pixman_image_set_transform (image, &xform); 615953d7d37Smrg } 616953d7d37Smrg} 617953d7d37Smrg 618953d7d37Smrgstatic pixman_color_t 619953d7d37Smrgrandom_color (void) 620953d7d37Smrg{ 621953d7d37Smrg pixman_color_t color = 622953d7d37Smrg { 623f4f78bb6Smrg prng_rand() & 0xffff, 624f4f78bb6Smrg prng_rand() & 0xffff, 625f4f78bb6Smrg prng_rand() & 0xffff, 626f4f78bb6Smrg prng_rand() & 0xffff, 627953d7d37Smrg }; 628953d7d37Smrg 629953d7d37Smrg return color; 630953d7d37Smrg} 631953d7d37Smrg 632953d7d37Smrg 633953d7d37Smrgstatic pixman_image_t * 634953d7d37Smrgcreate_random_solid_image (void) 635953d7d37Smrg{ 636953d7d37Smrg pixman_color_t color = random_color(); 637953d7d37Smrg pixman_image_t *image = pixman_image_create_solid_fill (&color); 638953d7d37Smrg 639953d7d37Smrg return image; 640953d7d37Smrg} 641953d7d37Smrg 642953d7d37Smrgstatic pixman_gradient_stop_t * 643953d7d37Smrgcreate_random_stops (int *n_stops) 644953d7d37Smrg{ 645953d7d37Smrg pixman_fixed_t step; 646953d7d37Smrg pixman_fixed_t s; 647953d7d37Smrg int i; 648953d7d37Smrg pixman_gradient_stop_t *stops; 649953d7d37Smrg 650f4f78bb6Smrg *n_stops = prng_rand_n (50) + 1; 651953d7d37Smrg 652953d7d37Smrg step = pixman_fixed_1 / *n_stops; 653953d7d37Smrg 654953d7d37Smrg stops = malloc (*n_stops * sizeof (pixman_gradient_stop_t)); 655953d7d37Smrg 656953d7d37Smrg s = 0; 657953d7d37Smrg for (i = 0; i < (*n_stops) - 1; ++i) 658953d7d37Smrg { 659953d7d37Smrg stops[i].x = s; 660953d7d37Smrg stops[i].color = random_color(); 661953d7d37Smrg 662953d7d37Smrg s += step; 663953d7d37Smrg } 664953d7d37Smrg 665953d7d37Smrg stops[*n_stops - 1].x = pixman_fixed_1; 666953d7d37Smrg stops[*n_stops - 1].color = random_color(); 667953d7d37Smrg 668953d7d37Smrg return stops; 669953d7d37Smrg} 670953d7d37Smrg 671953d7d37Smrgstatic pixman_point_fixed_t 672953d7d37Smrgcreate_random_point (void) 673953d7d37Smrg{ 674953d7d37Smrg pixman_point_fixed_t p; 675953d7d37Smrg 676953d7d37Smrg p.x = log_rand (); 677953d7d37Smrg p.y = log_rand (); 678953d7d37Smrg 679953d7d37Smrg return p; 680953d7d37Smrg} 681953d7d37Smrg 682953d7d37Smrgstatic pixman_image_t * 683953d7d37Smrgcreate_random_linear_image (void) 684953d7d37Smrg{ 685953d7d37Smrg int n_stops; 686953d7d37Smrg pixman_gradient_stop_t *stops; 687953d7d37Smrg pixman_point_fixed_t p1, p2; 688953d7d37Smrg pixman_image_t *result; 689953d7d37Smrg 690953d7d37Smrg stops = create_random_stops (&n_stops); 691953d7d37Smrg if (!stops) 692953d7d37Smrg return NULL; 693953d7d37Smrg 694953d7d37Smrg p1 = create_random_point (); 695953d7d37Smrg p2 = create_random_point (); 696953d7d37Smrg 697953d7d37Smrg result = pixman_image_create_linear_gradient (&p1, &p2, stops, n_stops); 698953d7d37Smrg 699953d7d37Smrg free (stops); 700953d7d37Smrg 701953d7d37Smrg return result; 702953d7d37Smrg} 703953d7d37Smrg 704953d7d37Smrgstatic pixman_image_t * 705953d7d37Smrgcreate_random_radial_image (void) 706953d7d37Smrg{ 707953d7d37Smrg int n_stops; 708953d7d37Smrg pixman_gradient_stop_t *stops; 709953d7d37Smrg pixman_point_fixed_t inner_c, outer_c; 710953d7d37Smrg pixman_fixed_t inner_r, outer_r; 711953d7d37Smrg pixman_image_t *result; 712953d7d37Smrg 713953d7d37Smrg inner_c = create_random_point(); 714953d7d37Smrg outer_c = create_random_point(); 715f4f78bb6Smrg inner_r = prng_rand(); 716f4f78bb6Smrg outer_r = prng_rand(); 717953d7d37Smrg 718953d7d37Smrg stops = create_random_stops (&n_stops); 719953d7d37Smrg 720953d7d37Smrg if (!stops) 721953d7d37Smrg return NULL; 722953d7d37Smrg 723953d7d37Smrg result = pixman_image_create_radial_gradient ( 724953d7d37Smrg &inner_c, &outer_c, inner_r, outer_r, stops, n_stops); 725953d7d37Smrg 726953d7d37Smrg free (stops); 727953d7d37Smrg 728953d7d37Smrg return result; 729953d7d37Smrg} 730953d7d37Smrg 731953d7d37Smrgstatic pixman_image_t * 732953d7d37Smrgcreate_random_conical_image (void) 733953d7d37Smrg{ 734953d7d37Smrg pixman_gradient_stop_t *stops; 735953d7d37Smrg int n_stops; 736953d7d37Smrg pixman_point_fixed_t c; 737953d7d37Smrg pixman_fixed_t angle; 738953d7d37Smrg pixman_image_t *result; 739953d7d37Smrg 740953d7d37Smrg c = create_random_point(); 741f4f78bb6Smrg angle = prng_rand(); 742953d7d37Smrg 743953d7d37Smrg stops = create_random_stops (&n_stops); 744953d7d37Smrg 745953d7d37Smrg if (!stops) 746953d7d37Smrg return NULL; 747953d7d37Smrg 748953d7d37Smrg result = pixman_image_create_conical_gradient (&c, angle, stops, n_stops); 749953d7d37Smrg 750953d7d37Smrg free (stops); 751953d7d37Smrg 752953d7d37Smrg return result; 753953d7d37Smrg} 754953d7d37Smrg 755953d7d37Smrgstatic pixman_image_t * 756953d7d37Smrgcreate_random_image (void) 757953d7d37Smrg{ 758953d7d37Smrg pixman_image_t *result; 759953d7d37Smrg 760f4f78bb6Smrg switch (prng_rand_n (5)) 761953d7d37Smrg { 762953d7d37Smrg default: 763953d7d37Smrg case 0: 764f4f78bb6Smrg result = create_random_bits_image (DONT_CARE); 765953d7d37Smrg break; 766953d7d37Smrg 767953d7d37Smrg case 1: 768953d7d37Smrg result = create_random_solid_image (); 769953d7d37Smrg break; 770953d7d37Smrg 771953d7d37Smrg case 2: 772953d7d37Smrg result = create_random_linear_image (); 773953d7d37Smrg break; 774953d7d37Smrg 775953d7d37Smrg case 3: 776953d7d37Smrg result = create_random_radial_image (); 777953d7d37Smrg break; 778953d7d37Smrg 779953d7d37Smrg case 4: 780953d7d37Smrg result = create_random_conical_image (); 781953d7d37Smrg break; 782953d7d37Smrg } 783953d7d37Smrg 784953d7d37Smrg if (result) 785953d7d37Smrg set_general_properties (result, TRUE); 786953d7d37Smrg 787953d7d37Smrg return result; 788953d7d37Smrg} 789953d7d37Smrg 790f4f78bb6Smrgstatic void 791f4f78bb6Smrgrandom_line (pixman_line_fixed_t *line, int width, int height) 792f4f78bb6Smrg{ 793f4f78bb6Smrg line->p1.x = prng_rand_n (width) << 16; 794f4f78bb6Smrg line->p1.y = prng_rand_n (height) << 16; 795f4f78bb6Smrg line->p2.x = prng_rand_n (width) << 16; 796f4f78bb6Smrg line->p2.y = prng_rand_n (height) << 16; 797f4f78bb6Smrg} 798f4f78bb6Smrg 799f4f78bb6Smrgstatic pixman_trapezoid_t * 800f4f78bb6Smrgcreate_random_trapezoids (int *n_traps, int height, int width) 801f4f78bb6Smrg{ 802f4f78bb6Smrg pixman_trapezoid_t *trapezoids; 803f4f78bb6Smrg int i; 804f4f78bb6Smrg 805f4f78bb6Smrg *n_traps = prng_rand_n (16) + 1; 806f4f78bb6Smrg 807f4f78bb6Smrg trapezoids = malloc (sizeof (pixman_trapezoid_t) * *n_traps); 808f4f78bb6Smrg 809f4f78bb6Smrg for (i = 0; i < *n_traps; ++i) 810f4f78bb6Smrg { 811f4f78bb6Smrg pixman_trapezoid_t *t = &(trapezoids[i]); 812f4f78bb6Smrg 813f4f78bb6Smrg t->top = prng_rand_n (height) << 16; 814f4f78bb6Smrg t->bottom = prng_rand_n (height) << 16; 815f4f78bb6Smrg 816f4f78bb6Smrg random_line (&t->left, height, width); 817f4f78bb6Smrg random_line (&t->right, height, width); 818f4f78bb6Smrg } 819f4f78bb6Smrg 820f4f78bb6Smrg return trapezoids; 821f4f78bb6Smrg} 822f4f78bb6Smrg 823953d7d37Smrgstatic const pixman_op_t op_list[] = 824953d7d37Smrg{ 825953d7d37Smrg PIXMAN_OP_SRC, 826953d7d37Smrg PIXMAN_OP_OVER, 827953d7d37Smrg PIXMAN_OP_ADD, 828953d7d37Smrg PIXMAN_OP_CLEAR, 829953d7d37Smrg PIXMAN_OP_SRC, 830953d7d37Smrg PIXMAN_OP_DST, 831953d7d37Smrg PIXMAN_OP_OVER, 832953d7d37Smrg PIXMAN_OP_OVER_REVERSE, 833953d7d37Smrg PIXMAN_OP_IN, 834953d7d37Smrg PIXMAN_OP_IN_REVERSE, 835953d7d37Smrg PIXMAN_OP_OUT, 836953d7d37Smrg PIXMAN_OP_OUT_REVERSE, 837953d7d37Smrg PIXMAN_OP_ATOP, 838953d7d37Smrg PIXMAN_OP_ATOP_REVERSE, 839953d7d37Smrg PIXMAN_OP_XOR, 840953d7d37Smrg PIXMAN_OP_ADD, 841953d7d37Smrg PIXMAN_OP_SATURATE, 842953d7d37Smrg PIXMAN_OP_DISJOINT_CLEAR, 843953d7d37Smrg PIXMAN_OP_DISJOINT_SRC, 844953d7d37Smrg PIXMAN_OP_DISJOINT_DST, 845953d7d37Smrg PIXMAN_OP_DISJOINT_OVER, 846953d7d37Smrg PIXMAN_OP_DISJOINT_OVER_REVERSE, 847953d7d37Smrg PIXMAN_OP_DISJOINT_IN, 848953d7d37Smrg PIXMAN_OP_DISJOINT_IN_REVERSE, 849953d7d37Smrg PIXMAN_OP_DISJOINT_OUT, 850953d7d37Smrg PIXMAN_OP_DISJOINT_OUT_REVERSE, 851953d7d37Smrg PIXMAN_OP_DISJOINT_ATOP, 852953d7d37Smrg PIXMAN_OP_DISJOINT_ATOP_REVERSE, 853953d7d37Smrg PIXMAN_OP_DISJOINT_XOR, 854953d7d37Smrg PIXMAN_OP_CONJOINT_CLEAR, 855953d7d37Smrg PIXMAN_OP_CONJOINT_SRC, 856953d7d37Smrg PIXMAN_OP_CONJOINT_DST, 857953d7d37Smrg PIXMAN_OP_CONJOINT_OVER, 858953d7d37Smrg PIXMAN_OP_CONJOINT_OVER_REVERSE, 859953d7d37Smrg PIXMAN_OP_CONJOINT_IN, 860953d7d37Smrg PIXMAN_OP_CONJOINT_IN_REVERSE, 861953d7d37Smrg PIXMAN_OP_CONJOINT_OUT, 862953d7d37Smrg PIXMAN_OP_CONJOINT_OUT_REVERSE, 863953d7d37Smrg PIXMAN_OP_CONJOINT_ATOP, 864953d7d37Smrg PIXMAN_OP_CONJOINT_ATOP_REVERSE, 865953d7d37Smrg PIXMAN_OP_CONJOINT_XOR, 866953d7d37Smrg PIXMAN_OP_MULTIPLY, 867953d7d37Smrg PIXMAN_OP_SCREEN, 868953d7d37Smrg PIXMAN_OP_OVERLAY, 869953d7d37Smrg PIXMAN_OP_DARKEN, 870953d7d37Smrg PIXMAN_OP_LIGHTEN, 871953d7d37Smrg PIXMAN_OP_COLOR_DODGE, 872953d7d37Smrg PIXMAN_OP_COLOR_BURN, 873953d7d37Smrg PIXMAN_OP_HARD_LIGHT, 874953d7d37Smrg PIXMAN_OP_DIFFERENCE, 875953d7d37Smrg PIXMAN_OP_EXCLUSION, 876953d7d37Smrg PIXMAN_OP_SOFT_LIGHT, 877953d7d37Smrg PIXMAN_OP_HSL_HUE, 878953d7d37Smrg PIXMAN_OP_HSL_SATURATION, 879953d7d37Smrg PIXMAN_OP_HSL_COLOR, 880953d7d37Smrg PIXMAN_OP_HSL_LUMINOSITY, 881953d7d37Smrg}; 882953d7d37Smrg 883953d7d37Smrgstatic void 8846ba797d6Smrgrun_test (uint32_t seed, pixman_bool_t verbose, uint32_t mod) 885953d7d37Smrg{ 886953d7d37Smrg pixman_image_t *source, *mask, *dest; 887953d7d37Smrg pixman_op_t op; 888953d7d37Smrg 8896ba797d6Smrg if (verbose) 8906ba797d6Smrg { 8916ba797d6Smrg if (mod == 0 || (seed % mod) == 0) 8926ba797d6Smrg printf ("Seed 0x%08x\n", seed); 8936ba797d6Smrg } 894953d7d37Smrg 895f4f78bb6Smrg source = mask = dest = NULL; 896953d7d37Smrg 897f4f78bb6Smrg prng_srand (seed); 898f4f78bb6Smrg 899f4f78bb6Smrg if (prng_rand_n (8) == 0) 900953d7d37Smrg { 901f4f78bb6Smrg int n_traps; 902f4f78bb6Smrg pixman_trapezoid_t *trapezoids; 903f4f78bb6Smrg int p = prng_rand_n (3); 904f4f78bb6Smrg 905f4f78bb6Smrg if (p == 0) 906f4f78bb6Smrg dest = create_random_bits_image (DONT_CARE); 907f4f78bb6Smrg else 908f4f78bb6Smrg dest = create_random_bits_image (REQUIRE_ALPHA); 909f4f78bb6Smrg 910f4f78bb6Smrg if (!dest) 911f4f78bb6Smrg goto out; 912f4f78bb6Smrg 913953d7d37Smrg set_general_properties (dest, TRUE); 914953d7d37Smrg 915f4f78bb6Smrg if (!(trapezoids = create_random_trapezoids ( 916f4f78bb6Smrg &n_traps, dest->bits.width, dest->bits.height))) 917f4f78bb6Smrg { 918f4f78bb6Smrg goto out; 919f4f78bb6Smrg } 920f4f78bb6Smrg 921f4f78bb6Smrg switch (p) 922f4f78bb6Smrg { 923f4f78bb6Smrg case 0: 924f4f78bb6Smrg source = create_random_image (); 925f4f78bb6Smrg 926f4f78bb6Smrg if (source) 927f4f78bb6Smrg { 928f4f78bb6Smrg op = op_list [prng_rand_n (ARRAY_LENGTH (op_list))]; 929f4f78bb6Smrg 930f4f78bb6Smrg pixman_composite_trapezoids ( 931f4f78bb6Smrg op, source, dest, 932f4f78bb6Smrg random_format (REQUIRE_ALPHA), 933f4f78bb6Smrg rand_x (source), rand_y (source), 934f4f78bb6Smrg rand_x (dest), rand_y (dest), 935f4f78bb6Smrg n_traps, trapezoids); 936f4f78bb6Smrg } 937f4f78bb6Smrg break; 938f4f78bb6Smrg 939f4f78bb6Smrg case 1: 940f4f78bb6Smrg pixman_rasterize_trapezoid ( 941f4f78bb6Smrg dest, &trapezoids[prng_rand_n (n_traps)], 942f4f78bb6Smrg rand_x (dest), rand_y (dest)); 943f4f78bb6Smrg break; 944953d7d37Smrg 945f4f78bb6Smrg case 2: 946f4f78bb6Smrg pixman_add_trapezoids ( 947f4f78bb6Smrg dest, rand_x (dest), rand_y (dest), n_traps, trapezoids); 948f4f78bb6Smrg break; 949f4f78bb6Smrg } 950f4f78bb6Smrg 951f4f78bb6Smrg free (trapezoids); 952f4f78bb6Smrg } 953f4f78bb6Smrg else 954f4f78bb6Smrg { 955f4f78bb6Smrg dest = create_random_bits_image (DONT_CARE); 956f4f78bb6Smrg source = create_random_image (); 957f4f78bb6Smrg mask = create_random_image (); 958f4f78bb6Smrg 959f4f78bb6Smrg if (source && mask && dest) 960f4f78bb6Smrg { 961f4f78bb6Smrg set_general_properties (dest, TRUE); 962f4f78bb6Smrg 963f4f78bb6Smrg op = op_list [prng_rand_n (ARRAY_LENGTH (op_list))]; 964f4f78bb6Smrg 965f4f78bb6Smrg pixman_image_composite32 (op, 966f4f78bb6Smrg source, mask, dest, 967f4f78bb6Smrg rand_x (source), rand_y (source), 968f4f78bb6Smrg rand_x (mask), rand_y (mask), 969f4f78bb6Smrg 0, 0, 970f4f78bb6Smrg dest->bits.width, 971f4f78bb6Smrg dest->bits.height); 972f4f78bb6Smrg } 973953d7d37Smrg } 974f4f78bb6Smrg 975f4f78bb6Smrgout: 976953d7d37Smrg if (source) 977953d7d37Smrg pixman_image_unref (source); 978953d7d37Smrg if (mask) 979953d7d37Smrg pixman_image_unref (mask); 980953d7d37Smrg if (dest) 981953d7d37Smrg pixman_image_unref (dest); 982953d7d37Smrg} 983953d7d37Smrg 984953d7d37Smrgstatic pixman_bool_t 985953d7d37Smrgget_int (char *s, uint32_t *i) 986953d7d37Smrg{ 987953d7d37Smrg char *end; 988953d7d37Smrg int p; 989953d7d37Smrg 990953d7d37Smrg p = strtol (s, &end, 0); 991953d7d37Smrg 992953d7d37Smrg if (end != s && *end == 0) 993953d7d37Smrg { 994953d7d37Smrg *i = p; 995953d7d37Smrg return TRUE; 996953d7d37Smrg } 997953d7d37Smrg 998953d7d37Smrg return FALSE; 999953d7d37Smrg} 1000953d7d37Smrg 1001953d7d37Smrgint 1002953d7d37Smrgmain (int argc, char **argv) 1003953d7d37Smrg{ 1004953d7d37Smrg int verbose = FALSE; 1005953d7d37Smrg uint32_t seed = 1; 10069ad247e8Sjmcneill uint32_t n_tests = 8000; 1007953d7d37Smrg uint32_t mod = 0; 10086ba797d6Smrg pixman_bool_t use_threads = TRUE; 10099ad247e8Sjmcneill int32_t i; 1010953d7d37Smrg 1011953d7d37Smrg pixman_disable_out_of_bounds_workaround (); 1012953d7d37Smrg 10139ad247e8Sjmcneill enable_divbyzero_exceptions(); 1014953d7d37Smrg 1015953d7d37Smrg if (getenv ("VERBOSE") != NULL) 1016953d7d37Smrg verbose = TRUE; 1017953d7d37Smrg 1018953d7d37Smrg for (i = 1; i < argc; ++i) 1019953d7d37Smrg { 1020953d7d37Smrg if (strcmp (argv[i], "-v") == 0) 1021953d7d37Smrg { 1022953d7d37Smrg verbose = TRUE; 1023953d7d37Smrg 1024953d7d37Smrg if (i + 1 < argc) 1025953d7d37Smrg { 1026953d7d37Smrg get_int (argv[i + 1], &mod); 1027953d7d37Smrg i++; 1028953d7d37Smrg } 1029953d7d37Smrg } 1030953d7d37Smrg else if (strcmp (argv[i], "-s") == 0 && i + 1 < argc) 1031953d7d37Smrg { 1032953d7d37Smrg get_int (argv[i + 1], &seed); 10336ba797d6Smrg use_threads = FALSE; 1034953d7d37Smrg i++; 1035953d7d37Smrg } 1036953d7d37Smrg else if (strcmp (argv[i], "-n") == 0 && i + 1 < argc) 1037953d7d37Smrg { 1038953d7d37Smrg get_int (argv[i + 1], &n_tests); 1039953d7d37Smrg i++; 1040953d7d37Smrg } 1041953d7d37Smrg else 1042953d7d37Smrg { 1043953d7d37Smrg if (strcmp (argv[i], "-h") != 0) 1044953d7d37Smrg printf ("Unknown option '%s'\n\n", argv[i]); 1045953d7d37Smrg 1046953d7d37Smrg printf ("Options:\n\n" 1047953d7d37Smrg "-n <number> Number of tests to run\n" 10486ba797d6Smrg "-s <seed> Seed of first test (ignored if PIXMAN_RANDOMIZE_TESTS is set)\n" 1049953d7d37Smrg "-v Print out seeds\n" 1050953d7d37Smrg "-v <n> Print out every n'th seed\n\n"); 1051953d7d37Smrg 1052953d7d37Smrg exit (-1); 1053953d7d37Smrg } 1054953d7d37Smrg } 1055953d7d37Smrg 10566ba797d6Smrg if (getenv ("PIXMAN_RANDOMIZE_TESTS")) 10576ba797d6Smrg { 10586ba797d6Smrg seed = get_random_seed(); 10596ba797d6Smrg printf ("First seed: 0x%08x\n", seed); 10606ba797d6Smrg } 10616ba797d6Smrg 10626ba797d6Smrg if (use_threads) 10636ba797d6Smrg { 1064953d7d37Smrg#ifdef USE_OPENMP 1065953d7d37Smrg# pragma omp parallel for default(none) shared(verbose, n_tests, mod, seed) 1066953d7d37Smrg#endif 10679ad247e8Sjmcneill for (i = 0; i < (int32_t)n_tests; ++i) 10689ad247e8Sjmcneill run_test (seed + i, verbose, mod); 10696ba797d6Smrg } 10706ba797d6Smrg else 1071953d7d37Smrg { 10729ad247e8Sjmcneill for (i = 0; i < (int32_t)n_tests; ++i) 10739ad247e8Sjmcneill run_test (seed + i, verbose, mod); 1074953d7d37Smrg } 1075953d7d37Smrg 1076953d7d37Smrg return 0; 1077953d7d37Smrg} 1078