diff options
author | Søren Sandmann Pedersen <ssp@l3000.localdomain> | 2010-07-01 02:24:39 -0400 |
---|---|---|
committer | Søren Sandmann Pedersen <ssp@l3000.localdomain> | 2010-07-01 02:24:39 -0400 |
commit | cbd345945291c328cb8e139fd9f1d1d9983f017a (patch) | |
tree | a00766e0d0875a74618d936b7e9ab6a6bf596bed | |
parent | c258c4e582d7138c64be233bfb4fe026751994a2 (diff) |
ops
-rw-r--r-- | region-iter.c | 55 |
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 (®ion1, 100, 100, 200, 200); pixman_region32_init_rect (®ion2, 200, 200, 200, 200); - region_op (NULL, ®ion1, ®ion2); + region_op (NULL, ®ion1, ®ion2, UNION); printf ("-=- op2\n"); pixman_region32_init_rect (®ion1, 100, 100, 200, 200); @@ -461,7 +476,7 @@ main () pixman_region32_init_rect (®ion2, 150, 50, 10, 520); - region_op (NULL, ®ion1, ®ion2); + region_op (NULL, ®ion1, ®ion2, INTERSECT); printf ("-=- op2\n"); pixman_region32_init_rect (®ion1, 100, 100, 200, 200); @@ -470,7 +485,7 @@ main () pixman_region32_init_rect (®ion2, 150, 50, 10, 520); pixman_region32_union_rect (®ion2, ®ion2, 10, 10, 342, 23); - region_op (NULL, ®ion1, ®ion2); + region_op (NULL, ®ion1, ®ion2, XOR); printf ("-=- dump segments\n"); |