Blame test/composite-traps-test.c

Packit 030a23
/* Based loosely on scaling-test */
Packit 030a23
Packit 030a23
#include <stdlib.h>
Packit 030a23
#include <stdio.h>
Packit 030a23
#include "utils.h"
Packit 030a23
Packit 030a23
#define MAX_SRC_WIDTH  48
Packit 030a23
#define MAX_SRC_HEIGHT 48
Packit 030a23
#define MAX_DST_WIDTH  48
Packit 030a23
#define MAX_DST_HEIGHT 48
Packit 030a23
#define MAX_STRIDE     4
Packit 030a23
Packit 030a23
static pixman_format_code_t formats[] =
Packit 030a23
{
Packit 030a23
    PIXMAN_a8r8g8b8, PIXMAN_a8, PIXMAN_r5g6b5, PIXMAN_a1, PIXMAN_a4
Packit 030a23
};
Packit 030a23
Packit 030a23
static pixman_format_code_t mask_formats[] =
Packit 030a23
{
Packit 030a23
    PIXMAN_a1, PIXMAN_a4, PIXMAN_a8,
Packit 030a23
};
Packit 030a23
Packit 030a23
static pixman_op_t operators[] =
Packit 030a23
{
Packit 030a23
    PIXMAN_OP_OVER, PIXMAN_OP_ADD, PIXMAN_OP_SRC, PIXMAN_OP_IN
Packit 030a23
};
Packit 030a23
Packit 030a23
#define RANDOM_ELT(array)						\
Packit 030a23
    ((array)[prng_rand_n(ARRAY_LENGTH((array)))])
Packit 030a23
Packit 030a23
static void
Packit 030a23
destroy_bits (pixman_image_t *image, void *data)
Packit 030a23
{
Packit 030a23
    fence_free (data);
Packit 030a23
}
Packit 030a23
Packit 030a23
static pixman_fixed_t
Packit 030a23
random_fixed (int n)
Packit 030a23
{
Packit 030a23
    return prng_rand_n (n << 16);
Packit 030a23
}
Packit 030a23
Packit 030a23
/*
Packit 030a23
 * Composite operation with pseudorandom images
Packit 030a23
 */
Packit 030a23
uint32_t
Packit 030a23
test_composite (int      testnum,
Packit 030a23
		int      verbose)
Packit 030a23
{
Packit 030a23
    int                i;
Packit 030a23
    pixman_image_t *   src_img;
Packit 030a23
    pixman_image_t *   dst_img;
Packit 030a23
    pixman_region16_t  clip;
Packit 030a23
    int                dst_width, dst_height;
Packit 030a23
    int                dst_stride;
Packit 030a23
    int                dst_x, dst_y;
Packit 030a23
    int                dst_bpp;
Packit 030a23
    pixman_op_t        op;
Packit 030a23
    uint32_t *         dst_bits;
Packit 030a23
    uint32_t           crc32;
Packit 030a23
    pixman_format_code_t mask_format, dst_format;
Packit 030a23
    pixman_trapezoid_t *traps;
Packit 030a23
    int src_x, src_y;
Packit 030a23
    int n_traps;
Packit 030a23
Packit 030a23
    static pixman_color_t colors[] =
Packit 030a23
    {
Packit 030a23
	{ 0xffff, 0xffff, 0xffff, 0xffff },
Packit 030a23
	{ 0x0000, 0x0000, 0x0000, 0x0000 },
Packit 030a23
	{ 0xabcd, 0xabcd, 0x0000, 0xabcd },
Packit 030a23
	{ 0x0000, 0x0000, 0x0000, 0xffff },
Packit 030a23
	{ 0x0101, 0x0101, 0x0101, 0x0101 },
Packit 030a23
	{ 0x7777, 0x6666, 0x5555, 0x9999 },
Packit 030a23
    };
Packit 030a23
    
Packit 030a23
    FLOAT_REGS_CORRUPTION_DETECTOR_START ();
Packit 030a23
Packit 030a23
    prng_srand (testnum);
Packit 030a23
Packit 030a23
    op = RANDOM_ELT (operators);
Packit 030a23
    mask_format = RANDOM_ELT (mask_formats);
Packit 030a23
Packit 030a23
    /* Create source image */
Packit 030a23
    
Packit 030a23
    if (prng_rand_n (4) == 0)
Packit 030a23
    {
Packit 030a23
	src_img = pixman_image_create_solid_fill (
Packit 030a23
	    &(colors[prng_rand_n (ARRAY_LENGTH (colors))]));
Packit 030a23
Packit 030a23
	src_x = 10;
Packit 030a23
	src_y = 234;
Packit 030a23
    }
Packit 030a23
    else
Packit 030a23
    {
Packit 030a23
	pixman_format_code_t src_format = RANDOM_ELT(formats);
Packit 030a23
	int src_bpp = (PIXMAN_FORMAT_BPP (src_format) + 7) / 8;
Packit 030a23
	int src_width = prng_rand_n (MAX_SRC_WIDTH) + 1;
Packit 030a23
	int src_height = prng_rand_n (MAX_SRC_HEIGHT) + 1;
Packit 030a23
	int src_stride = src_width * src_bpp + prng_rand_n (MAX_STRIDE) * src_bpp;
Packit 030a23
	uint32_t *bits, *orig;
Packit 030a23
Packit 030a23
	src_x = -(src_width / 4) + prng_rand_n (src_width * 3 / 2);
Packit 030a23
	src_y = -(src_height / 4) + prng_rand_n (src_height * 3 / 2);
Packit 030a23
Packit 030a23
	src_stride = (src_stride + 3) & ~3;
Packit 030a23
	
Packit 030a23
	orig = bits = (uint32_t *)make_random_bytes (src_stride * src_height);
Packit 030a23
Packit 030a23
	if (prng_rand_n (2) == 0)
Packit 030a23
	{
Packit 030a23
	    bits += (src_stride / 4) * (src_height - 1);
Packit 030a23
	    src_stride = - src_stride;
Packit 030a23
	}
Packit 030a23
	
Packit 030a23
	src_img = pixman_image_create_bits (
Packit 030a23
	    src_format, src_width, src_height, bits, src_stride);
Packit 030a23
Packit 030a23
	pixman_image_set_destroy_function (src_img, destroy_bits, orig);
Packit 030a23
Packit 030a23
	if (prng_rand_n (8) == 0)
Packit 030a23
	{
Packit 030a23
	    pixman_box16_t clip_boxes[2];
Packit 030a23
	    int            n = prng_rand_n (2) + 1;
Packit 030a23
	    
Packit 030a23
	    for (i = 0; i < n; i++)
Packit 030a23
	    {
Packit 030a23
		clip_boxes[i].x1 = prng_rand_n (src_width);
Packit 030a23
		clip_boxes[i].y1 = prng_rand_n (src_height);
Packit 030a23
		clip_boxes[i].x2 =
Packit 030a23
		    clip_boxes[i].x1 + prng_rand_n (src_width - clip_boxes[i].x1);
Packit 030a23
		clip_boxes[i].y2 =
Packit 030a23
		    clip_boxes[i].y1 + prng_rand_n (src_height - clip_boxes[i].y1);
Packit 030a23
		
Packit 030a23
		if (verbose)
Packit 030a23
		{
Packit 030a23
		    printf ("source clip box: [%d,%d-%d,%d]\n",
Packit 030a23
			    clip_boxes[i].x1, clip_boxes[i].y1,
Packit 030a23
			    clip_boxes[i].x2, clip_boxes[i].y2);
Packit 030a23
		}
Packit 030a23
	    }
Packit 030a23
	    
Packit 030a23
	    pixman_region_init_rects (&clip, clip_boxes, n);
Packit 030a23
	    pixman_image_set_clip_region (src_img, &clip);
Packit 030a23
	    pixman_image_set_source_clipping (src_img, 1);
Packit 030a23
	    pixman_region_fini (&clip);
Packit 030a23
	}
Packit 030a23
Packit 030a23
	image_endian_swap (src_img);
Packit 030a23
    }
Packit 030a23
Packit 030a23
    /* Create destination image */
Packit 030a23
    {
Packit 030a23
	dst_format = RANDOM_ELT(formats);
Packit 030a23
	dst_bpp = (PIXMAN_FORMAT_BPP (dst_format) + 7) / 8;
Packit 030a23
	dst_width = prng_rand_n (MAX_DST_WIDTH) + 1;
Packit 030a23
	dst_height = prng_rand_n (MAX_DST_HEIGHT) + 1;
Packit 030a23
	dst_stride = dst_width * dst_bpp + prng_rand_n (MAX_STRIDE) * dst_bpp;
Packit 030a23
	dst_stride = (dst_stride + 3) & ~3;
Packit 030a23
	
Packit 030a23
	dst_bits = (uint32_t *)make_random_bytes (dst_stride * dst_height);
Packit 030a23
Packit 030a23
	if (prng_rand_n (2) == 0)
Packit 030a23
	{
Packit 030a23
	    dst_bits += (dst_stride / 4) * (dst_height - 1);
Packit 030a23
	    dst_stride = - dst_stride;
Packit 030a23
	}
Packit 030a23
	
Packit 030a23
	dst_x = -(dst_width / 4) + prng_rand_n (dst_width * 3 / 2);
Packit 030a23
	dst_y = -(dst_height / 4) + prng_rand_n (dst_height * 3 / 2);
Packit 030a23
	
Packit 030a23
	dst_img = pixman_image_create_bits (
Packit 030a23
	    dst_format, dst_width, dst_height, dst_bits, dst_stride);
Packit 030a23
Packit 030a23
	image_endian_swap (dst_img);
Packit 030a23
    }
Packit 030a23
Packit 030a23
    /* Create traps */
Packit 030a23
    {
Packit 030a23
	int i;
Packit 030a23
Packit 030a23
	n_traps = prng_rand_n (25);
Packit 030a23
	traps = fence_malloc (n_traps * sizeof (pixman_trapezoid_t));
Packit 030a23
Packit 030a23
	for (i = 0; i < n_traps; ++i)
Packit 030a23
	{
Packit 030a23
	    pixman_trapezoid_t *t = &(traps[i]);
Packit 030a23
	    
Packit 030a23
	    t->top = random_fixed (MAX_DST_HEIGHT) - MAX_DST_HEIGHT / 2;
Packit 030a23
	    t->bottom = t->top + random_fixed (MAX_DST_HEIGHT);
Packit 030a23
	    t->left.p1.x = random_fixed (MAX_DST_WIDTH) - MAX_DST_WIDTH / 2;
Packit 030a23
	    t->left.p1.y = t->top - random_fixed (50);
Packit 030a23
	    t->left.p2.x = random_fixed (MAX_DST_WIDTH) - MAX_DST_WIDTH / 2;
Packit 030a23
	    t->left.p2.y = t->bottom + random_fixed (50);
Packit 030a23
	    t->right.p1.x = t->left.p1.x + random_fixed (MAX_DST_WIDTH);
Packit 030a23
	    t->right.p1.y = t->top - random_fixed (50);
Packit 030a23
	    t->right.p2.x = t->left.p2.x + random_fixed (MAX_DST_WIDTH);
Packit 030a23
	    t->right.p2.y = t->bottom - random_fixed (50);
Packit 030a23
	}
Packit 030a23
    }
Packit 030a23
    
Packit 030a23
    if (prng_rand_n (8) == 0)
Packit 030a23
    {
Packit 030a23
	pixman_box16_t clip_boxes[2];
Packit 030a23
	int            n = prng_rand_n (2) + 1;
Packit 030a23
	for (i = 0; i < n; i++)
Packit 030a23
	{
Packit 030a23
	    clip_boxes[i].x1 = prng_rand_n (dst_width);
Packit 030a23
	    clip_boxes[i].y1 = prng_rand_n (dst_height);
Packit 030a23
	    clip_boxes[i].x2 =
Packit 030a23
		clip_boxes[i].x1 + prng_rand_n (dst_width - clip_boxes[i].x1);
Packit 030a23
	    clip_boxes[i].y2 =
Packit 030a23
		clip_boxes[i].y1 + prng_rand_n (dst_height - clip_boxes[i].y1);
Packit 030a23
Packit 030a23
	    if (verbose)
Packit 030a23
	    {
Packit 030a23
		printf ("destination clip box: [%d,%d-%d,%d]\n",
Packit 030a23
		        clip_boxes[i].x1, clip_boxes[i].y1,
Packit 030a23
		        clip_boxes[i].x2, clip_boxes[i].y2);
Packit 030a23
	    }
Packit 030a23
	}
Packit 030a23
	pixman_region_init_rects (&clip, clip_boxes, n);
Packit 030a23
	pixman_image_set_clip_region (dst_img, &clip);
Packit 030a23
	pixman_region_fini (&clip);
Packit 030a23
    }
Packit 030a23
Packit 030a23
    pixman_composite_trapezoids (op, src_img, dst_img, mask_format,
Packit 030a23
				 src_x, src_y, dst_x, dst_y, n_traps, traps);
Packit 030a23
Packit 030a23
    crc32 = compute_crc32_for_image (0, dst_img);
Packit 030a23
Packit 030a23
    if (verbose)
Packit 030a23
	print_image (dst_img);
Packit 030a23
Packit 030a23
    if (dst_stride < 0)
Packit 030a23
	dst_bits += (dst_stride / 4) * (dst_height - 1);
Packit 030a23
    
Packit 030a23
    fence_free (dst_bits);
Packit 030a23
    
Packit 030a23
    pixman_image_unref (src_img);
Packit 030a23
    pixman_image_unref (dst_img);
Packit 030a23
    fence_free (traps);
Packit 030a23
Packit 030a23
    FLOAT_REGS_CORRUPTION_DETECTOR_FINISH ();
Packit 030a23
    return crc32;
Packit 030a23
}
Packit 030a23
Packit 030a23
int
Packit 030a23
main (int argc, const char *argv[])
Packit 030a23
{
Packit 030a23
    return fuzzer_test_main("composite traps", 40000, 0xAF41D210,
Packit 030a23
			    test_composite, argc, argv);
Packit 030a23
}