| Index: src/pathops/SkOpAngle.h
 | 
| diff --git a/src/pathops/SkOpAngle.h b/src/pathops/SkOpAngle.h
 | 
| index 583f5ec8b39df3bbb47e8411b054d2209b796e17..87a858a2db89b631de4e4b1c01e4e7e09edfab2b 100644
 | 
| --- a/src/pathops/SkOpAngle.h
 | 
| +++ b/src/pathops/SkOpAngle.h
 | 
| @@ -8,8 +8,6 @@
 | 
|  #define SkOpAngle_DEFINED
 | 
|  
 | 
|  #include "SkLineParameters.h"
 | 
| -#include "SkPath.h"
 | 
| -#include "SkPathOpsCubic.h"
 | 
|  
 | 
|  class SkOpSegment;
 | 
|  struct SkOpSpan;
 | 
| @@ -26,28 +24,29 @@ public:
 | 
|          kBinaryOpp,
 | 
|      };
 | 
|  
 | 
| -    bool operator<(const SkOpAngle& rh) const;
 | 
| -
 | 
| -    bool calcSlop(double x, double y, double rx, double ry, bool* result) const;
 | 
| -
 | 
| -    double dx() const {
 | 
| -        return fTangentPart.dx();
 | 
| +    int end() const {
 | 
| +        return fEnd;
 | 
|      }
 | 
|  
 | 
| -    double dy() const {
 | 
| -        return fTangentPart.dy();
 | 
| -    }
 | 
| +    const SkOpAngle* findFirst() const;
 | 
|  
 | 
| -    int end() const {
 | 
| -        return fEnd;
 | 
| +    bool inLoop() const {
 | 
| +        return !!fNext;
 | 
|      }
 | 
|  
 | 
| +    void insert(SkOpAngle* );
 | 
|      bool isHorizontal() const;
 | 
| +    SkOpSpan* lastMarked() const;
 | 
| +    int loopCount() const;
 | 
| +    void markStops();
 | 
| +    bool merge(SkOpAngle* );
 | 
|  
 | 
| -    SkOpSpan* lastMarked() const {
 | 
| -        return fLastMarked;
 | 
| +    SkOpAngle* next() const {
 | 
| +        return fNext;
 | 
|      }
 | 
|  
 | 
| +    SkOpAngle* previous() const;
 | 
| +
 | 
|      void set(const SkOpSegment* segment, int start, int end);
 | 
|  
 | 
|      void setLastMarked(SkOpSpan* marked) {
 | 
| @@ -62,6 +61,8 @@ public:
 | 
|          return SkSign32(fStart - fEnd);
 | 
|      }
 | 
|  
 | 
| +    bool small() const;
 | 
| +
 | 
|      int start() const {
 | 
|          return fStart;
 | 
|      }
 | 
| @@ -70,43 +71,78 @@ public:
 | 
|          return fUnorderable;
 | 
|      }
 | 
|  
 | 
| -    bool unsortable() const {
 | 
| -        return fUnsortable;
 | 
| -    }
 | 
| -
 | 
| -#ifdef SK_DEBUG
 | 
| -    void dump() const;
 | 
| +    // available to testing only
 | 
| +#if DEBUG_SORT
 | 
| +    void debugLoop() const;  // called by code during run
 | 
| +#endif
 | 
| +#if DEBUG_ANGLE
 | 
| +    void debugSameAs(const SkOpAngle* compare) const;
 | 
|  #endif
 | 
| +    void dump() const;
 | 
| +    void dumpFromTo(const SkOpSegment* fromSeg, int from, int to) const;
 | 
|  
 | 
|  #if DEBUG_ANGLE
 | 
|      void setID(int id) {
 | 
|          fID = id;
 | 
|      }
 | 
|  #endif
 | 
| +#if DEBUG_VALIDATE
 | 
| +    void debugValidateLoop() const;
 | 
| +#endif
 | 
|  
 | 
|  private:
 | 
| -    bool lengthen(const SkOpAngle& );
 | 
| +    bool after(const SkOpAngle* test) const;
 | 
| +    int allOnOneSide(const SkOpAngle& test) const;
 | 
| +    bool calcSlop(double x, double y, double rx, double ry, bool* result) const;
 | 
| +    bool checkCrossesZero() const;
 | 
| +    bool checkParallel(const SkOpAngle& ) const;
 | 
| +    bool computeSector();
 | 
| +    int convexHullOverlaps(const SkOpAngle& ) const;
 | 
| +    double distEndRatio(double dist) const;
 | 
| +    int findSector(SkPath::Verb verb, double x, double y) const;
 | 
| +    bool endsIntersect(const SkOpAngle& ) const;
 | 
| +    double midT() const;
 | 
| +    bool oppositePlanes(const SkOpAngle& rh) const;
 | 
| +    bool orderable(const SkOpAngle& rh) const;  // false == this < rh ; true == this > rh
 | 
| +    void setCurveHullSweep();
 | 
| +    void setSector();
 | 
|      void setSpans();
 | 
| +    bool tangentsDiverge(const SkOpAngle& rh, double s0xt0) const;
 | 
|  
 | 
|      SkDCubic fCurvePart; // the curve from start to end
 | 
| -    SkDCubic fCurveHalf; // the curve from start to 1 or 0
 | 
|      double fSide;
 | 
| -    double fSide2;
 | 
| -    SkLineParameters fTangentPart;
 | 
| -    SkLineParameters fTangentHalf;
 | 
| +    SkLineParameters fTangentHalf;  // used only to sort a pair of lines or line-like sections
 | 
|      const SkOpSegment* fSegment;
 | 
| +    SkOpAngle* fNext;
 | 
|      SkOpSpan* fLastMarked;
 | 
| +    SkDVector fSweep[2];
 | 
|      int fStart;
 | 
|      int fEnd;
 | 
| -    bool fComputed; // tangent is computed, may contain some error
 | 
| -    // if subdividing a quad or cubic causes the tangent to go from the maximum angle to the
 | 
| -    // minimum, mark it unorderable. It still can be sorted, which is good enough for find-top
 | 
| -    // but can't be ordered, and therefore can't be used to compute winding
 | 
| -    bool fUnorderable;
 | 
| -    mutable bool fUnsortable;  // this alone is editable by the less than operator
 | 
| +    int fSectorMask;
 | 
| +    char fSectorStart;  // in 32nds of a circle
 | 
| +    char fSectorEnd;
 | 
| +    bool fIsCurve;
 | 
| +    bool fStop; // set if ordered angle is greater than the previous
 | 
| +    mutable bool fUnorderable;  // this is editable by orderable()
 | 
| +    bool fUnorderedSweep;  // set when a cubic's first control point between the sweep vectors
 | 
| +    bool fComputeSector;
 | 
| +    bool fComputedSector;
 | 
| +
 | 
| +#if DEBUG_SORT
 | 
| +    void debugOne(bool showFunc) const;  // available to testing only
 | 
| +#endif
 | 
|  #if DEBUG_ANGLE
 | 
| +    int debugID() const { return fID; }
 | 
|      int fID;
 | 
|  #endif
 | 
| +#if DEBUG_VALIDATE
 | 
| +    void debugValidateNext() const;  // in debug builds, verify that angle loop is uncorrupted
 | 
| +#else
 | 
| +    void debugValidateNext() const {}
 | 
| +#endif
 | 
| +    void dumpLoop() const;  // utility to be called by user from debugger
 | 
| +    void dumpPartials() const;  // utility to be called by user from debugger
 | 
| +    friend class PathOpsAngleTester;
 | 
|  };
 | 
|  
 | 
|  #endif
 | 
| 
 |