Index: src/pathops/SkOpSegment.cpp |
diff --git a/src/pathops/SkOpSegment.cpp b/src/pathops/SkOpSegment.cpp |
index a571609f53b310425c91a5d65b2f9570e295e90e..ce35f846b3955a7b66790521dd13a7dce5a10a37 100644 |
--- a/src/pathops/SkOpSegment.cpp |
+++ b/src/pathops/SkOpSegment.cpp |
@@ -102,9 +102,9 @@ SkOpAngle* SkOpSegment::activeAngleOther(SkOpSpanBase* start, SkOpSpanBase** sta |
return other->activeAngleInner(oSpan, startPtr, endPtr, done, sortable); |
} |
-SkPoint SkOpSegment::activeLeftTop(SkOpSpanBase** firstSpan) { |
+SkDPoint SkOpSegment::activeLeftTop(SkOpSpanBase** firstSpan) { |
SkASSERT(!done()); |
- SkPoint topPt = {SK_ScalarMax, SK_ScalarMax}; |
+ SkDPoint topPt = {SK_ScalarMax, SK_ScalarMax}; |
// see if either end is not done since we want smaller Y of the pair |
bool lastDone = true; |
SkOpSpanBase* span = &fHead; |
@@ -118,10 +118,11 @@ SkPoint SkOpSegment::activeLeftTop(SkOpSpanBase** firstSpan) { |
*firstSpan = span; |
} |
} |
- if (fVerb != SkPath::kLine_Verb && !lastDone |
- && fCubicType != SkDCubic::kSplitAtMaxCurvature_SkDCubicType) { |
+ if (fVerb != SkPath::kLine_Verb && !lastDone) { |
double curveTopT; |
- SkPoint curveTop = (*CurveTop[fVerb])(fPts, fWeight, lastSpan->t(), span->t(), |
+ SkDCurve curve; |
+ this->subDivide(lastSpan, span, &curve); |
+ SkDPoint curveTop = (curve.*Top[fVerb])(fPts, fWeight, lastSpan->t(), span->t(), |
&curveTopT); |
if (topPt.fY > curveTop.fY || (topPt.fY == curveTop.fY && topPt.fX > curveTop.fX)) { |
topPt = curveTop; |
@@ -1092,10 +1093,7 @@ SkOpSegment* SkOpSegment::findTop(bool firstPass, SkOpSpanBase** startPtr, SkOpS |
const SkOpSegment* next = angle->segment(); |
SkPathOpsBounds bounds; |
next->subDivideBounds(angle->end(), angle->start(), &bounds); |
- bool nearSame = AlmostEqualUlps(top, bounds.top()); |
- bool lowerSector = !firstAngle || angle->sectorEnd() < firstAngle->sectorStart(); |
- bool lesserSector = top > bounds.fTop; |
- if (lesserSector && (!nearSame || lowerSector)) { |
+ if (top > bounds.fTop) { |
top = bounds.fTop; |
firstAngle = angle; |
} |
@@ -1452,7 +1450,12 @@ bool SkOpSegment::monotonicInY(const SkOpSpanBase* start, const SkOpSpanBase* en |
} |
SkASSERT(fVerb == SkPath::kCubic_Verb); |
SkDCubic dst = SkDCubic::SubDivide(fPts, start->t(), end->t()); |
- return dst.monotonicInY(); |
+ if (dst.monotonicInY()) { |
+ return true; |
+ } |
+ SkDCubic whole; |
+ whole.set(fPts); |
+ return whole.monotonicInY(); |
} |
bool SkOpSegment::NextCandidate(SkOpSpanBase* span, SkOpSpanBase** start, |
@@ -2023,9 +2026,15 @@ bool SkOpSegment::subDivide(const SkOpSpanBase* start, const SkOpSpanBase* end, |
void SkOpSegment::subDivideBounds(const SkOpSpanBase* start, const SkOpSpanBase* end, |
SkPathOpsBounds* bounds) const { |
- SkOpCurve edge; |
+ SkDCurve edge; |
+ subDivide(start, end, &edge); |
+ (edge.*SetBounds[fVerb])(fPts, fWeight, start->t(), end->t(), bounds); |
+} |
+ |
+SkDPoint SkOpSegment::top(const SkOpSpanBase* start, const SkOpSpanBase* end, double* topT) const { |
+ SkDCurve edge; |
subDivide(start, end, &edge); |
- (bounds->*SetCurveBounds[fVerb])(edge.fPts, edge.fWeight); |
+ return (edge.*Top[fVerb])(fPts, fWeight, start->t(), end->t(), topT); |
} |
void SkOpSegment::undoneSpan(SkOpSpanBase** start, SkOpSpanBase** end) { |