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