1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2014 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkPathOpsTSect_DEFINED 8*c8dee2aaSAndroid Build Coastguard Worker #define SkPathOpsTSect_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkDebug.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTo.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkArenaAlloc.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkPathOpsPoint.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkPathOpsRect.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkPathOpsTCurve.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkPathOpsTypes.h" 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Worker class SkIntersections; 23*c8dee2aaSAndroid Build Coastguard Worker class SkTSect; 24*c8dee2aaSAndroid Build Coastguard Worker class SkTSpan; 25*c8dee2aaSAndroid Build Coastguard Worker struct SkDLine; 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG 28*c8dee2aaSAndroid Build Coastguard Worker typedef uint8_t SkOpDebugBool; 29*c8dee2aaSAndroid Build Coastguard Worker #else 30*c8dee2aaSAndroid Build Coastguard Worker typedef bool SkOpDebugBool; 31*c8dee2aaSAndroid Build Coastguard Worker #endif 32*c8dee2aaSAndroid Build Coastguard Worker 33*c8dee2aaSAndroid Build Coastguard Worker class SkTCoincident { 34*c8dee2aaSAndroid Build Coastguard Worker public: SkTCoincident()35*c8dee2aaSAndroid Build Coastguard Worker SkTCoincident() { 36*c8dee2aaSAndroid Build Coastguard Worker this->init(); 37*c8dee2aaSAndroid Build Coastguard Worker } 38*c8dee2aaSAndroid Build Coastguard Worker debugInit()39*c8dee2aaSAndroid Build Coastguard Worker void debugInit() { 40*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG 41*c8dee2aaSAndroid Build Coastguard Worker this->fPerpPt.fX = this->fPerpPt.fY = SK_ScalarNaN; 42*c8dee2aaSAndroid Build Coastguard Worker this->fPerpT = SK_ScalarNaN; 43*c8dee2aaSAndroid Build Coastguard Worker this->fMatch = 0xFF; 44*c8dee2aaSAndroid Build Coastguard Worker #endif 45*c8dee2aaSAndroid Build Coastguard Worker } 46*c8dee2aaSAndroid Build Coastguard Worker 47*c8dee2aaSAndroid Build Coastguard Worker char dumpIsCoincidentStr() const; 48*c8dee2aaSAndroid Build Coastguard Worker void dump() const; 49*c8dee2aaSAndroid Build Coastguard Worker isMatch()50*c8dee2aaSAndroid Build Coastguard Worker bool isMatch() const { 51*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!!fMatch == fMatch); 52*c8dee2aaSAndroid Build Coastguard Worker return SkToBool(fMatch); 53*c8dee2aaSAndroid Build Coastguard Worker } 54*c8dee2aaSAndroid Build Coastguard Worker init()55*c8dee2aaSAndroid Build Coastguard Worker void init() { 56*c8dee2aaSAndroid Build Coastguard Worker fPerpT = -1; 57*c8dee2aaSAndroid Build Coastguard Worker fMatch = false; 58*c8dee2aaSAndroid Build Coastguard Worker fPerpPt.fX = fPerpPt.fY = SK_ScalarNaN; 59*c8dee2aaSAndroid Build Coastguard Worker } 60*c8dee2aaSAndroid Build Coastguard Worker markCoincident()61*c8dee2aaSAndroid Build Coastguard Worker void markCoincident() { 62*c8dee2aaSAndroid Build Coastguard Worker if (!fMatch) { 63*c8dee2aaSAndroid Build Coastguard Worker fPerpT = -1; 64*c8dee2aaSAndroid Build Coastguard Worker } 65*c8dee2aaSAndroid Build Coastguard Worker fMatch = true; 66*c8dee2aaSAndroid Build Coastguard Worker } 67*c8dee2aaSAndroid Build Coastguard Worker perpPt()68*c8dee2aaSAndroid Build Coastguard Worker const SkDPoint& perpPt() const { 69*c8dee2aaSAndroid Build Coastguard Worker return fPerpPt; 70*c8dee2aaSAndroid Build Coastguard Worker } 71*c8dee2aaSAndroid Build Coastguard Worker perpT()72*c8dee2aaSAndroid Build Coastguard Worker double perpT() const { 73*c8dee2aaSAndroid Build Coastguard Worker return fPerpT; 74*c8dee2aaSAndroid Build Coastguard Worker } 75*c8dee2aaSAndroid Build Coastguard Worker 76*c8dee2aaSAndroid Build Coastguard Worker void setPerp(const SkTCurve& c1, double t, const SkDPoint& cPt, const SkTCurve& ); 77*c8dee2aaSAndroid Build Coastguard Worker 78*c8dee2aaSAndroid Build Coastguard Worker private: 79*c8dee2aaSAndroid Build Coastguard Worker SkDPoint fPerpPt; 80*c8dee2aaSAndroid Build Coastguard Worker double fPerpT; // perpendicular intersection on opposite curve 81*c8dee2aaSAndroid Build Coastguard Worker SkOpDebugBool fMatch; 82*c8dee2aaSAndroid Build Coastguard Worker }; 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker struct SkTSpanBounded { 85*c8dee2aaSAndroid Build Coastguard Worker SkTSpan* fBounded; 86*c8dee2aaSAndroid Build Coastguard Worker SkTSpanBounded* fNext; 87*c8dee2aaSAndroid Build Coastguard Worker }; 88*c8dee2aaSAndroid Build Coastguard Worker 89*c8dee2aaSAndroid Build Coastguard Worker class SkTSpan { 90*c8dee2aaSAndroid Build Coastguard Worker public: SkTSpan(const SkTCurve & curve,SkArenaAlloc & heap)91*c8dee2aaSAndroid Build Coastguard Worker SkTSpan(const SkTCurve& curve, SkArenaAlloc& heap) { 92*c8dee2aaSAndroid Build Coastguard Worker fPart = curve.make(heap); 93*c8dee2aaSAndroid Build Coastguard Worker } 94*c8dee2aaSAndroid Build Coastguard Worker 95*c8dee2aaSAndroid Build Coastguard Worker void addBounded(SkTSpan* , SkArenaAlloc* ); 96*c8dee2aaSAndroid Build Coastguard Worker double closestBoundedT(const SkDPoint& pt) const; 97*c8dee2aaSAndroid Build Coastguard Worker bool contains(double t) const; 98*c8dee2aaSAndroid Build Coastguard Worker debugInit(const SkTCurve & curve,SkArenaAlloc & heap)99*c8dee2aaSAndroid Build Coastguard Worker void debugInit(const SkTCurve& curve, SkArenaAlloc& heap) { 100*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG 101*c8dee2aaSAndroid Build Coastguard Worker SkTCurve* fake = curve.make(heap); 102*c8dee2aaSAndroid Build Coastguard Worker fake->debugInit(); 103*c8dee2aaSAndroid Build Coastguard Worker init(*fake); 104*c8dee2aaSAndroid Build Coastguard Worker initBounds(*fake); 105*c8dee2aaSAndroid Build Coastguard Worker fCoinStart.init(); 106*c8dee2aaSAndroid Build Coastguard Worker fCoinEnd.init(); 107*c8dee2aaSAndroid Build Coastguard Worker #endif 108*c8dee2aaSAndroid Build Coastguard Worker } 109*c8dee2aaSAndroid Build Coastguard Worker 110*c8dee2aaSAndroid Build Coastguard Worker const SkTSect* debugOpp() const; 111*c8dee2aaSAndroid Build Coastguard Worker 112*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG debugSetGlobalState(SkOpGlobalState * state)113*c8dee2aaSAndroid Build Coastguard Worker void debugSetGlobalState(SkOpGlobalState* state) { 114*c8dee2aaSAndroid Build Coastguard Worker fDebugGlobalState = state; 115*c8dee2aaSAndroid Build Coastguard Worker } 116*c8dee2aaSAndroid Build Coastguard Worker 117*c8dee2aaSAndroid Build Coastguard Worker const SkTSpan* debugSpan(int ) const; 118*c8dee2aaSAndroid Build Coastguard Worker const SkTSpan* debugT(double t) const; 119*c8dee2aaSAndroid Build Coastguard Worker bool debugIsBefore(const SkTSpan* span) const; 120*c8dee2aaSAndroid Build Coastguard Worker #endif 121*c8dee2aaSAndroid Build Coastguard Worker void dump() const; 122*c8dee2aaSAndroid Build Coastguard Worker void dumpAll() const; 123*c8dee2aaSAndroid Build Coastguard Worker void dumpBounded(int id) const; 124*c8dee2aaSAndroid Build Coastguard Worker void dumpBounds() const; 125*c8dee2aaSAndroid Build Coastguard Worker void dumpCoin() const; 126*c8dee2aaSAndroid Build Coastguard Worker endT()127*c8dee2aaSAndroid Build Coastguard Worker double endT() const { 128*c8dee2aaSAndroid Build Coastguard Worker return fEndT; 129*c8dee2aaSAndroid Build Coastguard Worker } 130*c8dee2aaSAndroid Build Coastguard Worker 131*c8dee2aaSAndroid Build Coastguard Worker SkTSpan* findOppSpan(const SkTSpan* opp) const; 132*c8dee2aaSAndroid Build Coastguard Worker findOppT(double t)133*c8dee2aaSAndroid Build Coastguard Worker SkTSpan* findOppT(double t) const { 134*c8dee2aaSAndroid Build Coastguard Worker SkTSpan* result = oppT(t); 135*c8dee2aaSAndroid Build Coastguard Worker SkOPASSERT(result); 136*c8dee2aaSAndroid Build Coastguard Worker return result; 137*c8dee2aaSAndroid Build Coastguard Worker } 138*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGCODE(SkOpGlobalState * globalState ()const{ return fDebugGlobalState; })139*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGCODE(SkOpGlobalState* globalState() const { return fDebugGlobalState; }) 140*c8dee2aaSAndroid Build Coastguard Worker 141*c8dee2aaSAndroid Build Coastguard Worker bool hasOppT(double t) const { 142*c8dee2aaSAndroid Build Coastguard Worker return SkToBool(oppT(t)); 143*c8dee2aaSAndroid Build Coastguard Worker } 144*c8dee2aaSAndroid Build Coastguard Worker 145*c8dee2aaSAndroid Build Coastguard Worker int hullsIntersect(SkTSpan* span, bool* start, bool* oppStart); 146*c8dee2aaSAndroid Build Coastguard Worker void init(const SkTCurve& ); 147*c8dee2aaSAndroid Build Coastguard Worker bool initBounds(const SkTCurve& ); 148*c8dee2aaSAndroid Build Coastguard Worker isBounded()149*c8dee2aaSAndroid Build Coastguard Worker bool isBounded() const { 150*c8dee2aaSAndroid Build Coastguard Worker return fBounded != nullptr; 151*c8dee2aaSAndroid Build Coastguard Worker } 152*c8dee2aaSAndroid Build Coastguard Worker 153*c8dee2aaSAndroid Build Coastguard Worker bool linearsIntersect(SkTSpan* span); 154*c8dee2aaSAndroid Build Coastguard Worker double linearT(const SkDPoint& ) const; 155*c8dee2aaSAndroid Build Coastguard Worker markCoincident()156*c8dee2aaSAndroid Build Coastguard Worker void markCoincident() { 157*c8dee2aaSAndroid Build Coastguard Worker fCoinStart.markCoincident(); 158*c8dee2aaSAndroid Build Coastguard Worker fCoinEnd.markCoincident(); 159*c8dee2aaSAndroid Build Coastguard Worker } 160*c8dee2aaSAndroid Build Coastguard Worker next()161*c8dee2aaSAndroid Build Coastguard Worker const SkTSpan* next() const { 162*c8dee2aaSAndroid Build Coastguard Worker return fNext; 163*c8dee2aaSAndroid Build Coastguard Worker } 164*c8dee2aaSAndroid Build Coastguard Worker 165*c8dee2aaSAndroid Build Coastguard Worker bool onlyEndPointsInCommon(const SkTSpan* opp, bool* start, 166*c8dee2aaSAndroid Build Coastguard Worker bool* oppStart, bool* ptsInCommon); 167*c8dee2aaSAndroid Build Coastguard Worker part()168*c8dee2aaSAndroid Build Coastguard Worker const SkTCurve& part() const { 169*c8dee2aaSAndroid Build Coastguard Worker return *fPart; 170*c8dee2aaSAndroid Build Coastguard Worker } 171*c8dee2aaSAndroid Build Coastguard Worker pointCount()172*c8dee2aaSAndroid Build Coastguard Worker int pointCount() const { 173*c8dee2aaSAndroid Build Coastguard Worker return fPart->pointCount(); 174*c8dee2aaSAndroid Build Coastguard Worker } 175*c8dee2aaSAndroid Build Coastguard Worker pointFirst()176*c8dee2aaSAndroid Build Coastguard Worker const SkDPoint& pointFirst() const { 177*c8dee2aaSAndroid Build Coastguard Worker return (*fPart)[0]; 178*c8dee2aaSAndroid Build Coastguard Worker } 179*c8dee2aaSAndroid Build Coastguard Worker pointLast()180*c8dee2aaSAndroid Build Coastguard Worker const SkDPoint& pointLast() const { 181*c8dee2aaSAndroid Build Coastguard Worker return (*fPart)[fPart->pointLast()]; 182*c8dee2aaSAndroid Build Coastguard Worker } 183*c8dee2aaSAndroid Build Coastguard Worker 184*c8dee2aaSAndroid Build Coastguard Worker bool removeAllBounded(); 185*c8dee2aaSAndroid Build Coastguard Worker bool removeBounded(const SkTSpan* opp); 186*c8dee2aaSAndroid Build Coastguard Worker reset()187*c8dee2aaSAndroid Build Coastguard Worker void reset() { 188*c8dee2aaSAndroid Build Coastguard Worker fBounded = nullptr; 189*c8dee2aaSAndroid Build Coastguard Worker } 190*c8dee2aaSAndroid Build Coastguard Worker resetBounds(const SkTCurve & curve)191*c8dee2aaSAndroid Build Coastguard Worker void resetBounds(const SkTCurve& curve) { 192*c8dee2aaSAndroid Build Coastguard Worker fIsLinear = fIsLine = false; 193*c8dee2aaSAndroid Build Coastguard Worker initBounds(curve); 194*c8dee2aaSAndroid Build Coastguard Worker } 195*c8dee2aaSAndroid Build Coastguard Worker split(SkTSpan * work,SkArenaAlloc * heap)196*c8dee2aaSAndroid Build Coastguard Worker bool split(SkTSpan* work, SkArenaAlloc* heap) { 197*c8dee2aaSAndroid Build Coastguard Worker return splitAt(work, (work->fStartT + work->fEndT) * 0.5, heap); 198*c8dee2aaSAndroid Build Coastguard Worker } 199*c8dee2aaSAndroid Build Coastguard Worker 200*c8dee2aaSAndroid Build Coastguard Worker bool splitAt(SkTSpan* work, double t, SkArenaAlloc* heap); 201*c8dee2aaSAndroid Build Coastguard Worker startT()202*c8dee2aaSAndroid Build Coastguard Worker double startT() const { 203*c8dee2aaSAndroid Build Coastguard Worker return fStartT; 204*c8dee2aaSAndroid Build Coastguard Worker } 205*c8dee2aaSAndroid Build Coastguard Worker 206*c8dee2aaSAndroid Build Coastguard Worker private: 207*c8dee2aaSAndroid Build Coastguard Worker 208*c8dee2aaSAndroid Build Coastguard Worker // implementation is for testing only debugID()209*c8dee2aaSAndroid Build Coastguard Worker int debugID() const { 210*c8dee2aaSAndroid Build Coastguard Worker return PATH_OPS_DEBUG_T_SECT_RELEASE(fID, -1); 211*c8dee2aaSAndroid Build Coastguard Worker } 212*c8dee2aaSAndroid Build Coastguard Worker 213*c8dee2aaSAndroid Build Coastguard Worker void dumpID() const; 214*c8dee2aaSAndroid Build Coastguard Worker 215*c8dee2aaSAndroid Build Coastguard Worker int hullCheck(const SkTSpan* opp, bool* start, bool* oppStart); 216*c8dee2aaSAndroid Build Coastguard Worker int linearIntersects(const SkTCurve& ) const; 217*c8dee2aaSAndroid Build Coastguard Worker SkTSpan* oppT(double t) const; 218*c8dee2aaSAndroid Build Coastguard Worker 219*c8dee2aaSAndroid Build Coastguard Worker void validate() const; 220*c8dee2aaSAndroid Build Coastguard Worker void validateBounded() const; 221*c8dee2aaSAndroid Build Coastguard Worker void validatePerpT(double oppT) const; 222*c8dee2aaSAndroid Build Coastguard Worker void validatePerpPt(double t, const SkDPoint& ) const; 223*c8dee2aaSAndroid Build Coastguard Worker 224*c8dee2aaSAndroid Build Coastguard Worker SkTCurve* fPart; 225*c8dee2aaSAndroid Build Coastguard Worker SkTCoincident fCoinStart; 226*c8dee2aaSAndroid Build Coastguard Worker SkTCoincident fCoinEnd; 227*c8dee2aaSAndroid Build Coastguard Worker SkTSpanBounded* fBounded; 228*c8dee2aaSAndroid Build Coastguard Worker SkTSpan* fPrev; 229*c8dee2aaSAndroid Build Coastguard Worker SkTSpan* fNext; 230*c8dee2aaSAndroid Build Coastguard Worker SkDRect fBounds; 231*c8dee2aaSAndroid Build Coastguard Worker double fStartT; 232*c8dee2aaSAndroid Build Coastguard Worker double fEndT; 233*c8dee2aaSAndroid Build Coastguard Worker double fBoundsMax; 234*c8dee2aaSAndroid Build Coastguard Worker SkOpDebugBool fCollapsed; 235*c8dee2aaSAndroid Build Coastguard Worker SkOpDebugBool fHasPerp; 236*c8dee2aaSAndroid Build Coastguard Worker SkOpDebugBool fIsLinear; 237*c8dee2aaSAndroid Build Coastguard Worker SkOpDebugBool fIsLine; 238*c8dee2aaSAndroid Build Coastguard Worker SkOpDebugBool fDeleted; 239*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGCODE(SkOpGlobalState* fDebugGlobalState;) 240*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGCODE(SkTSect* fDebugSect;) 241*c8dee2aaSAndroid Build Coastguard Worker PATH_OPS_DEBUG_T_SECT_CODE(int fID;) 242*c8dee2aaSAndroid Build Coastguard Worker friend class SkTSect; 243*c8dee2aaSAndroid Build Coastguard Worker }; 244*c8dee2aaSAndroid Build Coastguard Worker 245*c8dee2aaSAndroid Build Coastguard Worker class SkTSect { 246*c8dee2aaSAndroid Build Coastguard Worker public: 247*c8dee2aaSAndroid Build Coastguard Worker SkTSect(const SkTCurve& c 248*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGPARAMS(SkOpGlobalState* ) PATH_OPS_DEBUG_T_SECT_PARAMS(int id)); 249*c8dee2aaSAndroid Build Coastguard Worker static void BinarySearch(SkTSect* sect1, SkTSect* sect2, 250*c8dee2aaSAndroid Build Coastguard Worker SkIntersections* intersections); 251*c8dee2aaSAndroid Build Coastguard Worker 252*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGCODE(SkOpGlobalState* globalState() { return fDebugGlobalState; }) 253*c8dee2aaSAndroid Build Coastguard Worker bool hasBounded(const SkTSpan* ) const; 254*c8dee2aaSAndroid Build Coastguard Worker debugOpp()255*c8dee2aaSAndroid Build Coastguard Worker const SkTSect* debugOpp() const { 256*c8dee2aaSAndroid Build Coastguard Worker return SkDEBUGRELEASE(fOppSect, nullptr); 257*c8dee2aaSAndroid Build Coastguard Worker } 258*c8dee2aaSAndroid Build Coastguard Worker 259*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG 260*c8dee2aaSAndroid Build Coastguard Worker const SkTSpan* debugSpan(int id) const; 261*c8dee2aaSAndroid Build Coastguard Worker const SkTSpan* debugT(double t) const; 262*c8dee2aaSAndroid Build Coastguard Worker #endif 263*c8dee2aaSAndroid Build Coastguard Worker void dump() const; 264*c8dee2aaSAndroid Build Coastguard Worker void dumpBoth(SkTSect* ) const; 265*c8dee2aaSAndroid Build Coastguard Worker void dumpBounded(int id) const; 266*c8dee2aaSAndroid Build Coastguard Worker void dumpBounds() const; 267*c8dee2aaSAndroid Build Coastguard Worker void dumpCoin() const; 268*c8dee2aaSAndroid Build Coastguard Worker void dumpCoinCurves() const; 269*c8dee2aaSAndroid Build Coastguard Worker void dumpCurves() const; 270*c8dee2aaSAndroid Build Coastguard Worker 271*c8dee2aaSAndroid Build Coastguard Worker private: 272*c8dee2aaSAndroid Build Coastguard Worker enum { 273*c8dee2aaSAndroid Build Coastguard Worker kZeroS1Set = 1, 274*c8dee2aaSAndroid Build Coastguard Worker kOneS1Set = 2, 275*c8dee2aaSAndroid Build Coastguard Worker kZeroS2Set = 4, 276*c8dee2aaSAndroid Build Coastguard Worker kOneS2Set = 8 277*c8dee2aaSAndroid Build Coastguard Worker }; 278*c8dee2aaSAndroid Build Coastguard Worker 279*c8dee2aaSAndroid Build Coastguard Worker SkTSpan* addFollowing(SkTSpan* prior); 280*c8dee2aaSAndroid Build Coastguard Worker void addForPerp(SkTSpan* span, double t); 281*c8dee2aaSAndroid Build Coastguard Worker SkTSpan* addOne(); 282*c8dee2aaSAndroid Build Coastguard Worker addSplitAt(SkTSpan * span,double t)283*c8dee2aaSAndroid Build Coastguard Worker SkTSpan* addSplitAt(SkTSpan* span, double t) { 284*c8dee2aaSAndroid Build Coastguard Worker SkTSpan* result = this->addOne(); 285*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGCODE(result->debugSetGlobalState(this->globalState())); 286*c8dee2aaSAndroid Build Coastguard Worker result->splitAt(span, t, &fHeap); 287*c8dee2aaSAndroid Build Coastguard Worker result->initBounds(fCurve); 288*c8dee2aaSAndroid Build Coastguard Worker span->initBounds(fCurve); 289*c8dee2aaSAndroid Build Coastguard Worker return result; 290*c8dee2aaSAndroid Build Coastguard Worker } 291*c8dee2aaSAndroid Build Coastguard Worker 292*c8dee2aaSAndroid Build Coastguard Worker bool binarySearchCoin(SkTSect* , double tStart, double tStep, double* t, 293*c8dee2aaSAndroid Build Coastguard Worker double* oppT, SkTSpan** oppFirst); 294*c8dee2aaSAndroid Build Coastguard Worker SkTSpan* boundsMax(); 295*c8dee2aaSAndroid Build Coastguard Worker bool coincidentCheck(SkTSect* sect2); 296*c8dee2aaSAndroid Build Coastguard Worker void coincidentForce(SkTSect* sect2, double start1s, double start1e); 297*c8dee2aaSAndroid Build Coastguard Worker bool coincidentHasT(double t); 298*c8dee2aaSAndroid Build Coastguard Worker int collapsed() const; 299*c8dee2aaSAndroid Build Coastguard Worker void computePerpendiculars(SkTSect* sect2, SkTSpan* first, 300*c8dee2aaSAndroid Build Coastguard Worker SkTSpan* last); 301*c8dee2aaSAndroid Build Coastguard Worker int countConsecutiveSpans(SkTSpan* first, 302*c8dee2aaSAndroid Build Coastguard Worker SkTSpan** last) const; 303*c8dee2aaSAndroid Build Coastguard Worker debugID()304*c8dee2aaSAndroid Build Coastguard Worker int debugID() const { 305*c8dee2aaSAndroid Build Coastguard Worker return PATH_OPS_DEBUG_T_SECT_RELEASE(fID, -1); 306*c8dee2aaSAndroid Build Coastguard Worker } 307*c8dee2aaSAndroid Build Coastguard Worker 308*c8dee2aaSAndroid Build Coastguard Worker bool deleteEmptySpans(); 309*c8dee2aaSAndroid Build Coastguard Worker void dumpCommon(const SkTSpan* ) const; 310*c8dee2aaSAndroid Build Coastguard Worker void dumpCommonCurves(const SkTSpan* ) const; 311*c8dee2aaSAndroid Build Coastguard Worker static int EndsEqual(const SkTSect* sect1, const SkTSect* sect2, 312*c8dee2aaSAndroid Build Coastguard Worker SkIntersections* ); 313*c8dee2aaSAndroid Build Coastguard Worker bool extractCoincident(SkTSect* sect2, SkTSpan* first, 314*c8dee2aaSAndroid Build Coastguard Worker SkTSpan* last, SkTSpan** result); 315*c8dee2aaSAndroid Build Coastguard Worker SkTSpan* findCoincidentRun(SkTSpan* first, SkTSpan** lastPtr); 316*c8dee2aaSAndroid Build Coastguard Worker int intersects(SkTSpan* span, SkTSect* opp, 317*c8dee2aaSAndroid Build Coastguard Worker SkTSpan* oppSpan, int* oppResult); 318*c8dee2aaSAndroid Build Coastguard Worker bool isParallel(const SkDLine& thisLine, const SkTSect* opp) const; 319*c8dee2aaSAndroid Build Coastguard Worker int linesIntersect(SkTSpan* span, SkTSect* opp, 320*c8dee2aaSAndroid Build Coastguard Worker SkTSpan* oppSpan, SkIntersections* ); 321*c8dee2aaSAndroid Build Coastguard Worker bool markSpanGone(SkTSpan* span); 322*c8dee2aaSAndroid Build Coastguard Worker bool matchedDirection(double t, const SkTSect* sect2, double t2) const; 323*c8dee2aaSAndroid Build Coastguard Worker void matchedDirCheck(double t, const SkTSect* sect2, double t2, 324*c8dee2aaSAndroid Build Coastguard Worker bool* calcMatched, bool* oppMatched) const; 325*c8dee2aaSAndroid Build Coastguard Worker void mergeCoincidence(SkTSect* sect2); 326*c8dee2aaSAndroid Build Coastguard Worker pointLast()327*c8dee2aaSAndroid Build Coastguard Worker const SkDPoint& pointLast() const { 328*c8dee2aaSAndroid Build Coastguard Worker return fCurve[fCurve.pointLast()]; 329*c8dee2aaSAndroid Build Coastguard Worker } 330*c8dee2aaSAndroid Build Coastguard Worker 331*c8dee2aaSAndroid Build Coastguard Worker SkTSpan* prev(SkTSpan* ) const; 332*c8dee2aaSAndroid Build Coastguard Worker bool removeByPerpendicular(SkTSect* opp); 333*c8dee2aaSAndroid Build Coastguard Worker void recoverCollapsed(); 334*c8dee2aaSAndroid Build Coastguard Worker bool removeCoincident(SkTSpan* span, bool isBetween); 335*c8dee2aaSAndroid Build Coastguard Worker void removeAllBut(const SkTSpan* keep, SkTSpan* span, 336*c8dee2aaSAndroid Build Coastguard Worker SkTSect* opp); 337*c8dee2aaSAndroid Build Coastguard Worker bool removeSpan(SkTSpan* span); 338*c8dee2aaSAndroid Build Coastguard Worker void removeSpanRange(SkTSpan* first, SkTSpan* last); 339*c8dee2aaSAndroid Build Coastguard Worker bool removeSpans(SkTSpan* span, SkTSect* opp); 340*c8dee2aaSAndroid Build Coastguard Worker void removedEndCheck(SkTSpan* span); 341*c8dee2aaSAndroid Build Coastguard Worker resetRemovedEnds()342*c8dee2aaSAndroid Build Coastguard Worker void resetRemovedEnds() { 343*c8dee2aaSAndroid Build Coastguard Worker fRemovedStartT = fRemovedEndT = false; 344*c8dee2aaSAndroid Build Coastguard Worker } 345*c8dee2aaSAndroid Build Coastguard Worker 346*c8dee2aaSAndroid Build Coastguard Worker SkTSpan* spanAtT(double t, SkTSpan** priorSpan); 347*c8dee2aaSAndroid Build Coastguard Worker SkTSpan* tail(); 348*c8dee2aaSAndroid Build Coastguard Worker bool trim(SkTSpan* span, SkTSect* opp); 349*c8dee2aaSAndroid Build Coastguard Worker bool unlinkSpan(SkTSpan* span); 350*c8dee2aaSAndroid Build Coastguard Worker bool updateBounded(SkTSpan* first, SkTSpan* last, 351*c8dee2aaSAndroid Build Coastguard Worker SkTSpan* oppFirst); 352*c8dee2aaSAndroid Build Coastguard Worker void validate() const; 353*c8dee2aaSAndroid Build Coastguard Worker void validateBounded() const; 354*c8dee2aaSAndroid Build Coastguard Worker 355*c8dee2aaSAndroid Build Coastguard Worker const SkTCurve& fCurve; 356*c8dee2aaSAndroid Build Coastguard Worker SkSTArenaAlloc<1024> fHeap; 357*c8dee2aaSAndroid Build Coastguard Worker SkTSpan* fHead; 358*c8dee2aaSAndroid Build Coastguard Worker SkTSpan* fCoincident; 359*c8dee2aaSAndroid Build Coastguard Worker SkTSpan* fDeleted; 360*c8dee2aaSAndroid Build Coastguard Worker int fActiveCount; 361*c8dee2aaSAndroid Build Coastguard Worker bool fRemovedStartT; 362*c8dee2aaSAndroid Build Coastguard Worker bool fRemovedEndT; 363*c8dee2aaSAndroid Build Coastguard Worker bool fHung; 364*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGCODE(SkOpGlobalState* fDebugGlobalState;) 365*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGCODE(SkTSect* fOppSect;) 366*c8dee2aaSAndroid Build Coastguard Worker PATH_OPS_DEBUG_T_SECT_CODE(int fID;) 367*c8dee2aaSAndroid Build Coastguard Worker PATH_OPS_DEBUG_T_SECT_CODE(int fDebugCount;) 368*c8dee2aaSAndroid Build Coastguard Worker #if DEBUG_T_SECT 369*c8dee2aaSAndroid Build Coastguard Worker int fDebugAllocatedCount; 370*c8dee2aaSAndroid Build Coastguard Worker #endif 371*c8dee2aaSAndroid Build Coastguard Worker friend class SkTSpan; 372*c8dee2aaSAndroid Build Coastguard Worker }; 373*c8dee2aaSAndroid Build Coastguard Worker 374*c8dee2aaSAndroid Build Coastguard Worker #endif 375