summaryrefslogtreecommitdiff
path: root/src/cairo-polygon.c
diff options
context:
space:
mode:
authorCarl Worth <cworth@cworth.org>2007-04-10 10:45:15 -0700
committerCarl Worth <cworth@cworth.org>2007-04-10 10:45:15 -0700
commitb1086caf3b108b0df19f70a2b6df161ad51bb280 (patch)
treeafd4c39feb6628539a37e9ba7155f739ca5520e6 /src/cairo-polygon.c
parentbff45ec9f90b5949a8ffa19cb03c140a08119e4d (diff)
downloadcairo-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.c60
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;
}