11176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include <stdio.h> 21176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include <stdlib.h> 31176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include "utils.h" 41176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include <sys/types.h> 51176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 61176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#if 0 71176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define fence_malloc malloc 81176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define fence_free free 91176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define make_random_bytes malloc 101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#endif 111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 121176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic const pixman_format_code_t image_formats[] = 131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a8r8g8b8, 151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_x8r8g8b8, 161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_r5g6b5, 171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_r3g3b2, 181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a8, 191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a8b8g8r8, 201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_x8b8g8r8, 211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_b8g8r8a8, 221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_b8g8r8x8, 231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_r8g8b8a8, 241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_r8g8b8x8, 251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_x14r6g6b6, 261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_r8g8b8, 271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_b8g8r8, 281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a8r8g8b8_sRGB, 291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_r5g6b5, 301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_b5g6r5, 311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_x2r10g10b10, 321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a2r10g10b10, 331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_x2b10g10r10, 341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a2b10g10r10, 351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a1r5g5b5, 361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_x1r5g5b5, 371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a1b5g5r5, 381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_x1b5g5r5, 391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a4r4g4b4, 401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_x4r4g4b4, 411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a4b4g4r4, 421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_x4b4g4r4, 431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a8, 441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_r3g3b2, 451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_b2g3r3, 461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a2r2g2b2, 471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a2b2g2r2, 481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_c8, 491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_g8, 501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_x4c4, 511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_x4g4, 521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_c4, 531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_g4, 541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_g1, 551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_x4a4, 561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a4, 571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_r1g2b1, 581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_b1g2r1, 591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a1r1g1b1, 601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a1b1g1r1, 611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a1 621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck}; 631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 641176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic pixman_filter_t filters[] = 651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_FILTER_NEAREST, 671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_FILTER_BILINEAR, 681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_FILTER_FAST, 691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_FILTER_GOOD, 701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_FILTER_BEST, 711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_FILTER_CONVOLUTION 721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck}; 731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 741176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic int 751176bdada62cabc6ec4b0308a930e83b679d5d36John Reckget_size (void) 761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck switch (prng_rand_n (28)) 781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 0: 801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return 1; 811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 1: 831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return 2; 841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck default: 861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 2: 871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return prng_rand_n (100); 881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 4: 901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return prng_rand_n (2000) + 1000; 911176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 5: 931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return 65535; 941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 951176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 6: 961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return 65536; 971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 981176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 7: 991176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return prng_rand_n (64000) + 63000; 1001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 1011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 1021176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1031176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic void 1041176bdada62cabc6ec4b0308a930e83b679d5d36John Reckdestroy (pixman_image_t *image, void *data) 1051176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 1061176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (image->type == BITS && image->bits.free_me != image->bits.bits) 1071176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 1081176bdada62cabc6ec4b0308a930e83b679d5d36John Reck uint32_t *bits; 1091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (image->bits.bits != (void *)0x01) 1111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 1121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck bits = image->bits.bits; 1131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (image->bits.rowstride < 0) 1151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck bits -= (- image->bits.rowstride * (image->bits.height - 1)); 1161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck fence_free (bits); 1181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 1191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 1201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck free (data); 1221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 1231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1241176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic uint32_t 1251176bdada62cabc6ec4b0308a930e83b679d5d36John Reckreal_reader (const void *src, int size) 1261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 1271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck switch (size) 1281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 1291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 1: 1301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return *(uint8_t *)src; 1311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 2: 1321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return *(uint16_t *)src; 1331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 4: 1341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return *(uint32_t *)src; 1351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck default: 1361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck assert (0); 1371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return 0; /* silence MSVC */ 1381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 1391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 1401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1411176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic void 1421176bdada62cabc6ec4b0308a930e83b679d5d36John Reckreal_writer (void *src, uint32_t value, int size) 1431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 1441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck switch (size) 1451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 1461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 1: 1471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck *(uint8_t *)src = value; 1481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck break; 1491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 2: 1511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck *(uint16_t *)src = value; 1521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck break; 1531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 4: 1551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck *(uint32_t *)src = value; 1561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck break; 1571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck default: 1591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck assert (0); 1601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck break; 1611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 1621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 1631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1641176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic uint32_t 1651176bdada62cabc6ec4b0308a930e83b679d5d36John Reckfake_reader (const void *src, int size) 1661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 1671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck uint32_t r = prng_rand (); 1681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck assert (size == 1 || size == 2 || size == 4); 1701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return r >> (32 - (size * 8)); 1721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 1731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1741176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic void 1751176bdada62cabc6ec4b0308a930e83b679d5d36John Reckfake_writer (void *src, uint32_t value, int size) 1761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 1771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck assert (size == 1 || size == 2 || size == 4); 1781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 1791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1801176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic int32_t 1811176bdada62cabc6ec4b0308a930e83b679d5d36John Recklog_rand (void) 1821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 1831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck uint32_t mask; 1841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck mask = (1 << prng_rand_n (10)) - 1; 1861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return (prng_rand () & mask) - (mask >> 1); 1881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 1891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1901176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic int32_t 1911176bdada62cabc6ec4b0308a930e83b679d5d36John Reckrand_x (pixman_image_t *image) 1921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 1931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (image->type == BITS) 1941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return prng_rand_n (image->bits.width); 1951176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else 1961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return log_rand (); 1971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 1981176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1991176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic int32_t 2001176bdada62cabc6ec4b0308a930e83b679d5d36John Reckrand_y (pixman_image_t *image) 2011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 2021176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (image->type == BITS) 2031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return prng_rand_n (image->bits.height); 2041176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else 2051176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return log_rand (); 2061176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 2071176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2081176bdada62cabc6ec4b0308a930e83b679d5d36John Recktypedef enum 2091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 2101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck DONT_CARE, 2111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PREFER_ALPHA, 2121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck REQUIRE_ALPHA 2131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} alpha_preference_t; 2141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2151176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic pixman_format_code_t 2161176bdada62cabc6ec4b0308a930e83b679d5d36John Reckrandom_format (alpha_preference_t alpha) 2171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 2181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_format_code_t format; 2191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int n = prng_rand_n (ARRAY_LENGTH (image_formats)); 2201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (alpha >= PREFER_ALPHA && 2221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck (alpha == REQUIRE_ALPHA || prng_rand_n (4) != 0)) 2231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 2241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck do 2251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 2261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck format = image_formats[n++ % ARRAY_LENGTH (image_formats)]; 2271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } while (PIXMAN_FORMAT_TYPE (format) != PIXMAN_TYPE_A); 2281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 2291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else 2301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 2311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck format = image_formats[n]; 2321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 2331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return format; 2351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 2361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2371176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic pixman_image_t * 2381176bdada62cabc6ec4b0308a930e83b679d5d36John Reckcreate_random_bits_image (alpha_preference_t alpha_preference) 2391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 2401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_format_code_t format; 2411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_indexed_t *indexed; 2421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_t *image; 2431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int width, height, stride; 2441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck uint32_t *bits; 2451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_read_memory_func_t read_func = NULL; 2461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_write_memory_func_t write_func = NULL; 2471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_filter_t filter; 2481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_fixed_t *coefficients = NULL; 2491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int n_coefficients = 0; 2501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* format */ 2521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck format = random_format (alpha_preference); 2531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck indexed = NULL; 2551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (PIXMAN_FORMAT_TYPE (format) == PIXMAN_TYPE_COLOR) 2561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 2571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck indexed = malloc (sizeof (pixman_indexed_t)); 2581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck initialize_palette (indexed, PIXMAN_FORMAT_BPP (format), TRUE); 2601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 2611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else if (PIXMAN_FORMAT_TYPE (format) == PIXMAN_TYPE_GRAY) 2621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 2631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck indexed = malloc (sizeof (pixman_indexed_t)); 2641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck initialize_palette (indexed, PIXMAN_FORMAT_BPP (format), FALSE); 2661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 2671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else 2681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 2691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck indexed = NULL; 2701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 2711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* size */ 2731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck width = get_size (); 2741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck height = get_size (); 2751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck while ((uint64_t)width * height > 200000) 2771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 2781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (prng_rand_n(2) == 0) 2791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck height = 200000 / width; 2801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else 2811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck width = 200000 / height; 2821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 2831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (height == 0) 2851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck height = 1; 2861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (width == 0) 2871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck width = 1; 2881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* bits */ 2901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck switch (prng_rand_n (7)) 2911176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 2921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck default: 2931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 0: 2941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck stride = width * PIXMAN_FORMAT_BPP (format) + prng_rand_n (17); 2951176bdada62cabc6ec4b0308a930e83b679d5d36John Reck stride = (stride + 3) & (~3); 2961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck bits = (uint32_t *)make_random_bytes (height * stride); 2971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck break; 2981176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2991176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 1: 3001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck stride = 0; 3011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck bits = NULL; 3021176bdada62cabc6ec4b0308a930e83b679d5d36John Reck break; 3031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3041176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 2: /* Zero-filled */ 3051176bdada62cabc6ec4b0308a930e83b679d5d36John Reck stride = width * PIXMAN_FORMAT_BPP (format) + prng_rand_n (17); 3061176bdada62cabc6ec4b0308a930e83b679d5d36John Reck stride = (stride + 3) & (~3); 3071176bdada62cabc6ec4b0308a930e83b679d5d36John Reck bits = fence_malloc (height * stride); 3081176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (!bits) 3091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return NULL; 3101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck memset (bits, 0, height * stride); 3111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck break; 3121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 3: /* Filled with 0xFF */ 3141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck stride = width * PIXMAN_FORMAT_BPP (format) + prng_rand_n (17); 3151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck stride = (stride + 3) & (~3); 3161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck bits = fence_malloc (height * stride); 3171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (!bits) 3181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return NULL; 3191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck memset (bits, 0xff, height * stride); 3201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck break; 3211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 4: /* bits is a bad pointer, has read/write functions */ 3231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck stride = 232; 3241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck bits = (void *)0x01; 3251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck read_func = fake_reader; 3261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck write_func = fake_writer; 3271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck break; 3281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 5: /* bits is a real pointer, has read/write functions */ 3301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck stride = width * PIXMAN_FORMAT_BPP (format) + prng_rand_n (17); 3311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck stride = (stride + 3) & (~3); 3321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck bits = fence_malloc (height * stride); 3331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (!bits) 3341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return NULL; 3351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck memset (bits, 0xff, height * stride); 3361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck read_func = real_reader; 3371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck write_func = real_writer; 3381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck break; 3391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 6: /* bits is a real pointer, stride is negative */ 3411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck stride = (width * PIXMAN_FORMAT_BPP (format) + prng_rand_n (17)); 3421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck stride = (stride + 3) & (~3); 3431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck bits = (uint32_t *)make_random_bytes (height * stride); 3441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (!bits) 3451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return NULL; 3461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck bits += ((height - 1) * stride) / 4; 3471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck stride = - stride; 3481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck break; 3491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 3501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* Filter */ 3521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck filter = filters[prng_rand_n (ARRAY_LENGTH (filters))]; 3531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (filter == PIXMAN_FILTER_CONVOLUTION) 3541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 3551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int width = prng_rand_n (3); 3561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int height = prng_rand_n (4); 3571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck n_coefficients = width * height + 2; 3591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck coefficients = malloc (n_coefficients * sizeof (pixman_fixed_t)); 3601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (coefficients) 3621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 3631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int i; 3641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck for (i = 0; i < width * height; ++i) 3661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck coefficients[i + 2] = prng_rand(); 3671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck coefficients[0] = width << 16; 3691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck coefficients[1] = height << 16; 3701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 3711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else 3721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 3731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck filter = PIXMAN_FILTER_BEST; 3741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 3751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 3761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* Finally create the image */ 3781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck image = pixman_image_create_bits (format, width, height, bits, stride); 3791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (!image) 3801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return NULL; 3811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_set_indexed (image, indexed); 3831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_set_destroy_function (image, destroy, indexed); 3841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_set_accessors (image, read_func, write_func); 3851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_set_filter (image, filter, coefficients, n_coefficients); 3861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return image; 3881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 3891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3901176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic pixman_repeat_t repeats[] = 3911176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 3921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_REPEAT_NONE, 3931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_REPEAT_NORMAL, 3941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_REPEAT_REFLECT, 3951176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_REPEAT_PAD 3961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck}; 3971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3981176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic uint32_t 3991176bdada62cabc6ec4b0308a930e83b679d5d36John Reckabsolute (int32_t i) 4001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 4011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return i < 0? -i : i; 4021176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 4031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 4041176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic void 4051176bdada62cabc6ec4b0308a930e83b679d5d36John Reckset_general_properties (pixman_image_t *image, pixman_bool_t allow_alpha_map) 4061176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 4071176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_repeat_t repeat; 4081176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 4091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* Set properties that are generic to all images */ 4101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 4111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* Repeat */ 4121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck repeat = repeats[prng_rand_n (ARRAY_LENGTH (repeats))]; 4131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_set_repeat (image, repeat); 4141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 4151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* Alpha map */ 4161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (allow_alpha_map && prng_rand_n (4) == 0) 4171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 4181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_t *alpha_map; 4191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int16_t x, y; 4201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 4211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck alpha_map = create_random_bits_image (DONT_CARE); 4221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 4231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (alpha_map) 4241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 4251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck set_general_properties (alpha_map, FALSE); 4261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 4271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck x = rand_x (image) - image->bits.width / 2; 4281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck y = rand_y (image) - image->bits.height / 2; 4291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 4301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_set_alpha_map (image, alpha_map, x, y); 4311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 4321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_unref (alpha_map); 4331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 4341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 4351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 4361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* Component alpha */ 4371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_set_component_alpha (image, prng_rand_n (3) == 0); 4381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 4391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* Clip region */ 4401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (prng_rand_n (8) < 2) 4411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 4421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_region32_t region; 4431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int i, n_rects; 4441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 4451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_region32_init (®ion); 4461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 4471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck switch (prng_rand_n (12)) 4481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 4491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 0: 4501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck n_rects = 0; 4511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck break; 4521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 4531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 1: case 2: case 3: 4541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck n_rects = 1; 4551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck break; 4561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 4571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 4: case 5: 4581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck n_rects = 2; 4591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck break; 4601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 4611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 6: case 7: 4621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck n_rects = 3; 4631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck break; 4641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 4651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck default: 4661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck n_rects = prng_rand_n (100); 4671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck break; 4681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 4691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 4701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck for (i = 0; i < n_rects; ++i) 4711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 4721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck uint32_t width, height; 4731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int x, y; 4741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 4751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck x = log_rand(); 4761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck y = log_rand(); 4771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck width = absolute (log_rand ()) + 1; 4781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck height = absolute (log_rand ()) + 1; 4791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 4801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_region32_union_rect ( 4811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck ®ion, ®ion, x, y, width, height); 4821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 4831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 4841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (image->type == BITS && prng_rand_n (8) != 0) 4851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 4861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck uint32_t width, height; 4871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int x, y; 4881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int i; 4891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 4901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* Also add a couple of clip rectangles inside the image 4911176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * so that compositing will actually take place. 4921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */ 4931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck for (i = 0; i < 5; ++i) 4941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 4951176bdada62cabc6ec4b0308a930e83b679d5d36John Reck x = prng_rand_n (2 * image->bits.width) - image->bits.width; 4961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck y = prng_rand_n (2 * image->bits.height) - image->bits.height; 4971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck width = prng_rand_n (image->bits.width) - x + 10; 4981176bdada62cabc6ec4b0308a930e83b679d5d36John Reck height = prng_rand_n (image->bits.height) - y + 10; 4991176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 5001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (width + x < x) 5011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck width = INT32_MAX - x; 5021176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (height + y < y) 5031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck height = INT32_MAX - y; 5041176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 5051176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_region32_union_rect ( 5061176bdada62cabc6ec4b0308a930e83b679d5d36John Reck ®ion, ®ion, x, y, width, height); 5071176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 5081176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 5091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 5101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_set_clip_region32 (image, ®ion); 5111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 5121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_region32_fini (®ion); 5131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 5141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 5151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* Whether source clipping is enabled */ 5161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_set_source_clipping (image, !!prng_rand_n (2)); 5171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 5181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* Client clip */ 5191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_set_has_client_clip (image, !!prng_rand_n (2)); 5201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 5211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* Transform */ 5221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (prng_rand_n (5) < 2) 5231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 5241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_transform_t xform; 5251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int i, j, k; 5261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck uint32_t tx, ty, sx, sy; 5271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck uint32_t c, s; 5281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 5291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck memset (&xform, 0, sizeof xform); 5301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck xform.matrix[0][0] = pixman_fixed_1; 5311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck xform.matrix[1][1] = pixman_fixed_1; 5321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck xform.matrix[2][2] = pixman_fixed_1; 5331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 5341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck for (k = 0; k < 3; ++k) 5351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 5361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck switch (prng_rand_n (4)) 5371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 5381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 0: 5391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* rotation */ 5401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck c = prng_rand_n (2 * 65536) - 65536; 5411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck s = prng_rand_n (2 * 65536) - 65536; 5421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_transform_rotate (&xform, NULL, c, s); 5431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck break; 5441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 5451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 1: 5461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* translation */ 5471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck tx = prng_rand(); 5481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck ty = prng_rand(); 5491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_transform_translate (&xform, NULL, tx, ty); 5501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck break; 5511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 5521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 2: 5531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* scale */ 5541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck sx = prng_rand(); 5551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck sy = prng_rand(); 5561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_transform_scale (&xform, NULL, sx, sy); 5571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck break; 5581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 5591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 3: 5601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (prng_rand_n (16) == 0) 5611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 5621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* random */ 5631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck for (i = 0; i < 3; ++i) 5641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck for (j = 0; j < 3; ++j) 5651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck xform.matrix[i][j] = prng_rand(); 5661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck break; 5671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 5681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else if (prng_rand_n (16) == 0) 5691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 5701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* zero */ 5711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck memset (&xform, 0, sizeof xform); 5721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 5731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck break; 5741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 5751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 5761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 5771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_set_transform (image, &xform); 5781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 5791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 5801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 5811176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic pixman_color_t 5821176bdada62cabc6ec4b0308a930e83b679d5d36John Reckrandom_color (void) 5831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 5841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_color_t color = 5851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 5861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck prng_rand() & 0xffff, 5871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck prng_rand() & 0xffff, 5881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck prng_rand() & 0xffff, 5891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck prng_rand() & 0xffff, 5901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck }; 5911176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 5921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return color; 5931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 5941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 5951176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 5961176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic pixman_image_t * 5971176bdada62cabc6ec4b0308a930e83b679d5d36John Reckcreate_random_solid_image (void) 5981176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 5991176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_color_t color = random_color(); 6001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_t *image = pixman_image_create_solid_fill (&color); 6011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6021176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return image; 6031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 6041176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6051176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic pixman_gradient_stop_t * 6061176bdada62cabc6ec4b0308a930e83b679d5d36John Reckcreate_random_stops (int *n_stops) 6071176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 6081176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_fixed_t step; 6091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_fixed_t s; 6101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int i; 6111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_gradient_stop_t *stops; 6121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck *n_stops = prng_rand_n (50) + 1; 6141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck step = pixman_fixed_1 / *n_stops; 6161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck stops = malloc (*n_stops * sizeof (pixman_gradient_stop_t)); 6181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck s = 0; 6201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck for (i = 0; i < (*n_stops) - 1; ++i) 6211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 6221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck stops[i].x = s; 6231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck stops[i].color = random_color(); 6241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck s += step; 6261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 6271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck stops[*n_stops - 1].x = pixman_fixed_1; 6291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck stops[*n_stops - 1].color = random_color(); 6301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return stops; 6321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 6331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6341176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic pixman_point_fixed_t 6351176bdada62cabc6ec4b0308a930e83b679d5d36John Reckcreate_random_point (void) 6361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 6371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_point_fixed_t p; 6381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck p.x = log_rand (); 6401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck p.y = log_rand (); 6411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return p; 6431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 6441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6451176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic pixman_image_t * 6461176bdada62cabc6ec4b0308a930e83b679d5d36John Reckcreate_random_linear_image (void) 6471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 6481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int n_stops; 6491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_gradient_stop_t *stops; 6501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_point_fixed_t p1, p2; 6511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_t *result; 6521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck stops = create_random_stops (&n_stops); 6541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (!stops) 6551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return NULL; 6561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck p1 = create_random_point (); 6581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck p2 = create_random_point (); 6591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck result = pixman_image_create_linear_gradient (&p1, &p2, stops, n_stops); 6611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck free (stops); 6631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return result; 6651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 6661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6671176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic pixman_image_t * 6681176bdada62cabc6ec4b0308a930e83b679d5d36John Reckcreate_random_radial_image (void) 6691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 6701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int n_stops; 6711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_gradient_stop_t *stops; 6721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_point_fixed_t inner_c, outer_c; 6731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_fixed_t inner_r, outer_r; 6741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_t *result; 6751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck inner_c = create_random_point(); 6771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck outer_c = create_random_point(); 6781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck inner_r = prng_rand(); 6791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck outer_r = prng_rand(); 6801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck stops = create_random_stops (&n_stops); 6821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (!stops) 6841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return NULL; 6851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck result = pixman_image_create_radial_gradient ( 6871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck &inner_c, &outer_c, inner_r, outer_r, stops, n_stops); 6881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck free (stops); 6901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6911176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return result; 6921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 6931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 6941176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic pixman_image_t * 6951176bdada62cabc6ec4b0308a930e83b679d5d36John Reckcreate_random_conical_image (void) 6961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 6971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_gradient_stop_t *stops; 6981176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int n_stops; 6991176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_point_fixed_t c; 7001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_fixed_t angle; 7011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_t *result; 7021176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 7031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck c = create_random_point(); 7041176bdada62cabc6ec4b0308a930e83b679d5d36John Reck angle = prng_rand(); 7051176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 7061176bdada62cabc6ec4b0308a930e83b679d5d36John Reck stops = create_random_stops (&n_stops); 7071176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 7081176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (!stops) 7091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return NULL; 7101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 7111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck result = pixman_image_create_conical_gradient (&c, angle, stops, n_stops); 7121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 7131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck free (stops); 7141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 7151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return result; 7161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 7171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 7181176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic pixman_image_t * 7191176bdada62cabc6ec4b0308a930e83b679d5d36John Reckcreate_random_image (void) 7201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 7211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_t *result; 7221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 7231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck switch (prng_rand_n (5)) 7241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 7251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck default: 7261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 0: 7271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck result = create_random_bits_image (DONT_CARE); 7281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck break; 7291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 7301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 1: 7311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck result = create_random_solid_image (); 7321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck break; 7331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 7341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 2: 7351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck result = create_random_linear_image (); 7361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck break; 7371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 7381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 3: 7391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck result = create_random_radial_image (); 7401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck break; 7411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 7421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 4: 7431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck result = create_random_conical_image (); 7441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck break; 7451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 7461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 7471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (result) 7481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck set_general_properties (result, TRUE); 7491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 7501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return result; 7511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 7521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 7531176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic void 7541176bdada62cabc6ec4b0308a930e83b679d5d36John Reckrandom_line (pixman_line_fixed_t *line, int width, int height) 7551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 7561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck line->p1.x = prng_rand_n (width) << 16; 7571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck line->p1.y = prng_rand_n (height) << 16; 7581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck line->p2.x = prng_rand_n (width) << 16; 7591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck line->p2.y = prng_rand_n (height) << 16; 7601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 7611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 7621176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic pixman_trapezoid_t * 7631176bdada62cabc6ec4b0308a930e83b679d5d36John Reckcreate_random_trapezoids (int *n_traps, int height, int width) 7641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 7651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_trapezoid_t *trapezoids; 7661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int i; 7671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 7681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck *n_traps = prng_rand_n (16) + 1; 7691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 7701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck trapezoids = malloc (sizeof (pixman_trapezoid_t) * *n_traps); 7711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 7721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck for (i = 0; i < *n_traps; ++i) 7731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 7741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_trapezoid_t *t = &(trapezoids[i]); 7751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 7761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck t->top = prng_rand_n (height) << 16; 7771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck t->bottom = prng_rand_n (height) << 16; 7781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 7791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck random_line (&t->left, height, width); 7801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck random_line (&t->right, height, width); 7811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 7821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 7831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return trapezoids; 7841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 7851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 7861176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic const pixman_op_t op_list[] = 7871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 7881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_SRC, 7891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_OVER, 7901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_ADD, 7911176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_CLEAR, 7921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_SRC, 7931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DST, 7941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_OVER, 7951176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_OVER_REVERSE, 7961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_IN, 7971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_IN_REVERSE, 7981176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_OUT, 7991176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_OUT_REVERSE, 8001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_ATOP, 8011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_ATOP_REVERSE, 8021176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_XOR, 8031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_ADD, 8041176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_SATURATE, 8051176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DISJOINT_CLEAR, 8061176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DISJOINT_SRC, 8071176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DISJOINT_DST, 8081176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DISJOINT_OVER, 8091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DISJOINT_OVER_REVERSE, 8101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DISJOINT_IN, 8111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DISJOINT_IN_REVERSE, 8121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DISJOINT_OUT, 8131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DISJOINT_OUT_REVERSE, 8141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DISJOINT_ATOP, 8151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DISJOINT_ATOP_REVERSE, 8161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DISJOINT_XOR, 8171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_CONJOINT_CLEAR, 8181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_CONJOINT_SRC, 8191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_CONJOINT_DST, 8201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_CONJOINT_OVER, 8211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_CONJOINT_OVER_REVERSE, 8221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_CONJOINT_IN, 8231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_CONJOINT_IN_REVERSE, 8241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_CONJOINT_OUT, 8251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_CONJOINT_OUT_REVERSE, 8261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_CONJOINT_ATOP, 8271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_CONJOINT_ATOP_REVERSE, 8281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_CONJOINT_XOR, 8291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_MULTIPLY, 8301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_SCREEN, 8311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_OVERLAY, 8321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DARKEN, 8331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_LIGHTEN, 8341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_COLOR_DODGE, 8351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_COLOR_BURN, 8361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_HARD_LIGHT, 8371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DIFFERENCE, 8381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_EXCLUSION, 8391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_SOFT_LIGHT, 8401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_HSL_HUE, 8411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_HSL_SATURATION, 8421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_HSL_COLOR, 8431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_HSL_LUMINOSITY, 8441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck}; 8451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 8461176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic void 8471176bdada62cabc6ec4b0308a930e83b679d5d36John Reckrun_test (uint32_t seed, pixman_bool_t verbose, uint32_t mod) 8481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 8491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_t *source, *mask, *dest; 8501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_op_t op; 8511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 8521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (verbose) 8531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 8541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (mod == 0 || (seed % mod) == 0) 8551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck printf ("Seed 0x%08x\n", seed); 8561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 8571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 8581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck source = mask = dest = NULL; 8591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 8601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck prng_srand (seed); 8611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 8621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (prng_rand_n (8) == 0) 8631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 8641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int n_traps; 8651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_trapezoid_t *trapezoids; 8661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int p = prng_rand_n (3); 8671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 8681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (p == 0) 8691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck dest = create_random_bits_image (DONT_CARE); 8701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else 8711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck dest = create_random_bits_image (REQUIRE_ALPHA); 8721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 8731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (!dest) 8741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck goto out; 8751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 8761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck set_general_properties (dest, TRUE); 8771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 8781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (!(trapezoids = create_random_trapezoids ( 8791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck &n_traps, dest->bits.width, dest->bits.height))) 8801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 8811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck goto out; 8821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 8831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 8841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck switch (p) 8851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 8861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 0: 8871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck source = create_random_image (); 8881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 8891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (source) 8901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 8911176bdada62cabc6ec4b0308a930e83b679d5d36John Reck op = op_list [prng_rand_n (ARRAY_LENGTH (op_list))]; 8921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 8931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_composite_trapezoids ( 8941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck op, source, dest, 8951176bdada62cabc6ec4b0308a930e83b679d5d36John Reck random_format (REQUIRE_ALPHA), 8961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck rand_x (source), rand_y (source), 8971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck rand_x (dest), rand_y (dest), 8981176bdada62cabc6ec4b0308a930e83b679d5d36John Reck n_traps, trapezoids); 8991176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 9001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck break; 9011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 9021176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 1: 9031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_rasterize_trapezoid ( 9041176bdada62cabc6ec4b0308a930e83b679d5d36John Reck dest, &trapezoids[prng_rand_n (n_traps)], 9051176bdada62cabc6ec4b0308a930e83b679d5d36John Reck rand_x (dest), rand_y (dest)); 9061176bdada62cabc6ec4b0308a930e83b679d5d36John Reck break; 9071176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 9081176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 2: 9091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_add_trapezoids ( 9101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck dest, rand_x (dest), rand_y (dest), n_traps, trapezoids); 9111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck break; 9121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 9131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 9141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck free (trapezoids); 9151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 9161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else 9171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 9181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck dest = create_random_bits_image (DONT_CARE); 9191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck source = create_random_image (); 9201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck mask = create_random_image (); 9211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 9221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (source && mask && dest) 9231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 9241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck set_general_properties (dest, TRUE); 9251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 9261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck op = op_list [prng_rand_n (ARRAY_LENGTH (op_list))]; 9271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 9281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_composite32 (op, 9291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck source, mask, dest, 9301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck rand_x (source), rand_y (source), 9311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck rand_x (mask), rand_y (mask), 9321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 0, 0, 9331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck dest->bits.width, 9341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck dest->bits.height); 9351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 9361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 9371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 9381176bdada62cabc6ec4b0308a930e83b679d5d36John Reckout: 9391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (source) 9401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_unref (source); 9411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (mask) 9421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_unref (mask); 9431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (dest) 9441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_unref (dest); 9451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 9461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 9471176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic pixman_bool_t 9481176bdada62cabc6ec4b0308a930e83b679d5d36John Reckget_int (char *s, uint32_t *i) 9491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 9501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck char *end; 9511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int p; 9521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 9531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck p = strtol (s, &end, 0); 9541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 9551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (end != s && *end == 0) 9561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 9571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck *i = p; 9581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return TRUE; 9591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 9601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 9611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return FALSE; 9621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 9631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 9641176bdada62cabc6ec4b0308a930e83b679d5d36John Reckint 9651176bdada62cabc6ec4b0308a930e83b679d5d36John Reckmain (int argc, char **argv) 9661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 9671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int verbose = FALSE; 9681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck uint32_t seed = 1; 9691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck uint32_t n_tests = 8000; 9701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck uint32_t mod = 0; 9711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_bool_t use_threads = TRUE; 9721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int32_t i; 9731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 9741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_disable_out_of_bounds_workaround (); 9751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 9761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck enable_divbyzero_exceptions(); 9771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 9781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (getenv ("VERBOSE") != NULL) 9791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck verbose = TRUE; 9801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 9811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck for (i = 1; i < argc; ++i) 9821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 9831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (strcmp (argv[i], "-v") == 0) 9841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 9851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck verbose = TRUE; 9861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 9871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (i + 1 < argc) 9881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 9891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck get_int (argv[i + 1], &mod); 9901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck i++; 9911176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 9921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 9931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else if (strcmp (argv[i], "-s") == 0 && i + 1 < argc) 9941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 9951176bdada62cabc6ec4b0308a930e83b679d5d36John Reck get_int (argv[i + 1], &seed); 9961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck use_threads = FALSE; 9971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck i++; 9981176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 9991176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else if (strcmp (argv[i], "-n") == 0 && i + 1 < argc) 10001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 10011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck get_int (argv[i + 1], &n_tests); 10021176bdada62cabc6ec4b0308a930e83b679d5d36John Reck i++; 10031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 10041176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else 10051176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 10061176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (strcmp (argv[i], "-h") != 0) 10071176bdada62cabc6ec4b0308a930e83b679d5d36John Reck printf ("Unknown option '%s'\n\n", argv[i]); 10081176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 10091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck printf ("Options:\n\n" 10101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck "-n <number> Number of tests to run\n" 10111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck "-s <seed> Seed of first test (ignored if PIXMAN_RANDOMIZE_TESTS is set)\n" 10121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck "-v Print out seeds\n" 10131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck "-v <n> Print out every n'th seed\n\n"); 10141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 10151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck exit (-1); 10161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 10171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 10181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 10191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (getenv ("PIXMAN_RANDOMIZE_TESTS")) 10201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 10211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck seed = get_random_seed(); 10221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck printf ("First seed: 0x%08x\n", seed); 10231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 10241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 10251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (use_threads) 10261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 10271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#ifdef USE_OPENMP 10281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck# pragma omp parallel for default(none) shared(verbose, n_tests, mod, seed) 10291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#endif 10301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck for (i = 0; i < (int32_t)n_tests; ++i) 10311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck run_test (seed + i, verbose, mod); 10321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 10331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else 10341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 10351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck for (i = 0; i < (int32_t)n_tests; ++i) 10361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck run_test (seed + i, verbose, mod); 10371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 10381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 10391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return 0; 10401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 1041