summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <ssp@l3000.localdomain>2010-11-11 00:16:42 -0500
committerSøren Sandmann Pedersen <ssp@l3000.localdomain>2010-11-11 00:16:42 -0500
commit17f5ea24b8ba8c283ac79da1f222a33e95ebc887 (patch)
tree134f914704b004fa795305d652991f0e546a7109
parent20da3be10ac3bcf98aa195a81079a3f704f751f9 (diff)
builder
-rw-r--r--region-iter.c44
1 files changed, 35 insertions, 9 deletions
diff --git a/region-iter.c b/region-iter.c
index 596dd96..a66cb79 100644
--- a/region-iter.c
+++ b/region-iter.c
@@ -62,6 +62,7 @@ typedef struct region_builder_t region_builder_t;
struct region_builder_t
{
pixman_region32_data_t * data;
+ pixman_box32_t * last_row;
};
static size_t
@@ -104,24 +105,49 @@ static void
region_builder_init (region_builder_t *builder)
{
builder->data = NULL;
+ builder->last_row = NULL;
}
static pixman_bool_t
-region_builder_add_boxes (region_builder_t *builder,
- int n, pixman_box32_t *boxes)
+region_builder_add_row (region_builder_t *builder,
+ int n, pixman_box32_t *boxes)
{
pixman_region32_data_t *data;
+ pixman_box32_t *box, *end;
- if (builder->data == BROKEN_DATA)
+ data = builder->data;
+ if (data == BROKEN_DATA)
return FALSE;
- data = region_data_append (builder->data, n, boxes);
-
- if (!data)
+ end = boxes + n;
+ box = boxes;
+ while (box < end)
{
- free (builder->data);
- builder->data = BROKEN_DATA;
- return FALSE;
+ pixman_box32_t *next = box + 1;
+
+ if (next == end || next->x1 > box->x2)
+ {
+ int n_rects;
+
+ if (!(data = region_data_append (data, 1)))
+ {
+ free (builder->data);
+ builder->data = BROKEN_DATA;
+ return FALSE;
+ }
+
+ n_rects = data->numRects;
+ b = (pixman_box32_t *)(data + 1);
+ b[n_rects].y1 = boxes->y1;
+ b[n_rects].y2 = boxes->y2;
+ b[n_rects].x1 = boxes->x1;
+ n[n_rects].x2 = box->x2;
+ data->numRects++;
+
+ boxes = next;
+ }
+
+ box = next;
}
builder->data = data;