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