| 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) { | 
|  |