diff options
author | Søren Sandmann Pedersen <ssp@l3000.localdomain> | 2010-11-11 00:16:42 -0500 |
---|---|---|
committer | Søren Sandmann Pedersen <ssp@l3000.localdomain> | 2010-11-11 00:16:42 -0500 |
commit | 17f5ea24b8ba8c283ac79da1f222a33e95ebc887 (patch) | |
tree | 134f914704b004fa795305d652991f0e546a7109 | |
parent | 20da3be10ac3bcf98aa195a81079a3f704f751f9 (diff) |
builder
-rw-r--r-- | region-iter.c | 44 |
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; |