summaryrefslogtreecommitdiff
path: root/src/cairo-bentley-ottmann.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-08-26 00:16:33 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2012-08-26 11:16:32 +0100
commit535b4e970cdbb459be621cecafd7f91ca4698396 (patch)
tree4218373edb5e38ad5042741318f068ac261e595c /src/cairo-bentley-ottmann.c
parentb66065537cec5f03b33f7513f06e26630c28b5f1 (diff)
downloadcairo-535b4e970cdbb459be621cecafd7f91ca4698396.tar.gz
bentley-ottman: Remove a few superfluous status propagation
For the traps it is simpler if we report the status at the end, and no-op the accumulation of the trap after hitting the error condition. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'src/cairo-bentley-ottmann.c')
-rw-r--r--src/cairo-bentley-ottmann.c69
1 files changed, 21 insertions, 48 deletions
diff --git a/src/cairo-bentley-ottmann.c b/src/cairo-bentley-ottmann.c
index 38fe46341..fdb274420 100644
--- a/src/cairo-bentley-ottmann.c
+++ b/src/cairo-bentley-ottmann.c
@@ -562,7 +562,7 @@ _line_equal (const cairo_line_t *a, const cairo_line_t *b)
}
static int
-_cairo_bo_sweep_line_compare_edges (cairo_bo_sweep_line_t *sweep_line,
+_cairo_bo_sweep_line_compare_edges (const cairo_bo_sweep_line_t *sweep_line,
const cairo_bo_edge_t *a,
const cairo_bo_edge_t *b)
{
@@ -1118,7 +1118,7 @@ _cairo_bo_sweep_line_init (cairo_bo_sweep_line_t *sweep_line)
sweep_line->current_edge = NULL;
}
-static cairo_status_t
+static void
_cairo_bo_sweep_line_insert (cairo_bo_sweep_line_t *sweep_line,
cairo_bo_edge_t *edge)
{
@@ -1175,8 +1175,6 @@ _cairo_bo_sweep_line_insert (cairo_bo_sweep_line_t *sweep_line,
}
sweep_line->current_edge = edge;
-
- return CAIRO_STATUS_SUCCESS;
}
static void
@@ -1344,7 +1342,7 @@ edges_colinear (const cairo_bo_edge_t *a, const cairo_bo_edge_t *b)
}
/* Adds the trapezoid, if any, of the left edge to the #cairo_traps_t */
-static cairo_status_t
+static void
_cairo_bo_edge_end_trap (cairo_bo_edge_t *left,
int32_t bot,
cairo_traps_t *traps)
@@ -1376,8 +1374,6 @@ _cairo_bo_edge_end_trap (cairo_bo_edge_t *left,
}
trap->right = NULL;
-
- return _cairo_traps_status (traps);
}
@@ -1386,16 +1382,14 @@ _cairo_bo_edge_end_trap (cairo_bo_edge_t *left,
* then either add it to the traps in `traps', if the trapezoid's
* right edge differs from `edge->next', or do nothing if the new
* trapezoid would be a continuation of the existing one. */
-static inline cairo_status_t
+static inline void
_cairo_bo_edge_start_or_continue_trap (cairo_bo_edge_t *left,
cairo_bo_edge_t *right,
int top,
cairo_traps_t *traps)
{
- cairo_status_t status;
-
if (left->deferred_trap.right == right)
- return CAIRO_STATUS_SUCCESS;
+ return;
assert (right);
if (left->deferred_trap.right != NULL) {
@@ -1403,12 +1397,10 @@ _cairo_bo_edge_start_or_continue_trap (cairo_bo_edge_t *left,
{
/* continuation on right, so just swap edges */
left->deferred_trap.right = right;
- return CAIRO_STATUS_SUCCESS;
+ return;
}
- status = _cairo_bo_edge_end_trap (left, top, traps);
- if (unlikely (status))
- return status;
+ _cairo_bo_edge_end_trap (left, top, traps);
}
if (! edges_colinear (left, right)) {
@@ -1422,18 +1414,15 @@ _cairo_bo_edge_start_or_continue_trap (cairo_bo_edge_t *left,
top);
#endif
}
-
- return CAIRO_STATUS_SUCCESS;
}
-static inline cairo_status_t
+static inline void
_active_edges_to_traps (cairo_bo_edge_t *pos,
int32_t top,
unsigned mask,
cairo_traps_t *traps)
{
cairo_bo_edge_t *left;
- cairo_status_t status;
int in_out;
@@ -1457,9 +1446,7 @@ _active_edges_to_traps (cairo_bo_edge_t *pos,
}
else
{
- status = _cairo_bo_edge_end_trap (pos, top, traps);
- if (unlikely (status))
- return status;
+ _cairo_bo_edge_end_trap (pos, top, traps);
}
}
@@ -1467,22 +1454,15 @@ _active_edges_to_traps (cairo_bo_edge_t *pos,
if ((in_out & mask) == 0) {
/* skip co-linear edges */
if (pos->next == NULL || ! edges_colinear (pos, pos->next)) {
- status = _cairo_bo_edge_start_or_continue_trap (left, pos,
- top, traps);
- if (unlikely (status))
- return status;
-
+ _cairo_bo_edge_start_or_continue_trap (left, pos, top, traps);
left = pos->next;
}
}
pos = pos->next;
}
-
- return CAIRO_STATUS_SUCCESS;
}
-
/* Execute a single pass of the Bentley-Ottmann algorithm on edges,
* generating trapezoids according to the fill_rule and appending them
* to traps. */
@@ -1493,7 +1473,7 @@ _cairo_bentley_ottmann_tessellate_bo_edges (cairo_bo_event_t **start_events,
cairo_traps_t *traps,
int *num_intersections)
{
- cairo_status_t status = CAIRO_STATUS_SUCCESS; /* silence compiler */
+ cairo_status_t status;
int intersection_count = 0;
cairo_bo_event_queue_t event_queue;
cairo_bo_sweep_line_t sweep_line;
@@ -1534,20 +1514,16 @@ _cairo_bentley_ottmann_tessellate_bo_edges (cairo_bo_event_t **start_events,
if (event->point.y != sweep_line.current_y) {
for (e1 = sweep_line.stopped; e1; e1 = e1->next) {
if (e1->deferred_trap.right != NULL) {
- status = _cairo_bo_edge_end_trap (e1,
- e1->edge.bottom,
- traps);
- if (unlikely (status))
- goto unwind;
+ _cairo_bo_edge_end_trap (e1,
+ e1->edge.bottom,
+ traps);
}
}
sweep_line.stopped = NULL;
- status = _active_edges_to_traps (sweep_line.head,
- sweep_line.current_y,
- fill_rule, traps);
- if (unlikely (status))
- goto unwind;
+ _active_edges_to_traps (sweep_line.head,
+ sweep_line.current_y,
+ fill_rule, traps);
sweep_line.current_y = event->point.y;
}
@@ -1565,9 +1541,7 @@ _cairo_bentley_ottmann_tessellate_bo_edges (cairo_bo_event_t **start_events,
case CAIRO_BO_EVENT_TYPE_START:
e1 = &((cairo_bo_start_event_t *) event)->edge;
- status = _cairo_bo_sweep_line_insert (&sweep_line, e1);
- if (unlikely (status))
- goto unwind;
+ _cairo_bo_sweep_line_insert (&sweep_line, e1);
status = _cairo_bo_event_queue_insert_stop (&event_queue, e1);
if (unlikely (status))
@@ -1670,11 +1644,10 @@ _cairo_bentley_ottmann_tessellate_bo_edges (cairo_bo_event_t **start_events,
*num_intersections = intersection_count;
for (e1 = sweep_line.stopped; e1; e1 = e1->next) {
if (e1->deferred_trap.right != NULL) {
- status = _cairo_bo_edge_end_trap (e1, e1->edge.bottom, traps);
- if (unlikely (status))
- break;
+ _cairo_bo_edge_end_trap (e1, e1->edge.bottom, traps);
}
}
+ status = traps->status;
unwind:
_cairo_bo_event_queue_fini (&event_queue);
@@ -1691,7 +1664,6 @@ _cairo_bentley_ottmann_tessellate_polygon (cairo_traps_t *traps,
cairo_fill_rule_t fill_rule)
{
int intersections;
- cairo_status_t status;
cairo_bo_start_event_t stack_events[CAIRO_STACK_ARRAY_LENGTH (cairo_bo_start_event_t)];
cairo_bo_start_event_t *events;
cairo_bo_event_t *stack_event_ptrs[ARRAY_LENGTH (stack_events) + 1];
@@ -1699,6 +1671,7 @@ _cairo_bentley_ottmann_tessellate_polygon (cairo_traps_t *traps,
cairo_bo_start_event_t *stack_event_y[64];
cairo_bo_start_event_t **event_y = NULL;
int i, num_events, y, ymin, ymax;
+ cairo_status_t status;
num_events = polygon->num_edges;
if (unlikely (0 == num_events))