Index: src/gpu/GrTessellator.cpp |
diff --git a/src/gpu/GrTessellator.cpp b/src/gpu/GrTessellator.cpp |
index cefe4cd65b9b8525e8fd1acb040c7a84d5f7fc5a..50d4af6148b30333789f68e663ee46c6aeac3651 100644 |
--- a/src/gpu/GrTessellator.cpp |
+++ b/src/gpu/GrTessellator.cpp |
@@ -253,7 +253,9 @@ struct Edge { |
, fLeftPolyPrev(nullptr) |
, fLeftPolyNext(nullptr) |
, fRightPolyPrev(nullptr) |
- , fRightPolyNext(nullptr) { |
+ , fRightPolyNext(nullptr) |
+ , fUsedInLeftPoly(false) |
+ , fUsedInRightPoly(false) { |
recompute(); |
} |
int fWinding; // 1 == edge goes downward; -1 = edge goes upward. |
@@ -271,6 +273,8 @@ struct Edge { |
Edge* fLeftPolyNext; |
Edge* fRightPolyPrev; |
Edge* fRightPolyNext; |
+ bool fUsedInLeftPoly; |
+ bool fUsedInRightPoly; |
double fDX; // The line equation for this edge, in implicit form. |
double fDY; // fDY * x + fDX * y + fC = 0, for point (x, y) on the line. |
double fC; |
@@ -356,11 +360,19 @@ struct Poly { |
MonotonePoly* fNext; |
void addEdge(Edge* edge) { |
if (fSide == kRight_Side) { |
+ if (edge->fUsedInRightPoly) { |
+ return; |
+ } |
list_insert<Edge, &Edge::fRightPolyPrev, &Edge::fRightPolyNext>( |
edge, fLastEdge, nullptr, &fFirstEdge, &fLastEdge); |
+ edge->fUsedInRightPoly = true; |
} else { |
+ if (edge->fUsedInLeftPoly) { |
+ return; |
+ } |
list_insert<Edge, &Edge::fLeftPolyPrev, &Edge::fLeftPolyNext>( |
edge, fLastEdge, nullptr, &fFirstEdge, &fLastEdge); |
+ edge->fUsedInLeftPoly = true; |
} |
} |
@@ -407,9 +419,8 @@ struct Poly { |
} |
}; |
Poly* addEdge(Edge* e, Side side, SkChunkAlloc& alloc) { |
- LOG("addEdge (%g,%g)-(%g,%g) to poly %d, %s side\n", |
- e->fTop->fPoint.fX, e->fTop->fPoint.fY, e->fBottom->fPoint.fX, e->fBottom->fPoint.fY, |
- fID, side == kLeft_Side ? "left" : "right"); |
+ LOG("addEdge (%g -> %g) to poly %d, %s side\n", |
+ e->fTop->fID, e->fBottom->fID, fID, side == kLeft_Side ? "left" : "right"); |
Poly* partner = fPartner; |
Poly* poly = this; |
if (partner) { |