From 658fa75a5c78c8ca08bc5c1f8f29d50a9da0aaf5 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Thu, 9 Feb 2012 19:40:26 +0000 Subject: [PATCH] polygon: Extend intersection edges to cover entire range By simply swapping the continuation edges, we end up with a set of edges that are defined over a shorter range than their extents. Whilst this is numerically stable at our normal precision we start to encounter issues when using a coarser grid during rasterisation as the derivative of the edge becomes unstable. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=44722 Signed-off-by: Chris Wilson --- src/cairo-polygon-intersect.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/cairo-polygon-intersect.c b/src/cairo-polygon-intersect.c index 573f801a7..0e5b0b972 100644 --- a/src/cairo-polygon-intersect.c +++ b/src/cairo-polygon-intersect.c @@ -1179,8 +1179,17 @@ edges_start_or_continue (cairo_bo_edge_t *left, if (left->deferred.other != NULL) { if (right != NULL && edges_colinear (left->deferred.other, right)) { - /* continuation on right, so just swap edges */ - assert (left->deferred.other->deferred.other == NULL); + cairo_bo_edge_t *old = left->deferred.other; + + /* continuation on right, extend right to cover both */ + assert (old->deferred.other == NULL); + assert (old->edge.dir == right->edge.dir); + assert (old->edge.line.p2.y > old->edge.line.p1.y); + + if (old->edge.line.p1.y < right->edge.line.p1.y) + right->edge.line.p1 = old->edge.line.p1; + if (old->edge.line.p2.y > right->edge.line.p2.y) + right->edge.line.p2 = old->edge.line.p2; left->deferred.other = right; return; }