summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <ssp@l3000.localdomain>2010-07-01 02:24:39 -0400
committerSøren Sandmann Pedersen <ssp@l3000.localdomain>2010-07-01 02:24:39 -0400
commitcbd345945291c328cb8e139fd9f1d1d9983f017a (patch)
treea00766e0d0875a74618d936b7e9ab6a6bf596bed
parentc258c4e582d7138c64be233bfb4fe026751994a2 (diff)
ops
-rw-r--r--region-iter.c55
1 files changed, 35 insertions, 20 deletions
diff --git a/region-iter.c b/region-iter.c
index 14a4b2a..d8142a1 100644
--- a/region-iter.c
+++ b/region-iter.c
@@ -212,6 +212,13 @@ overlapped_iter_get_rows (overlapped_iter_t *iter,
}
/* Segment iter */
+typedef enum
+{
+ ROW1 = 0x01,
+ ROW2 = 0x02,
+ BOTH = 0x03
+} segment_type_t;
+
typedef struct segment_iter_t segment_iter_t;
struct segment_iter_t
{
@@ -235,7 +242,7 @@ segment_iter_init (segment_iter_t *iter,
}
static pixman_bool_t
-segment_iter_get_segment (segment_iter_t *iter, int *x1, int *x2, int *b1, int *b2)
+segment_iter_get_segment (segment_iter_t *iter, int *x1, int *x2, segment_type_t *type)
{
if (iter->p1 == iter->row1_end && iter->p2 == iter->row2_end)
return FALSE;
@@ -244,8 +251,7 @@ segment_iter_get_segment (segment_iter_t *iter, int *x1, int *x2, int *b1, int *
{
*x1 = iter->p2->x1 + iter->x2;
*x2 = iter->p2->x2;
- *b1 = FALSE;
- *b2 = TRUE;
+ *type = ROW2;
iter->p2++;
iter->x2 = 0;
@@ -256,8 +262,7 @@ segment_iter_get_segment (segment_iter_t *iter, int *x1, int *x2, int *b1, int *
{
*x1 = iter->p1->x1 + iter->x1;
*x2 = iter->p1->x2;
- *b1 = TRUE;
- *b2 = FALSE;
+ *type = ROW1;
iter->p1++;
iter->x1 = 0;
@@ -267,8 +272,7 @@ segment_iter_get_segment (segment_iter_t *iter, int *x1, int *x2, int *b1, int *
if (iter->p1->x1 + iter->x1 < iter->p2->x1 + iter->x2)
{
*x1 = iter->p1->x1 + iter->x1;
- *b1 = TRUE;
- *b2 = FALSE;
+ *type = ROW1;
if (iter->p1->x2 <= iter->p2->x1 + iter->x2)
{
@@ -287,8 +291,7 @@ segment_iter_get_segment (segment_iter_t *iter, int *x1, int *x2, int *b1, int *
if (iter->p2->x1 + iter->x2 < iter->p1->x1 + iter->x1)
{
*x1 = iter->p2->x1 + iter->x2;
- *b1 = FALSE;
- *b2 = TRUE;
+ *type = ROW2;
if (iter->p2->x2 <= iter->p1->x1 + iter->x1)
{
@@ -306,8 +309,7 @@ segment_iter_get_segment (segment_iter_t *iter, int *x1, int *x2, int *b1, int *
/* If we get here, the two segments start at the same X */
*x1 = iter->p1->x1 + iter->x1;
- *b1 = TRUE;
- *b2 = TRUE;
+ *type = BOTH;
if (iter->p1->x2 < iter->p2->x2)
{
@@ -333,10 +335,19 @@ segment_iter_get_segment (segment_iter_t *iter, int *x1, int *x2, int *b1, int *
return TRUE;
}
+typedef enum
+{
+ UNION = (1 << BOTH) | (1 << ROW1) | (1 << ROW2),
+ INTERSECT = (1 << BOTH),
+ XOR = (1 << ROW1) | (1 << ROW2),
+ SUBTRACT = (1 << ROW1)
+} ops_t;
+
static void
region_op (pixman_region32_t *dst,
pixman_region32_t *src1,
- pixman_region32_t *src2)
+ pixman_region32_t *src2,
+ ops_t op)
{
overlapped_iter_t iter;
int y1, y2;
@@ -348,23 +359,27 @@ region_op (pixman_region32_t *dst,
const pixman_box32_t *row1_begin, *row1_end;
const pixman_box32_t *row2_begin, *row2_end;
segment_iter_t seg_iter;
- int x1, x2, b1, b2;
+ segment_type_t type;
+ int x1, x2;
overlapped_iter_get_rows (&iter, &row1_begin, &row1_end, &row2_begin, &row2_end, &y1, &y2);
segment_iter_init (&seg_iter, row1_begin, row1_end, row2_begin, row2_end);
- while (segment_iter_get_segment (&seg_iter, &x1, &x2, &b1, &b2))
+ while (segment_iter_get_segment (&seg_iter, &x1, &x2, &type))
{
- if (b1 | b2)
+ if (op & (1 << type))
{
- printf ("box: %d %d (%d %d %d %d) %s\n", b1, b2, x1, y1, x2, y2,
- (x1 == x2 || y1 == y2)? "[empty]" : "");
+ printf ("box at %d %d %d %d %s\n",
+ x1, y1, x2, y2, (x1 == x2 || y1 == y2)? "[empty]" : "");
}
}
}
while (y1 != INT_MAX);
}
+
+
+
static void
dump_region (const char *title, pixman_region32_t *region)
{
@@ -453,7 +468,7 @@ main ()
pixman_region32_init_rect (&region1, 100, 100, 200, 200);
pixman_region32_init_rect (&region2, 200, 200, 200, 200);
- region_op (NULL, &region1, &region2);
+ region_op (NULL, &region1, &region2, UNION);
printf ("-=- op2\n");
pixman_region32_init_rect (&region1, 100, 100, 200, 200);
@@ -461,7 +476,7 @@ main ()
pixman_region32_init_rect (&region2, 150, 50, 10, 520);
- region_op (NULL, &region1, &region2);
+ region_op (NULL, &region1, &region2, INTERSECT);
printf ("-=- op2\n");
pixman_region32_init_rect (&region1, 100, 100, 200, 200);
@@ -470,7 +485,7 @@ main ()
pixman_region32_init_rect (&region2, 150, 50, 10, 520);
pixman_region32_union_rect (&region2, &region2, 10, 10, 342, 23);
- region_op (NULL, &region1, &region2);
+ region_op (NULL, &region1, &region2, XOR);
printf ("-=- dump segments\n");