diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-02-09 19:40:26 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2012-02-09 19:44:44 +0000 |
commit | 658fa75a5c78c8ca08bc5c1f8f29d50a9da0aaf5 (patch) | |
tree | a3d558f345344238efcad55b4ec1388d49a2de24 /src/cairo-polygon-intersect.c | |
parent | a349a312dcf3322d835bc3c58cecedff8914a55a (diff) | |
download | cairo-658fa75a5c78c8ca08bc5c1f8f29d50a9da0aaf5.tar.gz |
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 <chris@chris-wilson.co.uk>
Diffstat (limited to 'src/cairo-polygon-intersect.c')
-rw-r--r-- | src/cairo-polygon-intersect.c | 13 |
1 files 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; } |