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 (&region);
1171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    box.x1 = random_coord (&region, TRUE);
1191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    box.x2 = box.x1 + prng_rand ();
1201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    box.y1 = random_coord (&region, 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 (&region, &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 (&region, box.x1, box.y1, &rbox);
1401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    crc32 = crc32_box32 (crc32, &rbox);
1411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    r2 = pixman_region32_contains_point (&region, box.x1, box.y2, &rbox);
1421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    crc32 = crc32_box32 (crc32, &rbox);
1431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    r3 = pixman_region32_contains_point (&region, box.x2, box.y1, &rbox);
1441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    crc32 = crc32_box32 (crc32, &rbox);
1451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    r4 = pixman_region32_contains_point (&region, box.x2, box.y2, &rbox);
1461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    crc32 = crc32_box32 (crc32, &rbox);
1471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    r = pixman_region32_contains_rectangle (&region, &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 (&region);
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