diff options
author | Søren Sandmann Pedersen <ssp@redhat.com> | 2010-11-07 23:34:36 -0500 |
---|---|---|
committer | Søren Sandmann Pedersen <ssp@redhat.com> | 2010-11-07 23:34:36 -0500 |
commit | 586d895f46964c95b44bbeebf233e18655654569 (patch) | |
tree | 63242591669833a65a8c25692872e2ad7574078e | |
parent | 56376288d796e9b4b4cd9405fd14d03b8d0f2d00 (diff) |
Simplify overlapped iter
-rw-r--r-- | region-iter.c | 60 |
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 (®ion1, 100, 100, 200, 200); pixman_region32_union_rect (®ion1, ®ion1, 100, 400, 200, 50); + dump_region ("input: ", ®ion1); + pixman_region32_init_rect (®ion2, 150, 50, 10, 520); region_op (NULL, ®ion1, ®ion2, INTERSECT); |