diff options
-rw-r--r-- | src/gpu/GrTessellator.cpp | 7 | ||||
-rw-r--r-- | tests/TessellatingPathRendererTests.cpp | 17 |
2 files changed, 24 insertions, 0 deletions
diff --git a/src/gpu/GrTessellator.cpp b/src/gpu/GrTessellator.cpp index 78616d4e2f..3424ee3f91 100644 --- a/src/gpu/GrTessellator.cpp +++ b/src/gpu/GrTessellator.cpp @@ -1110,21 +1110,28 @@ bool intersect_edge_pair(Edge* left, Edge* right, EdgeList* activeEdges, Vertex* if (!left->fTop || !left->fBottom || !right->fTop || !right->fBottom) { return false; } + if (left->fTop == right->fTop || left->fBottom == right->fBottom) { + return false; + } if (c.sweep_lt(left->fTop->fPoint, right->fTop->fPoint)) { if (!left->isLeftOf(right->fTop)) { + rewind(activeEdges, current, right->fTop, c); return split_edge(left, right->fTop, activeEdges, current, c, alloc); } } else { if (!right->isRightOf(left->fTop)) { + rewind(activeEdges, current, left->fTop, c); return split_edge(right, left->fTop, activeEdges, current, c, alloc); } } if (c.sweep_lt(right->fBottom->fPoint, left->fBottom->fPoint)) { if (!left->isLeftOf(right->fBottom)) { + rewind(activeEdges, current, right->fBottom, c); return split_edge(left, right->fBottom, activeEdges, current, c, alloc); } } else { if (!right->isRightOf(left->fBottom)) { + rewind(activeEdges, current, left->fBottom, c); return split_edge(right, left->fBottom, activeEdges, current, c, alloc); } } diff --git a/tests/TessellatingPathRendererTests.cpp b/tests/TessellatingPathRendererTests.cpp index 2891131f90..4b3b321f17 100644 --- a/tests/TessellatingPathRendererTests.cpp +++ b/tests/TessellatingPathRendererTests.cpp @@ -584,6 +584,22 @@ static SkPath create_path_40() { return path; } +// Reduction from crbug.com/860453. Tests a case where a "missing" intersection +// requires the active edge list to go out-of-order. +static SkPath create_path_41() { + SkPath path; + path.moveTo(72154931603311689728.0, 330.95965576171875); + path.lineTo(24053266013925408768.0, 78.11376953125); + path.lineTo(1.2031099003292404941e+20, 387.168731689453125); + path.lineTo(68859835992355373056.0, 346.55047607421875); + path.lineTo(76451708695451009024.0, 337.780029296875); + path.moveTo(-20815817797613387776.0, 18065700622522384384.0); + path.lineTo(-72144121204987396096.0, 142.855804443359375); + path.lineTo(72144121204987396096.0, 325.184783935546875); + path.lineTo(1.2347242901040791552e+20, 18065700622522384384.0); + return path; +} + static std::unique_ptr<GrFragmentProcessor> create_linear_gradient_processor(GrContext* ctx) { SkPoint pts[2] = { {0, 0}, {1, 1} }; @@ -684,4 +700,5 @@ DEF_GPUTEST_FOR_ALL_CONTEXTS(TessellatingPathRendererTests, reporter, ctxInfo) { test_path(ctx, rtc.get(), create_path_38(), SkMatrix(), GrAAType::kCoverage); test_path(ctx, rtc.get(), create_path_39()); test_path(ctx, rtc.get(), create_path_40()); + test_path(ctx, rtc.get(), create_path_41(), SkMatrix(), GrAAType::kCoverage); } |