diff options
author | Søren Sandmann Pedersen <ssp@redhat.com> | 2012-10-09 03:36:03 -0400 |
---|---|---|
committer | Søren Sandmann Pedersen <ssp@redhat.com> | 2012-10-09 03:36:03 -0400 |
commit | 60277ff2731a71e4d2e366d28fa0080a626c719a (patch) | |
tree | 74cd706125de2d18db294a74c89d5a75caef694c | |
parent | e9c9486d897947aaf672fbb5a9a40f54e87b16a3 (diff) |
Various bug fixes
-rw-r--r-- | region-iter.c | 38 |
1 files changed, 24 insertions, 14 deletions
diff --git a/region-iter.c b/region-iter.c index 74e135d..062164d 100644 --- a/region-iter.c +++ b/region-iter.c @@ -221,11 +221,13 @@ region_builder_add_box (region_builder_t *builder, if (last_box) { if (y1 != last_box->y1) + { region_builder_coalesce_rows (builder); + } else if (x1 == last_box->x2) { last_box->x2 = x2; - return; + return TRUE; } } @@ -234,6 +236,8 @@ region_builder_add_box (region_builder_t *builder, last_box->y1 = y1; last_box->x2 = x2; last_box->y2 = y2; + + return TRUE; } static pixman_bool_t @@ -267,7 +271,9 @@ region_builder_add_row (region_builder_t *builder, const row_t *row) if (last_box) { if (row->y1 != last_box->y1) + { region_builder_coalesce_rows (builder); + } else if (row->first->x1 == last_box->x2) { last_box->x2 = row->first->x2; @@ -292,6 +298,9 @@ region_builder_add_row (region_builder_t *builder, const row_t *row) static pixman_bool_t region_builder_finish (region_builder_t *builder, pixman_region32_t *region) { + if (builder->data == BROKEN_DATA) + return FALSE; + region_builder_coalesce_rows (builder); if (!builder->data || builder->data->numRects == 0) @@ -299,10 +308,6 @@ region_builder_finish (region_builder_t *builder, pixman_region32_t *region) pixman_region32_init (region); return TRUE; } - else if (builder->data == BROKEN_DATA) - { - return FALSE; - } else if (builder->data->numRects == 1) { pixman_box32_t *b = (pixman_box32_t *)(builder->data + 1); @@ -312,21 +317,26 @@ region_builder_finish (region_builder_t *builder, pixman_region32_t *region) } else { - pixman_box32_t extents = { INT32_MAX, INT32_MAX, INT32_MIN, INT32_MIN }; + pixman_box32_t *extents = &(region->extents); int i; + extents->x1 = INT32_MAX; + extents->y1 = INT32_MAX; + extents->x2 = INT32_MIN; + extents->y2 = INT32_MIN; + for (i = 0; i < builder->data->numRects; ++i) { pixman_box32_t *b = (pixman_box32_t *)(builder->data + 1 + i); - if (b->x1 < extents.x1) - extents.x1 = b->x1; - if (b->y1 < extents.y1) - extents.y1 = b->y1; - if (b->x2 > extents.x2) - extents.x2 = b->x2; - if (b->y2 > extents.y2) - extents.y2 = b->y2; + if (b->x1 < extents->x1) + extents->x1 = b->x1; + if (b->y1 < extents->y1) + extents->y1 = b->y1; + if (b->x2 > extents->x2) + extents->x2 = b->x2; + if (b->y2 > extents->y2) + extents->y2 = b->y2; } region->data = builder->data; |