11176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include <assert.h>
21176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include <stdlib.h>
31176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include <stdio.h>
41176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include "utils.h"
51176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
61176bdada62cabc6ec4b0308a930e83b679d5d36John Reckint
71176bdada62cabc6ec4b0308a930e83b679d5d36John Reckmain ()
81176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{
91176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_region32_t r1;
101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_region32_t r2;
111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_region32_t r3;
121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_box32_t boxes[] = {
131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	{ 10, 10, 20, 20 },
141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	{ 30, 30, 30, 40 },
151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	{ 50, 45, 60, 44 },
161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    };
171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_box32_t boxes2[] = {
181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	{ 2, 6, 7, 6 },
191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	{ 4, 1, 6, 7 },
201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    };
211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_box32_t boxes3[] = {
221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	{ 2, 6, 7, 6 },
231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	{ 4, 1, 6, 1 },
241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    };
251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    int i, j;
261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_box32_t *b;
271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_image_t *image, *fill;
281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_color_t white = {
291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	0xffff,
301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	0xffff,
311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	0xffff,
321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	0xffff
331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    };
341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    prng_srand (0);
361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    /* This used to go into an infinite loop before pixman-region.c
381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck     * was fixed to not use explict "short" variables
391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck     */
401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_region32_init_rect (&r1, 0, 0, 20, 64000);
411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_region32_init_rect (&r2, 0, 0, 20, 64000);
421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_region32_init_rect (&r3, 0, 0, 20, 64000);
431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_region32_subtract (&r1, &r2, &r3);
451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    /* This would produce a region containing an empty
481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck     * rectangle in it. Such regions are considered malformed,
491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck     * but using an empty rectangle for initialization should
501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck     * work.
511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck     */
521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_region32_init_rects (&r1, boxes, 3);
531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    b = pixman_region32_rectangles (&r1, &i);
551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    assert (i == 1);
571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    while (i--)
591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    {
601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	assert (b[i].x1 < b[i].x2);
611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	assert (b[i].y1 < b[i].y2);
621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    }
631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    /* This would produce a rectangle containing the bounding box
651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck     * of the two rectangles. The correct result is to eliminate
661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck     * the broken rectangle.
671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck     */
681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_region32_init_rects (&r1, boxes2, 2);
691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    b = pixman_region32_rectangles (&r1, &i);
711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    assert (i == 1);
731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    assert (b[0].x1 == 4);
751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    assert (b[0].y1 == 1);
761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    assert (b[0].x2 == 6);
771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    assert (b[0].y2 == 7);
781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    /* This should produce an empty region */
801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_region32_init_rects (&r1, boxes3, 2);
811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    b = pixman_region32_rectangles (&r1, &i);
831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    assert (i == 0);
851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    fill = pixman_image_create_solid_fill (&white);
871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    for (i = 0; i < 100; i++)
881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    {
891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	int image_size = 128;
901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
911176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	pixman_region32_init (&r1);
921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	/* Add some random rectangles */
941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	for (j = 0; j < 64; j++)
951176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	    pixman_region32_union_rect (&r1, &r1,
961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck					prng_rand_n (image_size),
971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck					prng_rand_n (image_size),
981176bdada62cabc6ec4b0308a930e83b679d5d36John Reck					prng_rand_n (25),
991176bdada62cabc6ec4b0308a930e83b679d5d36John Reck					prng_rand_n (25));
1001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	/* Clip to image size */
1021176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	pixman_region32_init_rect (&r2, 0, 0, image_size, image_size);
1031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	pixman_region32_intersect (&r1, &r1, &r2);
1041176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	pixman_region32_fini (&r2);
1051176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1061176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	/* render region to a1 mask */
1071176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	image = pixman_image_create_bits (PIXMAN_a1, image_size, image_size, NULL, 0);
1081176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	pixman_image_set_clip_region32 (image, &r1);
1091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	pixman_image_composite32 (PIXMAN_OP_SRC,
1101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck				  fill, NULL, image,
1111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck				  0, 0, 0, 0, 0, 0,
1121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck				  image_size, image_size);
1131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	pixman_region32_init_from_image (&r2, image);
1141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	pixman_image_unref (image);
1161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	assert (pixman_region32_equal (&r1, &r2));
1181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	pixman_region32_fini (&r1);
1191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	pixman_region32_fini (&r2);
1201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    }
1221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_image_unref (fill);
1231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    return 0;
1251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck}
126