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