1 /* 2 * Copyright 2012 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 #ifndef SkOpAngle_DEFINED 8 #define SkOpAngle_DEFINED 9 10 #include "SkLineParameters.h" 11 #include "SkPathOpsCurve.h" 12 #if DEBUG_ANGLE 13 #include "SkString.h" 14 #endif 15 16 class SkOpContour; 17 class SkOpPtT; 18 class SkOpSegment; 19 class SkOpSpanBase; 20 class SkOpSpan; 21 22 struct SkOpAngle { 23 enum IncludeType { 24 kUnaryWinding, 25 kUnaryXor, 26 kBinarySingle, 27 kBinaryOpp, 28 }; 29 30 bool after(SkOpAngle* test); 31 int allOnOneSide(const SkOpAngle* test); 32 bool checkCrossesZero() const; 33 bool checkParallel(SkOpAngle* ); 34 bool computeSector(); 35 int convexHullOverlaps(const SkOpAngle* ) const; 36 37 const SkOpAngle* debugAngle(int id) const; 38 SkOpContour* debugContour(int id); 39 40 int debugID() const { 41 return SkDEBUGRELEASE(fID, -1); 42 } 43 44 #if DEBUG_SORT 45 void debugLoop() const; 46 #endif 47 48 #if DEBUG_ANGLE 49 void debugCheckNearCoincidence() const; 50 SkString debugPart() const; 51 #endif 52 const SkOpPtT* debugPtT(int id) const; 53 const SkOpSegment* debugSegment(int id) const; 54 int debugSign() const; 55 const SkOpSpanBase* debugSpan(int id) const; 56 void debugValidate() const; 57 void debugValidateNext() const; // in debug builds, verify that angle loop is uncorrupted 58 double distEndRatio(double dist) const; 59 // available to testing only 60 void dump() const; 61 void dumpCurves() const; 62 void dumpLoop() const; 63 void dumpOne(bool functionHeader) const; 64 void dumpTo(const SkOpSegment* fromSeg, const SkOpAngle* ) const; 65 void dumpTest() const; 66 67 SkOpSpanBase* end() const { 68 return fEnd; 69 } 70 71 bool endsIntersect(SkOpAngle* ); 72 bool endToSide(const SkOpAngle* rh, bool* inside) const; 73 int findSector(SkPath::Verb verb, double x, double y) const; 74 SkOpGlobalState* globalState() const; 75 void insert(SkOpAngle* ); 76 SkOpSpanBase* lastMarked() const; 77 bool loopContains(const SkOpAngle* ) const; 78 int loopCount() const; 79 bool merge(SkOpAngle* ); 80 double midT() const; 81 bool midToSide(const SkOpAngle* rh, bool* inside) const; 82 83 SkOpAngle* next() const { 84 return fNext; 85 } 86 87 bool oppositePlanes(const SkOpAngle* rh) const; 88 bool orderable(SkOpAngle* rh); // false == this < rh ; true == this > rh 89 SkOpAngle* previous() const; 90 91 int sectorEnd() const { 92 return fSectorEnd; 93 } 94 95 int sectorStart() const { 96 return fSectorStart; 97 } 98 99 SkOpSegment* segment() const; 100 101 void set(SkOpSpanBase* start, SkOpSpanBase* end); 102 void setCurveHullSweep(); 103 104 void setID(int id) { 105 SkDEBUGCODE(fID = id); 106 } 107 108 void setLastMarked(SkOpSpanBase* marked) { 109 fLastMarked = marked; 110 } 111 112 void setSector(); 113 void setSpans(); 114 115 SkOpSpanBase* start() const { 116 return fStart; 117 } 118 119 SkOpSpan* starter(); 120 bool tangentsDiverge(const SkOpAngle* rh, double s0xt0) const; 121 122 bool unorderable() const { 123 return fUnorderable; 124 } 125 126 SkDCurve fCurvePart; // the curve from start to end 127 double fSide; 128 SkLineParameters fTangentHalf; // used only to sort a pair of lines or line-like sections 129 SkOpAngle* fNext; 130 SkOpSpanBase* fLastMarked; 131 SkDVector fSweep[2]; 132 SkOpSpanBase* fStart; 133 SkOpSpanBase* fEnd; 134 SkOpSpanBase* fComputedEnd; 135 int fSectorMask; 136 int8_t fSectorStart; // in 32nds of a circle 137 int8_t fSectorEnd; 138 bool fIsCurve; 139 bool fUnorderable; 140 bool fUnorderedSweep; // set when a cubic's first control point between the sweep vectors 141 bool fComputeSector; 142 bool fComputedSector; 143 bool fCheckCoincidence; 144 SkDEBUGCODE(int fID); 145 146 }; 147 148 149 150 #endif 151