114b11b2bSmrg#include <assert.h>
214b11b2bSmrg#include <stdlib.h>
314b11b2bSmrg#include <stdio.h>
414b11b2bSmrg#include "utils.h"
514b11b2bSmrg
614b11b2bSmrgint
714b11b2bSmrgmain ()
814b11b2bSmrg{
914b11b2bSmrg    pixman_region64f_t r1;
1014b11b2bSmrg    pixman_region64f_t r2;
1114b11b2bSmrg    pixman_region64f_t r3;
1214b11b2bSmrg    pixman_box64f_t boxes[] = {
1314b11b2bSmrg	{ 10, 10, 20, 20 },
1414b11b2bSmrg	{ 30, 30, 30, 40 },
1514b11b2bSmrg	{ 50, 45, 60, 44 },
1614b11b2bSmrg    };
1714b11b2bSmrg    pixman_box64f_t boxes2[] = {
1814b11b2bSmrg	{ 2, 6, 7, 6 },
1914b11b2bSmrg	{ 4, 1, 6, 7 },
2014b11b2bSmrg    };
2114b11b2bSmrg    pixman_box64f_t boxes3[] = {
2214b11b2bSmrg	{ 2, 6, 7, 6 },
2314b11b2bSmrg	{ 4, 1, 6, 1 },
2414b11b2bSmrg    };
2514b11b2bSmrg    int i, j;
2614b11b2bSmrg    pixman_box64f_t *b;
2714b11b2bSmrg    pixman_image_t *image, *fill;
2814b11b2bSmrg    pixman_color_t white = {
2914b11b2bSmrg	0xffff,
3014b11b2bSmrg	0xffff,
3114b11b2bSmrg	0xffff,
3214b11b2bSmrg	0xffff
3314b11b2bSmrg    };
3414b11b2bSmrg
3514b11b2bSmrg    prng_srand (0);
3614b11b2bSmrg
3714b11b2bSmrg    /* This used to go into an infinite loop before pixman-region.c
3814b11b2bSmrg     * was fixed to not use explict "short" variables
3914b11b2bSmrg     */
4014b11b2bSmrg    pixman_region64f_init_rect (&r1, 0, 0, 20, 64000);
4114b11b2bSmrg    pixman_region64f_init_rect (&r2, 0, 0, 20, 64000);
4214b11b2bSmrg    pixman_region64f_init_rect (&r3, 0, 0, 20, 64000);
4314b11b2bSmrg
4414b11b2bSmrg    pixman_region64f_subtract (&r1, &r2, &r3);
4514b11b2bSmrg
4614b11b2bSmrg
4714b11b2bSmrg    /* This would produce a region containing an empty
4814b11b2bSmrg     * rectangle in it. Such regions are considered malformed,
4914b11b2bSmrg     * but using an empty rectangle for initialization should
5014b11b2bSmrg     * work.
5114b11b2bSmrg     */
5214b11b2bSmrg    pixman_region64f_init_rects (&r1, boxes, 3);
5314b11b2bSmrg
5414b11b2bSmrg    b = pixman_region64f_rectangles (&r1, &i);
5514b11b2bSmrg
5614b11b2bSmrg    assert (i == 1);
5714b11b2bSmrg
5814b11b2bSmrg    while (i--)
5914b11b2bSmrg    {
6014b11b2bSmrg	assert (b[i].x1 < b[i].x2);
6114b11b2bSmrg	assert (b[i].y1 < b[i].y2);
6214b11b2bSmrg    }
6314b11b2bSmrg
6414b11b2bSmrg    /* This would produce a rectangle containing the bounding box
6514b11b2bSmrg     * of the two rectangles. The correct result is to eliminate
6614b11b2bSmrg     * the broken rectangle.
6714b11b2bSmrg     */
6814b11b2bSmrg    pixman_region64f_init_rects (&r1, boxes2, 2);
6914b11b2bSmrg
7014b11b2bSmrg    b = pixman_region64f_rectangles (&r1, &i);
7114b11b2bSmrg
7214b11b2bSmrg    assert (i == 1);
7314b11b2bSmrg
7414b11b2bSmrg    assert (b[0].x1 == 4);
7514b11b2bSmrg    assert (b[0].y1 == 1);
7614b11b2bSmrg    assert (b[0].x2 == 6);
7714b11b2bSmrg    assert (b[0].y2 == 7);
7814b11b2bSmrg
7914b11b2bSmrg    /* This should produce an empty region */
8014b11b2bSmrg    pixman_region64f_init_rects (&r1, boxes3, 2);
8114b11b2bSmrg
8214b11b2bSmrg    b = pixman_region64f_rectangles (&r1, &i);
8314b11b2bSmrg
8414b11b2bSmrg    assert (i == 0);
8514b11b2bSmrg
8614b11b2bSmrg    fill = pixman_image_create_solid_fill (&white);
8714b11b2bSmrg    for (i = 0; i < 100; i++)
8814b11b2bSmrg    {
8914b11b2bSmrg	int image_size = 128;
9014b11b2bSmrg
9114b11b2bSmrg	pixman_region64f_init (&r1);
9214b11b2bSmrg
9314b11b2bSmrg	/* Add some random rectangles */
9414b11b2bSmrg	for (j = 0; j < 64; j++)
9514b11b2bSmrg	    pixman_region64f_union_rect (&r1, &r1,
9614b11b2bSmrg					prng_rand_n (image_size),
9714b11b2bSmrg					prng_rand_n (image_size),
9814b11b2bSmrg					prng_rand_n (25),
9914b11b2bSmrg					prng_rand_n (25));
10014b11b2bSmrg
10114b11b2bSmrg	/* Clip to image size */
10214b11b2bSmrg	pixman_region64f_init_rect (&r2, 0, 0, image_size, image_size);
10314b11b2bSmrg	pixman_region64f_intersect (&r1, &r1, &r2);
10414b11b2bSmrg	pixman_region64f_fini (&r2);
10514b11b2bSmrg
10614b11b2bSmrg	/* render region to a1 mask */
10714b11b2bSmrg	image = pixman_image_create_bits (PIXMAN_a1, image_size, image_size, NULL, 0);
10814b11b2bSmrg	pixman_image_set_clip_region64f (image, &r1);
10914b11b2bSmrg	pixman_image_composite64f (PIXMAN_OP_SRC,
11014b11b2bSmrg				   fill, NULL, image,
11114b11b2bSmrg				   0, 0, 0, 0, 0, 0,
11214b11b2bSmrg				   image_size, image_size);
11314b11b2bSmrg	pixman_region64f_init_from_image (&r2, image);
11414b11b2bSmrg
11514b11b2bSmrg	pixman_image_unref (image);
11614b11b2bSmrg
11714b11b2bSmrg	assert (pixman_region64f_equal (&r1, &r2));
11814b11b2bSmrg	pixman_region64f_fini (&r1);
11914b11b2bSmrg	pixman_region64f_fini (&r2);
12014b11b2bSmrg
12114b11b2bSmrg    }
12214b11b2bSmrg    pixman_image_unref (fill);
12314b11b2bSmrg
12414b11b2bSmrg    return 0;
12514b11b2bSmrg}
126