diff options
author | Carl Worth <cworth@cworth.org> | 2007-04-10 10:45:15 -0700 |
---|---|---|
committer | Carl Worth <cworth@cworth.org> | 2007-04-10 10:45:15 -0700 |
commit | b1086caf3b108b0df19f70a2b6df161ad51bb280 (patch) | |
tree | afd4c39feb6628539a37e9ba7155f739ca5520e6 /src/cairo-polygon.c | |
parent | bff45ec9f90b5949a8ffa19cb03c140a08119e4d (diff) | |
download | cairo-b1086caf3b108b0df19f70a2b6df161ad51bb280.tar.gz |
Add a status field to cairo_polygon_t
Now, the functions to add new data to a polygon all become void,
and there's a new _cairo_polygon_status call to query the status
at the end of a sequence of operations.
With this change, we fix many callerswhich were previously not
checking the return values of _cairo_polygon functions by adding
only a single call to _cairo_polygon_status rathern than several
new checks.
Diffstat (limited to 'src/cairo-polygon.c')
-rw-r--r-- | src/cairo-polygon.c | 60 |
1 files changed, 33 insertions, 27 deletions
diff --git a/src/cairo-polygon.c b/src/cairo-polygon.c index 1eb09ec34..e9fc78b79 100644 --- a/src/cairo-polygon.c +++ b/src/cairo-polygon.c @@ -44,6 +44,8 @@ _cairo_polygon_grow (cairo_polygon_t *polygon); void _cairo_polygon_init (cairo_polygon_t *polygon) { + polygon->status = CAIRO_STATUS_SUCCESS; + polygon->num_edges = 0; polygon->edges_size = 0; @@ -65,6 +67,12 @@ _cairo_polygon_fini (cairo_polygon_t *polygon) polygon->has_current_point = FALSE; } +cairo_status_t +_cairo_polygon_status (cairo_polygon_t *polygon) +{ + return polygon->status; +} + /* make room for at least one more edge */ static cairo_status_t _cairo_polygon_grow (cairo_polygon_t *polygon) @@ -102,22 +110,22 @@ _cairo_polygon_grow (cairo_polygon_t *polygon) return CAIRO_STATUS_SUCCESS; } -cairo_status_t +void _cairo_polygon_add_edge (cairo_polygon_t *polygon, cairo_point_t *p1, cairo_point_t *p2) { - cairo_status_t status; cairo_edge_t *edge; + if (polygon->status) + return; + /* drop horizontal edges */ - if (p1->y == p2->y) { + if (p1->y == p2->y) goto DONE; - } if (polygon->num_edges >= polygon->edges_size) { - status = _cairo_polygon_grow (polygon); - if (status) { - return status; - } + polygon->status = _cairo_polygon_grow (polygon); + if (polygon->status) + return; } edge = &polygon->edges[polygon->num_edges]; @@ -134,48 +142,46 @@ _cairo_polygon_add_edge (cairo_polygon_t *polygon, cairo_point_t *p1, cairo_poin polygon->num_edges++; DONE: - return _cairo_polygon_move_to (polygon, p2); + _cairo_polygon_move_to (polygon, p2); } -cairo_status_t +void _cairo_polygon_move_to (cairo_polygon_t *polygon, cairo_point_t *point) { + if (polygon->status) + return; + if (! polygon->has_current_point) polygon->first_point = *point; + polygon->current_point = *point; polygon->has_current_point = TRUE; - - return CAIRO_STATUS_SUCCESS; } -cairo_status_t +void _cairo_polygon_line_to (cairo_polygon_t *polygon, cairo_point_t *point) { - cairo_status_t status; + if (polygon->status) + return; if (polygon->has_current_point) { - status = _cairo_polygon_add_edge (polygon, &polygon->current_point, point); + _cairo_polygon_add_edge (polygon, &polygon->current_point, point); } else { - status = _cairo_polygon_move_to (polygon, point); + _cairo_polygon_move_to (polygon, point); } - - return status; } -cairo_status_t +void _cairo_polygon_close (cairo_polygon_t *polygon) { - cairo_status_t status; + if (polygon->status) + return; if (polygon->has_current_point) { - status = _cairo_polygon_add_edge (polygon, - &polygon->current_point, - &polygon->first_point); - if (status) - return status; + _cairo_polygon_add_edge (polygon, + &polygon->current_point, + &polygon->first_point); polygon->has_current_point = FALSE; } - - return CAIRO_STATUS_SUCCESS; } |