summaryrefslogtreecommitdiff
path: root/src/cairo-polygon-intersect.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-02-09 19:40:26 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2012-02-09 19:44:44 +0000
commit658fa75a5c78c8ca08bc5c1f8f29d50a9da0aaf5 (patch)
treea3d558f345344238efcad55b4ec1388d49a2de24 /src/cairo-polygon-intersect.c
parenta349a312dcf3322d835bc3c58cecedff8914a55a (diff)
downloadcairo-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.c13
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;
}