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 (&region);
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		&region, &region, 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		    &region, &region, x, y, width, height);
5071176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	    }
5081176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	}
5091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
5101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	pixman_image_set_clip_region32 (image, &region);
5111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
5121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	pixman_region32_fini (&region);
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