| Index: src/pathops/SkOpAngle.cpp
|
| diff --git a/src/pathops/SkOpAngle.cpp b/src/pathops/SkOpAngle.cpp
|
| index 52a98d0ba773646b8b40c2551b0ab8dc44e8428f..6e49c4977faa007f5457533ef0a45674279fee63 100644
|
| --- a/src/pathops/SkOpAngle.cpp
|
| +++ b/src/pathops/SkOpAngle.cpp
|
| @@ -360,6 +360,10 @@ recomputeSector:
|
| fUnorderable = true;
|
| return false;
|
| }
|
| + if (stepUp != (fStart->t() < computedEnd->t())) {
|
| + fUnorderable = true;
|
| + return false;
|
| + }
|
| SkOpSpanBase* saveEnd = fEnd;
|
| fComputedEnd = fEnd = computedEnd;
|
| setSpans();
|
| @@ -597,78 +601,6 @@ bool SkOpAngle::endToSide(const SkOpAngle* rh, bool* inside) const {
|
| return true;
|
| }
|
|
|
| -// Most of the time, the first one can be found trivially by detecting the smallest sector value.
|
| -// If all angles have the same sector value, actual sorting is required.
|
| -SkOpAngle* SkOpAngle::findFirst() {
|
| - SkOpAngle* best = this;
|
| - int bestStart = SkTMin(fSectorStart, fSectorEnd);
|
| - SkOpAngle* angle = this;
|
| - while ((angle = angle->fNext) != this) {
|
| - int angleEnd = SkTMax(angle->fSectorStart, angle->fSectorEnd);
|
| - if (angleEnd < bestStart) {
|
| - return angle; // we wrapped around
|
| - }
|
| - int angleStart = SkTMin(angle->fSectorStart, angle->fSectorEnd);
|
| - if (bestStart > angleStart) {
|
| - best = angle;
|
| - bestStart = angleStart;
|
| - }
|
| - }
|
| - // back up to the first possible angle
|
| - SkOpAngle* firstBest = best;
|
| - angle = best;
|
| - int bestEnd = SkTMax(best->fSectorStart, best->fSectorEnd);
|
| - while ((angle = angle->previous()) != firstBest) {
|
| - if (angle->fStop) {
|
| - break;
|
| - }
|
| - int angleStart = SkTMin(angle->fSectorStart, angle->fSectorEnd);
|
| - // angles that are smaller by one aren't necessary better, since the larger may be a line
|
| - // and the smaller may be a curve that curls to the other side of the line.
|
| - if (bestEnd + 1 < angleStart) {
|
| - return best;
|
| - }
|
| - best = angle;
|
| - bestEnd = SkTMax(angle->fSectorStart, angle->fSectorEnd);
|
| - }
|
| - // in the case where all angles are nearly in the same sector, check the order to find the best
|
| - firstBest = best;
|
| - angle = best;
|
| - do {
|
| - angle = angle->fNext;
|
| - if (angle->fStop) {
|
| - return firstBest;
|
| - }
|
| - bool orderable = best->orderable(angle); // note: may return an unorderable angle
|
| - if (orderable == 0) {
|
| - return angle;
|
| - }
|
| - best = angle;
|
| - } while (angle != firstBest);
|
| - // if the angles are equally ordered, fall back on the initial tangent
|
| - bool foundBelow = false;
|
| - while ((angle = angle->fNext)) {
|
| - SkDVector scratch[2];
|
| - const SkDVector* sweep;
|
| - if (!angle->fUnorderedSweep) {
|
| - sweep = angle->fSweep;
|
| - } else {
|
| - scratch[0] = angle->fCurvePart[1] - angle->fCurvePart[0];
|
| - sweep = &scratch[0];
|
| - }
|
| - bool isAbove = sweep->fY <= 0;
|
| - if (isAbove && foundBelow) {
|
| - return angle;
|
| - }
|
| - foundBelow |= !isAbove;
|
| - if (angle == firstBest) {
|
| - return NULL; // should not loop around
|
| - }
|
| - }
|
| - SkASSERT(0); // should never get here
|
| - return NULL;
|
| -}
|
| -
|
| /* y<0 y==0 y>0 x<0 x==0 x>0 xy<0 xy==0 xy>0
|
| 0 x x x
|
| 1 x x x
|
| @@ -816,26 +748,6 @@ int SkOpAngle::loopCount() const {
|
| return count;
|
| }
|
|
|
| -// OPTIMIZATION: can this be done better in after when angles are sorted?
|
| -bool SkOpAngle::markStops() {
|
| - SkOpAngle* angle = this;
|
| - int lastEnd = SkTMax(fSectorStart, fSectorEnd);
|
| - do {
|
| - angle = angle->fNext;
|
| - if (!angle) {
|
| - return false;
|
| - }
|
| - int angleStart = SkTMin(angle->fSectorStart, angle->fSectorEnd);
|
| - // angles that are smaller by one aren't necessary better, since the larger may be a line
|
| - // and the smaller may be a curve that curls to the other side of the line.
|
| - if (lastEnd + 1 < angleStart) {
|
| - angle->fStop = true;
|
| - }
|
| - lastEnd = SkTMax(angle->fSectorStart, angle->fSectorEnd);
|
| - } while (angle != this);
|
| - return true;
|
| -}
|
| -
|
| bool SkOpAngle::merge(SkOpAngle* angle) {
|
| SkASSERT(fNext);
|
| SkASSERT(angle->fNext);
|
| @@ -968,7 +880,6 @@ void SkOpAngle::set(SkOpSpanBase* start, SkOpSpanBase* end) {
|
| SkASSERT(start != end);
|
| fNext = NULL;
|
| fComputeSector = fComputedSector = fCheckCoincidence = false;
|
| - fStop = false;
|
| setSpans();
|
| setSector();
|
| SkDEBUGCODE(fID = start ? start->globalState()->nextAngleID() : -1);
|
| @@ -1157,11 +1068,6 @@ deferTilLater:
|
| }
|
| }
|
|
|
| -int SkOpAngle::sign() const {
|
| - SkASSERT(fStart->t() != fEnd->t());
|
| - return fStart->t() < fEnd->t() ? -1 : 1;
|
| -}
|
| -
|
| SkOpSpan* SkOpAngle::starter() {
|
| return fStart->starter(fEnd);
|
| }
|
|
|