|
Packit |
030a23 |
#include <stdio.h>
|
|
Packit |
030a23 |
#include <stdlib.h>
|
|
Packit |
030a23 |
#include "utils.h"
|
|
Packit |
030a23 |
#include <sys/types.h>
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
#if 0
|
|
Packit |
030a23 |
#define fence_malloc malloc
|
|
Packit |
030a23 |
#define fence_free free
|
|
Packit |
030a23 |
#define make_random_bytes malloc
|
|
Packit |
030a23 |
#endif
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static const pixman_format_code_t image_formats[] =
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
PIXMAN_a8r8g8b8,
|
|
Packit |
030a23 |
PIXMAN_x8r8g8b8,
|
|
Packit |
030a23 |
PIXMAN_r5g6b5,
|
|
Packit |
030a23 |
PIXMAN_r3g3b2,
|
|
Packit |
030a23 |
PIXMAN_a8,
|
|
Packit |
030a23 |
PIXMAN_a8b8g8r8,
|
|
Packit |
030a23 |
PIXMAN_x8b8g8r8,
|
|
Packit |
030a23 |
PIXMAN_b8g8r8a8,
|
|
Packit |
030a23 |
PIXMAN_b8g8r8x8,
|
|
Packit |
030a23 |
PIXMAN_r8g8b8a8,
|
|
Packit |
030a23 |
PIXMAN_r8g8b8x8,
|
|
Packit |
030a23 |
PIXMAN_x14r6g6b6,
|
|
Packit |
030a23 |
PIXMAN_r8g8b8,
|
|
Packit |
030a23 |
PIXMAN_b8g8r8,
|
|
Packit |
030a23 |
PIXMAN_a8r8g8b8_sRGB,
|
|
Packit |
030a23 |
PIXMAN_r5g6b5,
|
|
Packit |
030a23 |
PIXMAN_b5g6r5,
|
|
Packit |
030a23 |
PIXMAN_x2r10g10b10,
|
|
Packit |
030a23 |
PIXMAN_a2r10g10b10,
|
|
Packit |
030a23 |
PIXMAN_x2b10g10r10,
|
|
Packit |
030a23 |
PIXMAN_a2b10g10r10,
|
|
Packit |
030a23 |
PIXMAN_a1r5g5b5,
|
|
Packit |
030a23 |
PIXMAN_x1r5g5b5,
|
|
Packit |
030a23 |
PIXMAN_a1b5g5r5,
|
|
Packit |
030a23 |
PIXMAN_x1b5g5r5,
|
|
Packit |
030a23 |
PIXMAN_a4r4g4b4,
|
|
Packit |
030a23 |
PIXMAN_x4r4g4b4,
|
|
Packit |
030a23 |
PIXMAN_a4b4g4r4,
|
|
Packit |
030a23 |
PIXMAN_x4b4g4r4,
|
|
Packit |
030a23 |
PIXMAN_a8,
|
|
Packit |
030a23 |
PIXMAN_r3g3b2,
|
|
Packit |
030a23 |
PIXMAN_b2g3r3,
|
|
Packit |
030a23 |
PIXMAN_a2r2g2b2,
|
|
Packit |
030a23 |
PIXMAN_a2b2g2r2,
|
|
Packit |
030a23 |
PIXMAN_c8,
|
|
Packit |
030a23 |
PIXMAN_g8,
|
|
Packit |
030a23 |
PIXMAN_x4c4,
|
|
Packit |
030a23 |
PIXMAN_x4g4,
|
|
Packit |
030a23 |
PIXMAN_c4,
|
|
Packit |
030a23 |
PIXMAN_g4,
|
|
Packit |
030a23 |
PIXMAN_g1,
|
|
Packit |
030a23 |
PIXMAN_x4a4,
|
|
Packit |
030a23 |
PIXMAN_a4,
|
|
Packit |
030a23 |
PIXMAN_r1g2b1,
|
|
Packit |
030a23 |
PIXMAN_b1g2r1,
|
|
Packit |
030a23 |
PIXMAN_a1r1g1b1,
|
|
Packit |
030a23 |
PIXMAN_a1b1g1r1,
|
|
Packit |
030a23 |
PIXMAN_a1
|
|
Packit |
030a23 |
};
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static pixman_filter_t filters[] =
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
PIXMAN_FILTER_NEAREST,
|
|
Packit |
030a23 |
PIXMAN_FILTER_BILINEAR,
|
|
Packit |
030a23 |
PIXMAN_FILTER_FAST,
|
|
Packit |
030a23 |
PIXMAN_FILTER_GOOD,
|
|
Packit |
030a23 |
PIXMAN_FILTER_BEST,
|
|
Packit |
030a23 |
PIXMAN_FILTER_CONVOLUTION
|
|
Packit |
030a23 |
};
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static int
|
|
Packit |
030a23 |
get_size (void)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
switch (prng_rand_n (28))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
case 0:
|
|
Packit |
030a23 |
return 1;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
case 1:
|
|
Packit |
030a23 |
return 2;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
default:
|
|
Packit |
030a23 |
case 2:
|
|
Packit |
030a23 |
return prng_rand_n (100);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
case 4:
|
|
Packit |
030a23 |
return prng_rand_n (2000) + 1000;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
case 5:
|
|
Packit |
030a23 |
return 65535;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
case 6:
|
|
Packit |
030a23 |
return 65536;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
case 7:
|
|
Packit |
030a23 |
return prng_rand_n (64000) + 63000;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
destroy (pixman_image_t *image, void *data)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
if (image->type == BITS && image->bits.free_me != image->bits.bits)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t *bits;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (image->bits.bits != (void *)0x01)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
bits = image->bits.bits;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (image->bits.rowstride < 0)
|
|
Packit |
030a23 |
bits -= (- image->bits.rowstride * (image->bits.height - 1));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
fence_free (bits);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
free (data);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static uint32_t
|
|
Packit |
030a23 |
real_reader (const void *src, int size)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
switch (size)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
case 1:
|
|
Packit |
030a23 |
return *(uint8_t *)src;
|
|
Packit |
030a23 |
case 2:
|
|
Packit |
030a23 |
return *(uint16_t *)src;
|
|
Packit |
030a23 |
case 4:
|
|
Packit |
030a23 |
return *(uint32_t *)src;
|
|
Packit |
030a23 |
default:
|
|
Packit |
030a23 |
assert (0);
|
|
Packit |
030a23 |
return 0; /* silence MSVC */
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
real_writer (void *src, uint32_t value, int size)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
switch (size)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
case 1:
|
|
Packit |
030a23 |
*(uint8_t *)src = value;
|
|
Packit |
030a23 |
break;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
case 2:
|
|
Packit |
030a23 |
*(uint16_t *)src = value;
|
|
Packit |
030a23 |
break;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
case 4:
|
|
Packit |
030a23 |
*(uint32_t *)src = value;
|
|
Packit |
030a23 |
break;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
default:
|
|
Packit |
030a23 |
assert (0);
|
|
Packit |
030a23 |
break;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static uint32_t
|
|
Packit |
030a23 |
fake_reader (const void *src, int size)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t r = prng_rand ();
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
assert (size == 1 || size == 2 || size == 4);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return r >> (32 - (size * 8));
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
fake_writer (void *src, uint32_t value, int size)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
assert (size == 1 || size == 2 || size == 4);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static int32_t
|
|
Packit |
030a23 |
log_rand (void)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t mask;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
mask = (1 << prng_rand_n (10)) - 1;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return (prng_rand () & mask) - (mask >> 1);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static int32_t
|
|
Packit |
030a23 |
rand_x (pixman_image_t *image)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
if (image->type == BITS)
|
|
Packit |
030a23 |
return prng_rand_n (image->bits.width);
|
|
Packit |
030a23 |
else
|
|
Packit |
030a23 |
return log_rand ();
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static int32_t
|
|
Packit |
030a23 |
rand_y (pixman_image_t *image)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
if (image->type == BITS)
|
|
Packit |
030a23 |
return prng_rand_n (image->bits.height);
|
|
Packit |
030a23 |
else
|
|
Packit |
030a23 |
return log_rand ();
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
typedef enum
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
DONT_CARE,
|
|
Packit |
030a23 |
PREFER_ALPHA,
|
|
Packit |
030a23 |
REQUIRE_ALPHA
|
|
Packit |
030a23 |
} alpha_preference_t;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static pixman_format_code_t
|
|
Packit |
030a23 |
random_format (alpha_preference_t alpha)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
pixman_format_code_t format;
|
|
Packit |
030a23 |
int n = prng_rand_n (ARRAY_LENGTH (image_formats));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (alpha >= PREFER_ALPHA &&
|
|
Packit |
030a23 |
(alpha == REQUIRE_ALPHA || prng_rand_n (4) != 0))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
do
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
format = image_formats[n++ % ARRAY_LENGTH (image_formats)];
|
|
Packit |
030a23 |
} while (PIXMAN_FORMAT_TYPE (format) != PIXMAN_TYPE_A);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
else
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
format = image_formats[n];
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return format;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static pixman_image_t *
|
|
Packit |
030a23 |
create_random_bits_image (alpha_preference_t alpha_preference)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
pixman_format_code_t format;
|
|
Packit |
030a23 |
pixman_indexed_t *indexed;
|
|
Packit |
030a23 |
pixman_image_t *image;
|
|
Packit |
030a23 |
int width, height, stride;
|
|
Packit |
030a23 |
uint32_t *bits;
|
|
Packit |
030a23 |
pixman_read_memory_func_t read_func = NULL;
|
|
Packit |
030a23 |
pixman_write_memory_func_t write_func = NULL;
|
|
Packit |
030a23 |
pixman_filter_t filter;
|
|
Packit |
030a23 |
pixman_fixed_t *coefficients = NULL;
|
|
Packit |
030a23 |
int n_coefficients = 0;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* format */
|
|
Packit |
030a23 |
format = random_format (alpha_preference);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
indexed = NULL;
|
|
Packit |
030a23 |
if (PIXMAN_FORMAT_TYPE (format) == PIXMAN_TYPE_COLOR)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
indexed = malloc (sizeof (pixman_indexed_t));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
initialize_palette (indexed, PIXMAN_FORMAT_BPP (format), TRUE);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
else if (PIXMAN_FORMAT_TYPE (format) == PIXMAN_TYPE_GRAY)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
indexed = malloc (sizeof (pixman_indexed_t));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
initialize_palette (indexed, PIXMAN_FORMAT_BPP (format), FALSE);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
else
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
indexed = NULL;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* size */
|
|
Packit |
030a23 |
width = get_size ();
|
|
Packit |
030a23 |
height = get_size ();
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
while ((uint64_t)width * height > 200000)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
if (prng_rand_n(2) == 0)
|
|
Packit |
030a23 |
height = 200000 / width;
|
|
Packit |
030a23 |
else
|
|
Packit |
030a23 |
width = 200000 / height;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (height == 0)
|
|
Packit |
030a23 |
height = 1;
|
|
Packit |
030a23 |
if (width == 0)
|
|
Packit |
030a23 |
width = 1;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* bits */
|
|
Packit |
030a23 |
switch (prng_rand_n (7))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
default:
|
|
Packit |
030a23 |
case 0:
|
|
Packit |
030a23 |
stride = width * PIXMAN_FORMAT_BPP (format) + prng_rand_n (17);
|
|
Packit |
030a23 |
stride = (stride + 3) & (~3);
|
|
Packit |
030a23 |
bits = (uint32_t *)make_random_bytes (height * stride);
|
|
Packit |
030a23 |
break;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
case 1:
|
|
Packit |
030a23 |
stride = 0;
|
|
Packit |
030a23 |
bits = NULL;
|
|
Packit |
030a23 |
break;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
case 2: /* Zero-filled */
|
|
Packit |
030a23 |
stride = width * PIXMAN_FORMAT_BPP (format) + prng_rand_n (17);
|
|
Packit |
030a23 |
stride = (stride + 3) & (~3);
|
|
Packit |
030a23 |
bits = fence_malloc (height * stride);
|
|
Packit |
030a23 |
if (!bits)
|
|
Packit |
030a23 |
return NULL;
|
|
Packit |
030a23 |
memset (bits, 0, height * stride);
|
|
Packit |
030a23 |
break;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
case 3: /* Filled with 0xFF */
|
|
Packit |
030a23 |
stride = width * PIXMAN_FORMAT_BPP (format) + prng_rand_n (17);
|
|
Packit |
030a23 |
stride = (stride + 3) & (~3);
|
|
Packit |
030a23 |
bits = fence_malloc (height * stride);
|
|
Packit |
030a23 |
if (!bits)
|
|
Packit |
030a23 |
return NULL;
|
|
Packit |
030a23 |
memset (bits, 0xff, height * stride);
|
|
Packit |
030a23 |
break;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
case 4: /* bits is a bad pointer, has read/write functions */
|
|
Packit |
030a23 |
stride = 232;
|
|
Packit |
030a23 |
bits = (void *)0x01;
|
|
Packit |
030a23 |
read_func = fake_reader;
|
|
Packit |
030a23 |
write_func = fake_writer;
|
|
Packit |
030a23 |
break;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
case 5: /* bits is a real pointer, has read/write functions */
|
|
Packit |
030a23 |
stride = width * PIXMAN_FORMAT_BPP (format) + prng_rand_n (17);
|
|
Packit |
030a23 |
stride = (stride + 3) & (~3);
|
|
Packit |
030a23 |
bits = fence_malloc (height * stride);
|
|
Packit |
030a23 |
if (!bits)
|
|
Packit |
030a23 |
return NULL;
|
|
Packit |
030a23 |
memset (bits, 0xff, height * stride);
|
|
Packit |
030a23 |
read_func = real_reader;
|
|
Packit |
030a23 |
write_func = real_writer;
|
|
Packit |
030a23 |
break;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
case 6: /* bits is a real pointer, stride is negative */
|
|
Packit |
030a23 |
stride = (width * PIXMAN_FORMAT_BPP (format) + prng_rand_n (17));
|
|
Packit |
030a23 |
stride = (stride + 3) & (~3);
|
|
Packit |
030a23 |
bits = (uint32_t *)make_random_bytes (height * stride);
|
|
Packit |
030a23 |
if (!bits)
|
|
Packit |
030a23 |
return NULL;
|
|
Packit |
030a23 |
bits += ((height - 1) * stride) / 4;
|
|
Packit |
030a23 |
stride = - stride;
|
|
Packit |
030a23 |
break;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* Filter */
|
|
Packit |
030a23 |
filter = filters[prng_rand_n (ARRAY_LENGTH (filters))];
|
|
Packit |
030a23 |
if (filter == PIXMAN_FILTER_CONVOLUTION)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int width = prng_rand_n (3);
|
|
Packit |
030a23 |
int height = prng_rand_n (4);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
n_coefficients = width * height + 2;
|
|
Packit |
030a23 |
coefficients = malloc (n_coefficients * sizeof (pixman_fixed_t));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (coefficients)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = 0; i < width * height; ++i)
|
|
Packit |
030a23 |
coefficients[i + 2] = prng_rand();
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
coefficients[0] = width << 16;
|
|
Packit |
030a23 |
coefficients[1] = height << 16;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
else
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
filter = PIXMAN_FILTER_BEST;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* Finally create the image */
|
|
Packit |
030a23 |
image = pixman_image_create_bits (format, width, height, bits, stride);
|
|
Packit |
030a23 |
if (!image)
|
|
Packit |
030a23 |
return NULL;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
pixman_image_set_indexed (image, indexed);
|
|
Packit |
030a23 |
pixman_image_set_destroy_function (image, destroy, indexed);
|
|
Packit |
030a23 |
pixman_image_set_accessors (image, read_func, write_func);
|
|
Packit |
030a23 |
pixman_image_set_filter (image, filter, coefficients, n_coefficients);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return image;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static pixman_repeat_t repeats[] =
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
PIXMAN_REPEAT_NONE,
|
|
Packit |
030a23 |
PIXMAN_REPEAT_NORMAL,
|
|
Packit |
030a23 |
PIXMAN_REPEAT_REFLECT,
|
|
Packit |
030a23 |
PIXMAN_REPEAT_PAD
|
|
Packit |
030a23 |
};
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static uint32_t
|
|
Packit |
030a23 |
absolute (int32_t i)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
return i < 0? -i : i;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
set_general_properties (pixman_image_t *image, pixman_bool_t allow_alpha_map)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
pixman_repeat_t repeat;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* Set properties that are generic to all images */
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* Repeat */
|
|
Packit |
030a23 |
repeat = repeats[prng_rand_n (ARRAY_LENGTH (repeats))];
|
|
Packit |
030a23 |
pixman_image_set_repeat (image, repeat);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* Alpha map */
|
|
Packit |
030a23 |
if (allow_alpha_map && prng_rand_n (4) == 0)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
pixman_image_t *alpha_map;
|
|
Packit |
030a23 |
int16_t x, y;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
alpha_map = create_random_bits_image (DONT_CARE);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (alpha_map)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
set_general_properties (alpha_map, FALSE);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
x = rand_x (image) - image->bits.width / 2;
|
|
Packit |
030a23 |
y = rand_y (image) - image->bits.height / 2;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
pixman_image_set_alpha_map (image, alpha_map, x, y);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
pixman_image_unref (alpha_map);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* Component alpha */
|
|
Packit |
030a23 |
pixman_image_set_component_alpha (image, prng_rand_n (3) == 0);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* Clip region */
|
|
Packit |
030a23 |
if (prng_rand_n (8) < 2)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
pixman_region32_t region;
|
|
Packit |
030a23 |
int i, n_rects;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
pixman_region32_init (®ion);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
switch (prng_rand_n (12))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
case 0:
|
|
Packit |
030a23 |
n_rects = 0;
|
|
Packit |
030a23 |
break;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
case 1: case 2: case 3:
|
|
Packit |
030a23 |
n_rects = 1;
|
|
Packit |
030a23 |
break;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
case 4: case 5:
|
|
Packit |
030a23 |
n_rects = 2;
|
|
Packit |
030a23 |
break;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
case 6: case 7:
|
|
Packit |
030a23 |
n_rects = 3;
|
|
Packit |
030a23 |
break;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
default:
|
|
Packit |
030a23 |
n_rects = prng_rand_n (100);
|
|
Packit |
030a23 |
break;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = 0; i < n_rects; ++i)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t width, height;
|
|
Packit |
030a23 |
int x, y;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
x = log_rand();
|
|
Packit |
030a23 |
y = log_rand();
|
|
Packit |
030a23 |
width = absolute (log_rand ()) + 1;
|
|
Packit |
030a23 |
height = absolute (log_rand ()) + 1;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
pixman_region32_union_rect (
|
|
Packit |
030a23 |
®ion, ®ion, x, y, width, height);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (image->type == BITS && prng_rand_n (8) != 0)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
uint32_t width, height;
|
|
Packit |
030a23 |
int x, y;
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* Also add a couple of clip rectangles inside the image
|
|
Packit |
030a23 |
* so that compositing will actually take place.
|
|
Packit |
030a23 |
*/
|
|
Packit |
030a23 |
for (i = 0; i < 5; ++i)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
x = prng_rand_n (2 * image->bits.width) - image->bits.width;
|
|
Packit |
030a23 |
y = prng_rand_n (2 * image->bits.height) - image->bits.height;
|
|
Packit |
030a23 |
width = prng_rand_n (image->bits.width) - x + 10;
|
|
Packit |
030a23 |
height = prng_rand_n (image->bits.height) - y + 10;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (width + x < x)
|
|
Packit |
030a23 |
width = INT32_MAX - x;
|
|
Packit |
030a23 |
if (height + y < y)
|
|
Packit |
030a23 |
height = INT32_MAX - y;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
pixman_region32_union_rect (
|
|
Packit |
030a23 |
®ion, ®ion, x, y, width, height);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
pixman_image_set_clip_region32 (image, ®ion);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
pixman_region32_fini (®ion);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* Whether source clipping is enabled */
|
|
Packit |
030a23 |
pixman_image_set_source_clipping (image, !!prng_rand_n (2));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* Client clip */
|
|
Packit |
030a23 |
pixman_image_set_has_client_clip (image, !!prng_rand_n (2));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
/* Transform */
|
|
Packit |
030a23 |
if (prng_rand_n (5) < 2)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
pixman_transform_t xform;
|
|
Packit |
030a23 |
int i, j, k;
|
|
Packit |
030a23 |
uint32_t tx, ty, sx, sy;
|
|
Packit |
030a23 |
uint32_t c, s;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
memset (&xform, 0, sizeof xform);
|
|
Packit |
030a23 |
xform.matrix[0][0] = pixman_fixed_1;
|
|
Packit |
030a23 |
xform.matrix[1][1] = pixman_fixed_1;
|
|
Packit |
030a23 |
xform.matrix[2][2] = pixman_fixed_1;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (k = 0; k < 3; ++k)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
switch (prng_rand_n (4))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
case 0:
|
|
Packit |
030a23 |
/* rotation */
|
|
Packit |
030a23 |
c = prng_rand_n (2 * 65536) - 65536;
|
|
Packit |
030a23 |
s = prng_rand_n (2 * 65536) - 65536;
|
|
Packit |
030a23 |
pixman_transform_rotate (&xform, NULL, c, s);
|
|
Packit |
030a23 |
break;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
case 1:
|
|
Packit |
030a23 |
/* translation */
|
|
Packit |
030a23 |
tx = prng_rand();
|
|
Packit |
030a23 |
ty = prng_rand();
|
|
Packit |
030a23 |
pixman_transform_translate (&xform, NULL, tx, ty);
|
|
Packit |
030a23 |
break;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
case 2:
|
|
Packit |
030a23 |
/* scale */
|
|
Packit |
030a23 |
sx = prng_rand();
|
|
Packit |
030a23 |
sy = prng_rand();
|
|
Packit |
030a23 |
pixman_transform_scale (&xform, NULL, sx, sy);
|
|
Packit |
030a23 |
break;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
case 3:
|
|
Packit |
030a23 |
if (prng_rand_n (16) == 0)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
/* random */
|
|
Packit |
030a23 |
for (i = 0; i < 3; ++i)
|
|
Packit |
030a23 |
for (j = 0; j < 3; ++j)
|
|
Packit |
030a23 |
xform.matrix[i][j] = prng_rand();
|
|
Packit |
030a23 |
break;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
else if (prng_rand_n (16) == 0)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
/* zero */
|
|
Packit |
030a23 |
memset (&xform, 0, sizeof xform);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
break;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
pixman_image_set_transform (image, &xform);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static pixman_color_t
|
|
Packit |
030a23 |
random_color (void)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
pixman_color_t color =
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
prng_rand() & 0xffff,
|
|
Packit |
030a23 |
prng_rand() & 0xffff,
|
|
Packit |
030a23 |
prng_rand() & 0xffff,
|
|
Packit |
030a23 |
prng_rand() & 0xffff,
|
|
Packit |
030a23 |
};
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return color;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static pixman_image_t *
|
|
Packit |
030a23 |
create_random_solid_image (void)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
pixman_color_t color = random_color();
|
|
Packit |
030a23 |
pixman_image_t *image = pixman_image_create_solid_fill (&color;;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return image;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static pixman_gradient_stop_t *
|
|
Packit |
030a23 |
create_random_stops (int *n_stops)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
pixman_fixed_t step;
|
|
Packit |
030a23 |
pixman_fixed_t s;
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
pixman_gradient_stop_t *stops;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*n_stops = prng_rand_n (50) + 1;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
step = pixman_fixed_1 / *n_stops;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
stops = malloc (*n_stops * sizeof (pixman_gradient_stop_t));
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
s = 0;
|
|
Packit |
030a23 |
for (i = 0; i < (*n_stops) - 1; ++i)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
stops[i].x = s;
|
|
Packit |
030a23 |
stops[i].color = random_color();
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
s += step;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
stops[*n_stops - 1].x = pixman_fixed_1;
|
|
Packit |
030a23 |
stops[*n_stops - 1].color = random_color();
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return stops;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static pixman_point_fixed_t
|
|
Packit |
030a23 |
create_random_point (void)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
pixman_point_fixed_t p;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
p.x = log_rand ();
|
|
Packit |
030a23 |
p.y = log_rand ();
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return p;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static pixman_image_t *
|
|
Packit |
030a23 |
create_random_linear_image (void)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int n_stops;
|
|
Packit |
030a23 |
pixman_gradient_stop_t *stops;
|
|
Packit |
030a23 |
pixman_point_fixed_t p1, p2;
|
|
Packit |
030a23 |
pixman_image_t *result;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
stops = create_random_stops (&n_stops);
|
|
Packit |
030a23 |
if (!stops)
|
|
Packit |
030a23 |
return NULL;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
p1 = create_random_point ();
|
|
Packit |
030a23 |
p2 = create_random_point ();
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
result = pixman_image_create_linear_gradient (&p1, &p2, stops, n_stops);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
free (stops);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return result;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static pixman_image_t *
|
|
Packit |
030a23 |
create_random_radial_image (void)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int n_stops;
|
|
Packit |
030a23 |
pixman_gradient_stop_t *stops;
|
|
Packit |
030a23 |
pixman_point_fixed_t inner_c, outer_c;
|
|
Packit |
030a23 |
pixman_fixed_t inner_r, outer_r;
|
|
Packit |
030a23 |
pixman_image_t *result;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
inner_c = create_random_point();
|
|
Packit |
030a23 |
outer_c = create_random_point();
|
|
Packit |
030a23 |
inner_r = prng_rand();
|
|
Packit |
030a23 |
outer_r = prng_rand();
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
stops = create_random_stops (&n_stops);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (!stops)
|
|
Packit |
030a23 |
return NULL;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
result = pixman_image_create_radial_gradient (
|
|
Packit |
030a23 |
&inner_c, &outer_c, inner_r, outer_r, stops, n_stops);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
free (stops);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return result;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static pixman_image_t *
|
|
Packit |
030a23 |
create_random_conical_image (void)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
pixman_gradient_stop_t *stops;
|
|
Packit |
030a23 |
int n_stops;
|
|
Packit |
030a23 |
pixman_point_fixed_t c;
|
|
Packit |
030a23 |
pixman_fixed_t angle;
|
|
Packit |
030a23 |
pixman_image_t *result;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
c = create_random_point();
|
|
Packit |
030a23 |
angle = prng_rand();
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
stops = create_random_stops (&n_stops);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (!stops)
|
|
Packit |
030a23 |
return NULL;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
result = pixman_image_create_conical_gradient (&c, angle, stops, n_stops);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
free (stops);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return result;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static pixman_image_t *
|
|
Packit |
030a23 |
create_random_image (void)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
pixman_image_t *result;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
switch (prng_rand_n (5))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
default:
|
|
Packit |
030a23 |
case 0:
|
|
Packit |
030a23 |
result = create_random_bits_image (DONT_CARE);
|
|
Packit |
030a23 |
break;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
case 1:
|
|
Packit |
030a23 |
result = create_random_solid_image ();
|
|
Packit |
030a23 |
break;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
case 2:
|
|
Packit |
030a23 |
result = create_random_linear_image ();
|
|
Packit |
030a23 |
break;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
case 3:
|
|
Packit |
030a23 |
result = create_random_radial_image ();
|
|
Packit |
030a23 |
break;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
case 4:
|
|
Packit |
030a23 |
result = create_random_conical_image ();
|
|
Packit |
030a23 |
break;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (result)
|
|
Packit |
030a23 |
set_general_properties (result, TRUE);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return result;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
random_line (pixman_line_fixed_t *line, int width, int height)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
line->p1.x = prng_rand_n (width) << 16;
|
|
Packit |
030a23 |
line->p1.y = prng_rand_n (height) << 16;
|
|
Packit |
030a23 |
line->p2.x = prng_rand_n (width) << 16;
|
|
Packit |
030a23 |
line->p2.y = prng_rand_n (height) << 16;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static pixman_trapezoid_t *
|
|
Packit |
030a23 |
create_random_trapezoids (int *n_traps, int height, int width)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
pixman_trapezoid_t *trapezoids;
|
|
Packit |
030a23 |
int i;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
*n_traps = prng_rand_n (16) + 1;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
trapezoids = malloc (sizeof (pixman_trapezoid_t) * *n_traps);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = 0; i < *n_traps; ++i)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
pixman_trapezoid_t *t = &(trapezoids[i]);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
t->top = prng_rand_n (height) << 16;
|
|
Packit |
030a23 |
t->bottom = prng_rand_n (height) << 16;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
random_line (&t->left, height, width);
|
|
Packit |
030a23 |
random_line (&t->right, height, width);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return trapezoids;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static const pixman_op_t op_list[] =
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
PIXMAN_OP_SRC,
|
|
Packit |
030a23 |
PIXMAN_OP_OVER,
|
|
Packit |
030a23 |
PIXMAN_OP_ADD,
|
|
Packit |
030a23 |
PIXMAN_OP_CLEAR,
|
|
Packit |
030a23 |
PIXMAN_OP_SRC,
|
|
Packit |
030a23 |
PIXMAN_OP_DST,
|
|
Packit |
030a23 |
PIXMAN_OP_OVER,
|
|
Packit |
030a23 |
PIXMAN_OP_OVER_REVERSE,
|
|
Packit |
030a23 |
PIXMAN_OP_IN,
|
|
Packit |
030a23 |
PIXMAN_OP_IN_REVERSE,
|
|
Packit |
030a23 |
PIXMAN_OP_OUT,
|
|
Packit |
030a23 |
PIXMAN_OP_OUT_REVERSE,
|
|
Packit |
030a23 |
PIXMAN_OP_ATOP,
|
|
Packit |
030a23 |
PIXMAN_OP_ATOP_REVERSE,
|
|
Packit |
030a23 |
PIXMAN_OP_XOR,
|
|
Packit |
030a23 |
PIXMAN_OP_ADD,
|
|
Packit |
030a23 |
PIXMAN_OP_SATURATE,
|
|
Packit |
030a23 |
PIXMAN_OP_DISJOINT_CLEAR,
|
|
Packit |
030a23 |
PIXMAN_OP_DISJOINT_SRC,
|
|
Packit |
030a23 |
PIXMAN_OP_DISJOINT_DST,
|
|
Packit |
030a23 |
PIXMAN_OP_DISJOINT_OVER,
|
|
Packit |
030a23 |
PIXMAN_OP_DISJOINT_OVER_REVERSE,
|
|
Packit |
030a23 |
PIXMAN_OP_DISJOINT_IN,
|
|
Packit |
030a23 |
PIXMAN_OP_DISJOINT_IN_REVERSE,
|
|
Packit |
030a23 |
PIXMAN_OP_DISJOINT_OUT,
|
|
Packit |
030a23 |
PIXMAN_OP_DISJOINT_OUT_REVERSE,
|
|
Packit |
030a23 |
PIXMAN_OP_DISJOINT_ATOP,
|
|
Packit |
030a23 |
PIXMAN_OP_DISJOINT_ATOP_REVERSE,
|
|
Packit |
030a23 |
PIXMAN_OP_DISJOINT_XOR,
|
|
Packit |
030a23 |
PIXMAN_OP_CONJOINT_CLEAR,
|
|
Packit |
030a23 |
PIXMAN_OP_CONJOINT_SRC,
|
|
Packit |
030a23 |
PIXMAN_OP_CONJOINT_DST,
|
|
Packit |
030a23 |
PIXMAN_OP_CONJOINT_OVER,
|
|
Packit |
030a23 |
PIXMAN_OP_CONJOINT_OVER_REVERSE,
|
|
Packit |
030a23 |
PIXMAN_OP_CONJOINT_IN,
|
|
Packit |
030a23 |
PIXMAN_OP_CONJOINT_IN_REVERSE,
|
|
Packit |
030a23 |
PIXMAN_OP_CONJOINT_OUT,
|
|
Packit |
030a23 |
PIXMAN_OP_CONJOINT_OUT_REVERSE,
|
|
Packit |
030a23 |
PIXMAN_OP_CONJOINT_ATOP,
|
|
Packit |
030a23 |
PIXMAN_OP_CONJOINT_ATOP_REVERSE,
|
|
Packit |
030a23 |
PIXMAN_OP_CONJOINT_XOR,
|
|
Packit |
030a23 |
PIXMAN_OP_MULTIPLY,
|
|
Packit |
030a23 |
PIXMAN_OP_SCREEN,
|
|
Packit |
030a23 |
PIXMAN_OP_OVERLAY,
|
|
Packit |
030a23 |
PIXMAN_OP_DARKEN,
|
|
Packit |
030a23 |
PIXMAN_OP_LIGHTEN,
|
|
Packit |
030a23 |
PIXMAN_OP_COLOR_DODGE,
|
|
Packit |
030a23 |
PIXMAN_OP_COLOR_BURN,
|
|
Packit |
030a23 |
PIXMAN_OP_HARD_LIGHT,
|
|
Packit |
030a23 |
PIXMAN_OP_DIFFERENCE,
|
|
Packit |
030a23 |
PIXMAN_OP_EXCLUSION,
|
|
Packit |
030a23 |
PIXMAN_OP_SOFT_LIGHT,
|
|
Packit |
030a23 |
PIXMAN_OP_HSL_HUE,
|
|
Packit |
030a23 |
PIXMAN_OP_HSL_SATURATION,
|
|
Packit |
030a23 |
PIXMAN_OP_HSL_COLOR,
|
|
Packit |
030a23 |
PIXMAN_OP_HSL_LUMINOSITY,
|
|
Packit |
030a23 |
};
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static void
|
|
Packit |
030a23 |
run_test (uint32_t seed, pixman_bool_t verbose, uint32_t mod)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
pixman_image_t *source, *mask, *dest;
|
|
Packit |
030a23 |
pixman_op_t op;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (verbose)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
if (mod == 0 || (seed % mod) == 0)
|
|
Packit |
030a23 |
printf ("Seed 0x%08x\n", seed);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
source = mask = dest = NULL;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
prng_srand (seed);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (prng_rand_n (8) == 0)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int n_traps;
|
|
Packit |
030a23 |
pixman_trapezoid_t *trapezoids;
|
|
Packit |
030a23 |
int p = prng_rand_n (3);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (p == 0)
|
|
Packit |
030a23 |
dest = create_random_bits_image (DONT_CARE);
|
|
Packit |
030a23 |
else
|
|
Packit |
030a23 |
dest = create_random_bits_image (REQUIRE_ALPHA);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (!dest)
|
|
Packit |
030a23 |
goto out;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
set_general_properties (dest, TRUE);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (!(trapezoids = create_random_trapezoids (
|
|
Packit |
030a23 |
&n_traps, dest->bits.width, dest->bits.height)))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
goto out;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
switch (p)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
case 0:
|
|
Packit |
030a23 |
source = create_random_image ();
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (source)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
op = op_list [prng_rand_n (ARRAY_LENGTH (op_list))];
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
pixman_composite_trapezoids (
|
|
Packit |
030a23 |
op, source, dest,
|
|
Packit |
030a23 |
random_format (REQUIRE_ALPHA),
|
|
Packit |
030a23 |
rand_x (source), rand_y (source),
|
|
Packit |
030a23 |
rand_x (dest), rand_y (dest),
|
|
Packit |
030a23 |
n_traps, trapezoids);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
break;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
case 1:
|
|
Packit |
030a23 |
pixman_rasterize_trapezoid (
|
|
Packit |
030a23 |
dest, &trapezoids[prng_rand_n (n_traps)],
|
|
Packit |
030a23 |
rand_x (dest), rand_y (dest));
|
|
Packit |
030a23 |
break;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
case 2:
|
|
Packit |
030a23 |
pixman_add_trapezoids (
|
|
Packit |
030a23 |
dest, rand_x (dest), rand_y (dest), n_traps, trapezoids);
|
|
Packit |
030a23 |
break;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
free (trapezoids);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
else
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
dest = create_random_bits_image (DONT_CARE);
|
|
Packit |
030a23 |
source = create_random_image ();
|
|
Packit |
030a23 |
mask = create_random_image ();
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (source && mask && dest)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
set_general_properties (dest, TRUE);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
op = op_list [prng_rand_n (ARRAY_LENGTH (op_list))];
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
pixman_image_composite32 (op,
|
|
Packit |
030a23 |
source, mask, dest,
|
|
Packit |
030a23 |
rand_x (source), rand_y (source),
|
|
Packit |
030a23 |
rand_x (mask), rand_y (mask),
|
|
Packit |
030a23 |
0, 0,
|
|
Packit |
030a23 |
dest->bits.width,
|
|
Packit |
030a23 |
dest->bits.height);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
out:
|
|
Packit |
030a23 |
if (source)
|
|
Packit |
030a23 |
pixman_image_unref (source);
|
|
Packit |
030a23 |
if (mask)
|
|
Packit |
030a23 |
pixman_image_unref (mask);
|
|
Packit |
030a23 |
if (dest)
|
|
Packit |
030a23 |
pixman_image_unref (dest);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static pixman_bool_t
|
|
Packit |
030a23 |
get_int (char *s, uint32_t *i)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
char *end;
|
|
Packit |
030a23 |
int p;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
p = strtol (s, &end, 0);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (end != s && *end == 0)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
*i = p;
|
|
Packit |
030a23 |
return TRUE;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return FALSE;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
int
|
|
Packit |
030a23 |
main (int argc, char **argv)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
int verbose = FALSE;
|
|
Packit |
030a23 |
uint32_t seed = 1;
|
|
Packit |
030a23 |
uint32_t n_tests = 8000;
|
|
Packit |
030a23 |
uint32_t mod = 0;
|
|
Packit |
030a23 |
pixman_bool_t use_threads = TRUE;
|
|
Packit |
030a23 |
int32_t i;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
pixman_disable_out_of_bounds_workaround ();
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
enable_divbyzero_exceptions();
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (getenv ("VERBOSE") != NULL)
|
|
Packit |
030a23 |
verbose = TRUE;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (i = 1; i < argc; ++i)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
if (strcmp (argv[i], "-v") == 0)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
verbose = TRUE;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (i + 1 < argc)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
get_int (argv[i + 1], &mod);
|
|
Packit |
030a23 |
i++;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
else if (strcmp (argv[i], "-s") == 0 && i + 1 < argc)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
get_int (argv[i + 1], &seed);
|
|
Packit |
030a23 |
use_threads = FALSE;
|
|
Packit |
030a23 |
i++;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
else if (strcmp (argv[i], "-n") == 0 && i + 1 < argc)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
get_int (argv[i + 1], &n_tests);
|
|
Packit |
030a23 |
i++;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
else
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
if (strcmp (argv[i], "-h") != 0)
|
|
Packit |
030a23 |
printf ("Unknown option '%s'\n\n", argv[i]);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
printf ("Options:\n\n"
|
|
Packit |
030a23 |
"-n <number> Number of tests to run\n"
|
|
Packit |
030a23 |
"-s <seed> Seed of first test (ignored if PIXMAN_RANDOMIZE_TESTS is set)\n"
|
|
Packit |
030a23 |
"-v Print out seeds\n"
|
|
Packit |
030a23 |
"-v <n> Print out every n'th seed\n\n");
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
exit (-1);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (getenv ("PIXMAN_RANDOMIZE_TESTS"))
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
seed = get_random_seed();
|
|
Packit |
030a23 |
printf ("First seed: 0x%08x\n", seed);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
if (use_threads)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
#ifdef USE_OPENMP
|
|
Packit |
030a23 |
# pragma omp parallel for default(none) shared(verbose, n_tests, mod, seed)
|
|
Packit |
030a23 |
#endif
|
|
Packit |
030a23 |
for (i = 0; i < (int32_t)n_tests; ++i)
|
|
Packit |
030a23 |
run_test (seed + i, verbose, mod);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
else
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
for (i = 0; i < (int32_t)n_tests; ++i)
|
|
Packit |
030a23 |
run_test (seed + i, verbose, mod);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return 0;
|
|
Packit |
030a23 |
}
|