region-contains-test.c revision 1176bdada62cabc6ec4b0308a930e83b679d5d36
11176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include <stdlib.h> 21176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include <stdio.h> 31176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include "utils.h" 41176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 51176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic void 61176bdada62cabc6ec4b0308a930e83b679d5d36John Reckmake_random_region (pixman_region32_t *region) 71176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 81176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int n_boxes; 91176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_region32_init (region); 111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck n_boxes = prng_rand_n (64); 131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck while (n_boxes--) 141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int32_t x, y; 161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck uint32_t w, h; 171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck x = (int32_t)prng_rand() >> 2; 191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck y = (int32_t)prng_rand() >> 2; 201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck w = prng_rand() >> 2; 211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck h = prng_rand() >> 2; 221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_region32_union_rect (region, region, x, y, w, h); 241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 271176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic void 281176bdada62cabc6ec4b0308a930e83b679d5d36John Reckprint_box (pixman_box32_t *box) 291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck printf (" %d %d %d %d\n", box->x1, box->y1, box->x2, box->y2); 311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 331176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic int32_t 341176bdada62cabc6ec4b0308a930e83b679d5d36John Reckrandom_coord (pixman_region32_t *region, pixman_bool_t x) 351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_box32_t *b, *bb; 371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int n_boxes; 381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int begin, end; 391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (prng_rand_n (14)) 411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck bb = pixman_region32_rectangles (region, &n_boxes); 431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (n_boxes == 0) 441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck goto use_extent; 451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck b = bb + prng_rand_n (n_boxes); 461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else 481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck use_extent: 501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck b = pixman_region32_extents (region); 511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck n_boxes = 1; 521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (x) 551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck begin = b->x1; 571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck end = b->x2; 581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else 601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck begin = b->y1; 621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck end = b->y2; 631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck switch (prng_rand_n (5)) 661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 0: 681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return begin - prng_rand(); 691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 1: 701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return end + prng_rand (); 711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 2: 721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return end; 731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck case 3: 741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return begin; 751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck default: 761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return (end - begin) / 2 + begin; 771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return 0; 791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 811176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic uint32_t 821176bdada62cabc6ec4b0308a930e83b679d5d36John Reckcompute_crc32_u32 (uint32_t crc32, uint32_t v) 831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (!is_little_endian()) 851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck v = ((v & 0xff000000) >> 24) | 871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck ((v & 0x00ff0000) >> 8) | 881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck ((v & 0x0000ff00) << 8) | 891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck ((v & 0x000000ff) << 24); 901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 911176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return compute_crc32 (crc32, &v, sizeof (int32_t)); 931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 951176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic uint32_t 961176bdada62cabc6ec4b0308a930e83b679d5d36John Reckcrc32_box32 (uint32_t crc32, pixman_box32_t *box) 971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 981176bdada62cabc6ec4b0308a930e83b679d5d36John Reck crc32 = compute_crc32_u32 (crc32, box->x1); 991176bdada62cabc6ec4b0308a930e83b679d5d36John Reck crc32 = compute_crc32_u32 (crc32, box->y1); 1001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck crc32 = compute_crc32_u32 (crc32, box->x2); 1011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck crc32 = compute_crc32_u32 (crc32, box->y2); 1021176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return crc32; 1041176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 1051176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1061176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic uint32_t 1071176bdada62cabc6ec4b0308a930e83b679d5d36John Recktest_region_contains_rectangle (int i, int verbose) 1081176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 1091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_box32_t box; 1101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_box32_t rbox = { 0, 0, 0, 0 }; 1111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_region32_t region; 1121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck uint32_t r, r1, r2, r3, r4, crc32; 1131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck prng_srand (i); 1151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck make_random_region (®ion); 1171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck box.x1 = random_coord (®ion, TRUE); 1191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck box.x2 = box.x1 + prng_rand (); 1201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck box.y1 = random_coord (®ion, FALSE); 1211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck box.y2 = box.y1 + prng_rand (); 1221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (verbose) 1241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 1251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int n_rects; 1261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_box32_t *boxes; 1271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck boxes = pixman_region32_rectangles (®ion, &n_rects); 1291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck printf ("region:\n"); 1311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck while (n_rects--) 1321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck print_box (boxes++); 1331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck printf ("box:\n"); 1341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck print_box (&box); 1351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 1361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck crc32 = 0; 1381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck r1 = pixman_region32_contains_point (®ion, box.x1, box.y1, &rbox); 1401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck crc32 = crc32_box32 (crc32, &rbox); 1411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck r2 = pixman_region32_contains_point (®ion, box.x1, box.y2, &rbox); 1421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck crc32 = crc32_box32 (crc32, &rbox); 1431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck r3 = pixman_region32_contains_point (®ion, box.x2, box.y1, &rbox); 1441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck crc32 = crc32_box32 (crc32, &rbox); 1451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck r4 = pixman_region32_contains_point (®ion, box.x2, box.y2, &rbox); 1461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck crc32 = crc32_box32 (crc32, &rbox); 1471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck r = pixman_region32_contains_rectangle (®ion, &box); 1491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck r = (i << 8) | (r << 4) | (r1 << 3) | (r2 << 2) | (r3 << 1) | (r4 << 0); 1501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck crc32 = compute_crc32_u32 (crc32, r); 1521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (verbose) 1541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck printf ("results: %d %d %d %d %d\n", (r & 0xf0) >> 4, r1, r2, r3, r4); 1551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_region32_fini (®ion); 1571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return crc32; 1591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 1601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1611176bdada62cabc6ec4b0308a930e83b679d5d36John Reckint 1621176bdada62cabc6ec4b0308a930e83b679d5d36John Reckmain (int argc, const char *argv[]) 1631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 1641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return fuzzer_test_main ("region_contains", 1651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1000000, 1661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 0x548E0F3F, 1671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck test_region_contains_rectangle, 1681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck argc, argv); 1691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 170