aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Mike Klein <mtklein@google.com>2018-06-29 18:26:05 +0000
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-06-29 18:26:18 +0000
commita898f04e68536b56ad18523c0ee2cc6eade3efe9 (patch)
tree06de2f672a2b4f1fd6bd284695a268b16d5a9881
parent6dcd716293dd41cb1e8215fb1060ed548614aefc (diff)
Revert "GrTessellator: handle three consecutive collinear edges."
This reverts commit 26bb0e66f28c41cb1e8e39f00d848997fd33d97c. Reason for revert: segfaulty Here's a log with a stacktrace: https://chromium-swarm.appspot.com/task?id=3e658f7aa40dbb10&refresh=10 Original change's description: > GrTessellator: handle three consecutive collinear edges. > > In some cases, splitting may produce three consecutive edges which > are collinear. The first one was being merged out, causing the third > one to be missed. > > The fix is to switch the arguments to merge_edges_*, ensuring that the > second parameter (the destination edge) is never merged out. > > Bug: 851409. > Change-Id: I70fbbc506e97a26b259c1443b6d1787adec0f9b0 > Reviewed-on: https://skia-review.googlesource.com/138561 > Reviewed-by: Robert Phillips <robertphillips@google.com> > Commit-Queue: Stephen White <senorblanco@chromium.org> TBR=robertphillips@google.com,senorblanco@chromium.org Change-Id: I6ecfb4c487d6f96e9fae7b8b40d74162354ed57c No-Presubmit: true No-Tree-Checks: true No-Try: true Bug: 851409. Reviewed-on: https://skia-review.googlesource.com/138640 Reviewed-by: Mike Klein <mtklein@google.com> Commit-Queue: Mike Klein <mtklein@google.com>
-rw-r--r--src/gpu/GrTessellator.cpp8
-rw-r--r--tests/TessellatingPathRendererTests.cpp15
2 files changed, 5 insertions, 18 deletions
diff --git a/src/gpu/GrTessellator.cpp b/src/gpu/GrTessellator.cpp
index 649092001d..6cd54380e6 100644
--- a/src/gpu/GrTessellator.cpp
+++ b/src/gpu/GrTessellator.cpp
@@ -1055,16 +1055,16 @@ void merge_collinear_edges(Edge* edge, EdgeList* activeEdges, Vertex** current,
for (;;) {
if (edge->fPrevEdgeAbove && (edge->fTop == edge->fPrevEdgeAbove->fTop ||
!edge->fPrevEdgeAbove->isLeftOf(edge->fTop))) {
- merge_edges_above(edge->fPrevEdgeAbove, edge, activeEdges, current, c);
+ merge_edges_above(edge, edge->fPrevEdgeAbove, activeEdges, current, c);
} else if (edge->fNextEdgeAbove && (edge->fTop == edge->fNextEdgeAbove->fTop ||
!edge->isLeftOf(edge->fNextEdgeAbove->fTop))) {
- merge_edges_above(edge->fNextEdgeAbove, edge, activeEdges, current, c);
+ merge_edges_above(edge, edge->fNextEdgeAbove, activeEdges, current, c);
} else if (edge->fPrevEdgeBelow && (edge->fBottom == edge->fPrevEdgeBelow->fBottom ||
!edge->fPrevEdgeBelow->isLeftOf(edge->fBottom))) {
- merge_edges_below(edge->fPrevEdgeBelow, edge, activeEdges, current, c);
+ merge_edges_below(edge, edge->fPrevEdgeBelow, activeEdges, current, c);
} else if (edge->fNextEdgeBelow && (edge->fBottom == edge->fNextEdgeBelow->fBottom ||
!edge->isLeftOf(edge->fNextEdgeBelow->fBottom))) {
- merge_edges_below(edge->fNextEdgeBelow, edge, activeEdges, current, c);
+ merge_edges_below(edge, edge->fNextEdgeBelow, activeEdges, current, c);
} else {
break;
}
diff --git a/tests/TessellatingPathRendererTests.cpp b/tests/TessellatingPathRendererTests.cpp
index 0c7a5ca4c5..a9913769df 100644
--- a/tests/TessellatingPathRendererTests.cpp
+++ b/tests/TessellatingPathRendererTests.cpp
@@ -560,7 +560,7 @@ static SkPath create_path_38() {
return path;
}
-// Reduction from crbug.com/851409. Exercises collinear last vertex.
+// Reduction from crbug.com/851409.
static SkPath create_path_39() {
SkPath path;
path.moveTo(2072553216, 0);
@@ -571,18 +571,6 @@ static SkPath create_path_39() {
return path;
}
-// Another reduction from crbug.com/851409. Exercises two sequential collinear edges.
-static SkPath create_path_40() {
- SkPath path;
- path.moveTo(2072553216, 0);
- path.lineTo(2072553216, 1);
- path.lineTo(2072553472, -13);
- path.lineTo(2072553216, 0);
- path.lineTo(2072553472, -6);
- path.lineTo(2072553472, -13);
- return path;
-}
-
static std::unique_ptr<GrFragmentProcessor> create_linear_gradient_processor(GrContext* ctx) {
SkPoint pts[2] = { {0, 0}, {1, 1} };
@@ -682,5 +670,4 @@ DEF_GPUTEST_FOR_ALL_CONTEXTS(TessellatingPathRendererTests, reporter, ctxInfo) {
test_path(ctx, rtc.get(), create_path_37());
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());
}