Index: src/pathops/SkOpSegment.cpp |
diff --git a/src/pathops/SkOpSegment.cpp b/src/pathops/SkOpSegment.cpp |
index 08f4f7eace9844c52b3f154dbce7635e6a618210..54e44904f4b593013f94cb84e1e58abe66c08e06 100644 |
--- a/src/pathops/SkOpSegment.cpp |
+++ b/src/pathops/SkOpSegment.cpp |
@@ -861,7 +861,7 @@ int SkOpSegment::computeSum(int startIndex, int endIndex, bool binary) { |
// FIXME?: Not sure if this sort must be ordered or if the relaxed ordering is OK ... |
bool sortable = SortAngles(angles, &sorted, SkOpSegment::kMustBeOrdered_SortAngleKind); |
#if DEBUG_SORT |
- sorted[0]->segment()->debugShowSort(__FUNCTION__, sorted, 0, 0, 0); |
+ sorted[0]->segment()->debugShowSort(__FUNCTION__, sorted, 0, 0, 0, sortable); |
#endif |
if (!sortable) { |
return SK_MinS32; |
@@ -896,7 +896,7 @@ int SkOpSegment::computeSum(int startIndex, int endIndex, bool binary) { |
winding += spanWinding; |
} |
#if DEBUG_SORT |
- base->debugShowSort(__FUNCTION__, sorted, firstIndex, winding, oWinding); |
+ base->debugShowSort(__FUNCTION__, sorted, firstIndex, winding, oWinding, sortable); |
#endif |
int nextIndex = firstIndex + 1; |
int lastIndex = firstIndex != 0 ? firstIndex : angleCount; |
@@ -1134,6 +1134,7 @@ SkOpSegment* SkOpSegment::findNextOp(SkTDArray<SkOpSpan*>* chase, int* nextStart |
while (precisely_zero(startT - other->fTs[*nextEnd].fT)); |
SkASSERT(step < 0 ? *nextEnd >= 0 : *nextEnd < other->fTs.count()); |
if (other->isTiny(SkMin32(*nextStart, *nextEnd))) { |
+ *unsortable = true; |
return NULL; |
} |
return other; |
@@ -1150,7 +1151,7 @@ SkOpSegment* SkOpSegment::findNextOp(SkTDArray<SkOpSpan*>* chase, int* nextStart |
int firstIndex = findStartingEdge(sorted, startIndex, end); |
SkASSERT(firstIndex >= 0); |
#if DEBUG_SORT |
- debugShowSort(__FUNCTION__, sorted, firstIndex); |
+ debugShowSort(__FUNCTION__, sorted, firstIndex, sortable); |
#endif |
if (!sortable) { |
*unsortable = true; |
@@ -1272,7 +1273,7 @@ SkOpSegment* SkOpSegment::findNextWinding(SkTDArray<SkOpSpan*>* chase, int* next |
int firstIndex = findStartingEdge(sorted, startIndex, end); |
SkASSERT(firstIndex >= 0); |
#if DEBUG_SORT |
- debugShowSort(__FUNCTION__, sorted, firstIndex); |
+ debugShowSort(__FUNCTION__, sorted, firstIndex, sortable); |
#endif |
if (!sortable) { |
*unsortable = true; |
@@ -1400,7 +1401,8 @@ SkOpSegment* SkOpSegment::findNextXor(int* nextStart, int* nextEnd, bool* unsort |
if (!sortable) { |
*unsortable = true; |
#if DEBUG_SORT |
- debugShowSort(__FUNCTION__, sorted, findStartingEdge(sorted, startIndex, end), 0, 0); |
+ debugShowSort(__FUNCTION__, sorted, findStartingEdge(sorted, startIndex, end), 0, 0, |
+ sortable); |
#endif |
return NULL; |
} |
@@ -1408,7 +1410,7 @@ SkOpSegment* SkOpSegment::findNextXor(int* nextStart, int* nextEnd, bool* unsort |
int firstIndex = findStartingEdge(sorted, startIndex, end); |
SkASSERT(firstIndex >= 0); |
#if DEBUG_SORT |
- debugShowSort(__FUNCTION__, sorted, firstIndex, 0, 0); |
+ debugShowSort(__FUNCTION__, sorted, firstIndex, 0, 0, sortable); |
#endif |
SkASSERT(sorted[firstIndex]->segment() == this); |
int nextIndex = firstIndex + 1; |
@@ -1654,7 +1656,7 @@ SkOpSegment* SkOpSegment::findTop(int* tIndexPtr, int* endIndexPtr, bool* unsort |
} |
SkASSERT(first < SK_MaxS32); |
#if DEBUG_SORT // || DEBUG_SWAP_TOP |
- sorted[first]->segment()->debugShowSort(__FUNCTION__, sorted, first, 0, 0); |
+ sorted[first]->segment()->debugShowSort(__FUNCTION__, sorted, first, 0, 0, sortable); |
#endif |
if (onlySortable && !sortable) { |
*unsortable = true; |
@@ -2565,6 +2567,9 @@ int SkOpSegment::windingAtT(double tHit, int tIndex, bool crossOpp, SkScalar* dx |
#endif |
return SK_MinS32; |
} |
+ if (windVal < 0) { // reverse sign if opp contour traveled in reverse |
+ *dx = -*dx; |
+ } |
if (winding * *dx > 0) { // if same signs, result is negative |
winding += *dx > 0 ? -windVal : windVal; |
} |
@@ -2769,12 +2774,12 @@ void SkOpSegment::debugShowNewWinding(const char* fun, const SkOpSpan& span, int |
#if DEBUG_SORT || DEBUG_SWAP_TOP |
void SkOpSegment::debugShowSort(const char* fun, const SkTArray<SkOpAngle*, true>& angles, |
int first, const int contourWinding, |
- const int oppContourWinding) const { |
+ const int oppContourWinding, bool sortable) const { |
if (--gDebugSortCount < 0) { |
return; |
} |
SkASSERT(angles[first]->segment() == this); |
- SkASSERT(angles.count() > 1); |
+ SkASSERT(!sortable || angles.count() > 1); |
int lastSum = contourWinding; |
int oppLastSum = oppContourWinding; |
const SkOpAngle* firstAngle = angles[first]; |
@@ -2878,12 +2883,12 @@ void SkOpSegment::debugShowSort(const char* fun, const SkTArray<SkOpAngle*, true |
} |
void SkOpSegment::debugShowSort(const char* fun, const SkTArray<SkOpAngle*, true>& angles, |
- int first) { |
+ int first, bool sortable) { |
const SkOpAngle* firstAngle = angles[first]; |
const SkOpSegment* segment = firstAngle->segment(); |
int winding = segment->updateWinding(firstAngle); |
int oppWinding = segment->updateOppWinding(firstAngle); |
- debugShowSort(fun, angles, first, winding, oppWinding); |
+ debugShowSort(fun, angles, first, winding, oppWinding, sortable); |
} |
#endif |