summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <ssp@redhat.com>2010-11-07 23:34:36 -0500
committerSøren Sandmann Pedersen <ssp@redhat.com>2010-11-07 23:34:36 -0500
commit586d895f46964c95b44bbeebf233e18655654569 (patch)
tree63242591669833a65a8c25692872e2ad7574078e
parent56376288d796e9b4b4cd9405fd14d03b8d0f2d00 (diff)
Simplify overlapped iter
-rw-r--r--region-iter.c60
1 files changed, 24 insertions, 36 deletions
diff --git a/region-iter.c b/region-iter.c
index 8efb395..1f7c3e9 100644
--- a/region-iter.c
+++ b/region-iter.c
@@ -18,6 +18,7 @@ typedef enum
{
FIRST,
MIDDLE,
+ EMPTY_ROW,
FINAL,
DONE
} state_t;
@@ -154,6 +155,9 @@ region_iter_get_row (region_iter_t *iter, row_t *row)
if (box != iter->u.middle.last)
{
+ if (box->y1 != row->y2)
+ iter->state = EMPTY_ROW;
+
iter->u.middle.first = box;
}
else
@@ -162,6 +166,15 @@ region_iter_get_row (region_iter_t *iter, row_t *row)
iter->u.final.y1 = row->y2;
}
break;
+
+ case EMPTY_ROW:
+ row->y1 = (iter->u.middle.first - 1)->y2;
+ row->y2 = iter->u.middle.first->y1;
+ row->first = NULL;
+ row->last = NULL;
+
+ iter->state = MIDDLE;
+ break;
case FINAL:
row->first = NULL;
@@ -199,49 +212,22 @@ overlapped_iter_init (overlapped_iter_t *iter,
region_iter_get_row (&iter->iter2, &iter->row2);
}
+#define MIN(a,b) (((a) < (b)) ? (a) : (b))
+
static pixman_bool_t
overlapped_iter_get_rows (overlapped_iter_t *iter, row_t *row1, row_t *row2)
{
- int y1, y2;
+ int m;
- row1->first = iter->row1.first;
- row1->last = iter->row1.last;
- row2->first = iter->row2.first;
- row2->last = iter->row2.last;
+ *row1 = iter->row1;
+ *row2 = iter->row2;
- if (iter->row1.y1 < iter->row2.y1)
- {
- y1 = iter->row1.y1;
- y2 = iter->row2.y1;
+ m = MIN (iter->row1.y2, iter->row2.y2);
- iter->row1.y1 = iter->row2.y1;
- }
- else if (iter->row2.y1 < iter->row1.y1)
- {
- y1 = iter->row2.y1;
- y2 = iter->row1.y1;
+ row1->y1 = row2->y1 = iter->row1.y1;
+ row1->y2 = row2->y2 = m;
- iter->row2.y1 = iter->row1.y1;
- }
- else if (iter->row1.y2 < iter->row2.y2)
- {
- y1 = iter->row1.y1;
- y2 = iter->row1.y2;
-
- iter->row1.y1 = iter->row1.y2;
- iter->row2.y1 = iter->row1.y2;
- }
- else
- {
- y1 = iter->row2.y1;
- y2 = iter->row2.y2;
-
- iter->row2.y1 = iter->row2.y2;
- iter->row1.y1 = iter->row2.y2;
- }
-
- row1->y1 = row2->y1 = y1;
- row1->y2 = row2->y2 = y2;
+ iter->row2.y1 = iter->row1.y1 = m;
if (iter->row1.y1 == iter->row1.y2)
{
@@ -681,6 +667,8 @@ main ()
pixman_region32_init_rect (&region1, 100, 100, 200, 200);
pixman_region32_union_rect (&region1, &region1, 100, 400, 200, 50);
+ dump_region ("input: ", &region1);
+
pixman_region32_init_rect (&region2, 150, 50, 10, 520);
region_op (NULL, &region1, &region2, INTERSECT);