summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <ssp@redhat.com>2010-08-14 05:05:18 -0400
committerSøren Sandmann Pedersen <ssp@redhat.com>2010-08-14 05:05:18 -0400
commit0a9bf70c593d4133ad614789c7e7790de0c19776 (patch)
treefaa33b77d4c9eef0391588114e8ff29b58a4c4a7
parent630752f0c3c225b6461d83e2ed500901e651b832 (diff)
row type
-rw-r--r--region-iter.c111
1 files changed, 53 insertions, 58 deletions
diff --git a/region-iter.c b/region-iter.c
index ea9b31e..39477c7 100644
--- a/region-iter.c
+++ b/region-iter.c
@@ -12,6 +12,7 @@ static const pixman_box32_t sentinel =
};
typedef struct region_iter_t region_iter_t;
+typedef struct row_t row_t;
struct region_iter_t
{
@@ -21,6 +22,14 @@ struct region_iter_t
const pixman_box32_t * last;
};
+struct row_t
+{
+ const pixman_box32_t * first;
+ const pixman_box32_t * last;
+ int y1;
+ int y2;
+};
+
/* region_data manipulation */
static size_t
next_power (size_t n)
@@ -83,10 +92,7 @@ region_iter_init (region_iter_t *iter, pixman_region32_t *region)
}
static void
-region_iter_get_row (region_iter_t *iter,
- const pixman_box32_t **first,
- const pixman_box32_t **last,
- int *y1, int *y2)
+region_iter_get_row (region_iter_t *iter, row_t *row)
{
/* We always want an initial row of 0 boxes, so we
* need 'first_row' to deal with the case where the
@@ -94,10 +100,10 @@ region_iter_get_row (region_iter_t *iter,
*/
if (iter->first_row || iter->y < iter->first->y1)
{
- *first = NULL;
- *last = NULL;
- *y1 = iter->y;
- *y2 = iter->first->y1;
+ row->first = NULL;
+ row->last = NULL;
+ row->y1 = iter->y;
+ row->y2 = iter->first->y1;
iter->y = iter->first->y1;
iter->first_row = FALSE;
@@ -112,10 +118,10 @@ region_iter_get_row (region_iter_t *iter,
break;
}
- *first = iter->first;
- *last = box;
- *y1 = iter->y;
- *y2 = iter->first->y2;
+ row->first = iter->first;
+ row->last = box;
+ row->y1 = iter->y;
+ row->y2 = iter->first->y2;
iter->y = iter->first->y2;
@@ -137,10 +143,8 @@ struct overlapped_iter_t
{
region_iter_t iter1;
region_iter_t iter2;
- const pixman_box32_t *row1_first, *row1_last;
- int row1_y1, row1_y2;
- const pixman_box32_t *row2_first, *row2_last;
- int row2_y1, row2_y2;
+ row_t row1;
+ row_t row2;
};
static void
@@ -150,10 +154,8 @@ overlapped_iter_init (overlapped_iter_t *iter,
region_iter_init (&iter->iter1, region1);
region_iter_init (&iter->iter2, region2);
- region_iter_get_row (
- &iter->iter1, &iter->row1_first, &iter->row1_last, &iter->row1_y1, &iter->row1_y2);
- region_iter_get_row (
- &iter->iter2, &iter->row2_first, &iter->row2_last, &iter->row2_y1, &iter->row2_y2);
+ region_iter_get_row (&iter->iter1, &iter->row1);
+ region_iter_get_row (&iter->iter2, &iter->row2);
}
static void
@@ -162,53 +164,47 @@ overlapped_iter_get_rows (overlapped_iter_t *iter,
const pixman_box32_t **row2_begin, const pixman_box32_t **row2_end,
int *y1, int *y2)
{
- *row1_begin = iter->row1_first;
- *row1_end = iter->row1_last;
- *row2_begin = iter->row2_first;
- *row2_end = iter->row2_last;
+ *row1_begin = iter->row1.first;
+ *row1_end = iter->row1.last;
+ *row2_begin = iter->row2.first;
+ *row2_end = iter->row2.last;
- if (iter->row1_y1 < iter->row2_y1)
+ if (iter->row1.y1 < iter->row2.y1)
{
- *y1 = iter->row1_y1;
- *y2 = iter->row2_y1;
+ *y1 = iter->row1.y1;
+ *y2 = iter->row2.y1;
- iter->row1_y1 = iter->row2_y1;
+ iter->row1.y1 = iter->row2.y1;
}
- else if (iter->row2_y1 < iter->row1_y1)
+ else if (iter->row2.y1 < iter->row1.y1)
{
- *y1 = iter->row2_y1;
- *y2 = iter->row1_y1;
+ *y1 = iter->row2.y1;
+ *y2 = iter->row1.y1;
- iter->row2_y1 = iter->row1_y1;
+ iter->row2.y1 = iter->row1.y1;
}
- else if (iter->row1_y2 < iter->row2_y2)
+ else if (iter->row1.y2 < iter->row2.y2)
{
- *y1 = iter->row1_y1;
- *y2 = iter->row1_y2;
+ *y1 = iter->row1.y1;
+ *y2 = iter->row1.y2;
- iter->row1_y1 = iter->row1_y2;
- iter->row2_y1 = iter->row1_y2;
+ iter->row1.y1 = iter->row1.y2;
+ iter->row2.y1 = iter->row1.y2;
}
else
{
- *y1 = iter->row2_y1;
- *y2 = iter->row2_y2;
+ *y1 = iter->row2.y1;
+ *y2 = iter->row2.y2;
- iter->row2_y1 = iter->row2_y2;
- iter->row1_y1 = iter->row2_y2;
+ iter->row2.y1 = iter->row2.y2;
+ iter->row1.y1 = iter->row2.y2;
}
- if (iter->row1_y1 == iter->row1_y2)
- {
- region_iter_get_row (
- &iter->iter1, &iter->row1_first, &iter->row1_last, &iter->row1_y1, &iter->row1_y2);
- }
+ if (iter->row1.y1 == iter->row1.y2)
+ region_iter_get_row (&iter->iter1, &iter->row1);
- if (iter->row2_y1 == iter->row2_y2)
- {
- region_iter_get_row (
- &iter->iter2, &iter->row2_first, &iter->row2_last, &iter->row2_y1, &iter->row2_y2);
- }
+ if (iter->row2.y1 == iter->row2.y2)
+ region_iter_get_row (&iter->iter2, &iter->row2);
}
/* Segment iter */
@@ -380,9 +376,8 @@ region_op (pixman_region32_t *dst,
static void
dump_region (const char *title, pixman_region32_t *region)
{
- const pixman_box32_t *first, *last;
region_iter_t iter;
- int y1, y2;
+ row_t row;
printf ("-=- %s\n", title);
region_iter_init (&iter, region);
@@ -390,16 +385,16 @@ dump_region (const char *title, pixman_region32_t *region)
{
int n_boxes;
- region_iter_get_row (&iter, &first, &last, &y1, &y2);
+ region_iter_get_row (&iter, &row);
- if (first == &sentinel)
+ if (row.first == &sentinel)
n_boxes = 0;
else
- n_boxes = last - first;
+ n_boxes = row.last - row.first;
- printf ("Row of %d boxes %d %d\n", n_boxes, y1, y2);
+ printf ("Row of %d boxes %d %d\n", n_boxes, row.y1, row.y2);
}
- while (y1 != INT_MAX);
+ while (row.y1 != INT_MAX);
}
int