summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <ssp@redhat.com>2012-10-09 03:36:03 -0400
committerSøren Sandmann Pedersen <ssp@redhat.com>2012-10-09 03:36:03 -0400
commit60277ff2731a71e4d2e366d28fa0080a626c719a (patch)
tree74cd706125de2d18db294a74c89d5a75caef694c
parente9c9486d897947aaf672fbb5a9a40f54e87b16a3 (diff)
Various bug fixes
-rw-r--r--region-iter.c38
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;