| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 #ifndef SkPathOpsTypes_DEFINED | 7 #ifndef SkPathOpsTypes_DEFINED |
| 8 #define SkPathOpsTypes_DEFINED | 8 #define SkPathOpsTypes_DEFINED |
| 9 | 9 |
| 10 #include <float.h> // for FLT_EPSILON | 10 #include <float.h> // for FLT_EPSILON |
| 11 #include <math.h> // for fabs, sqrt | 11 #include <math.h> // for fabs, sqrt |
| 12 | 12 |
| 13 #include "SkFloatingPoint.h" | 13 #include "SkFloatingPoint.h" |
| 14 #include "SkPath.h" | 14 #include "SkPath.h" |
| 15 #include "SkPathOps.h" | 15 #include "SkPathOps.h" |
| 16 #include "SkPathOpsDebug.h" | 16 #include "SkPathOpsDebug.h" |
| 17 #include "SkScalar.h" | 17 #include "SkScalar.h" |
| 18 | 18 |
| 19 enum SkPathOpsMask { | 19 enum SkPathOpsMask { |
| 20 kWinding_PathOpsMask = -1, | 20 kWinding_PathOpsMask = -1, |
| 21 kNo_PathOpsMask = 0, | 21 kNo_PathOpsMask = 0, |
| 22 kEvenOdd_PathOpsMask = 1 | 22 kEvenOdd_PathOpsMask = 1 |
| 23 }; | 23 }; |
| 24 | 24 |
| 25 class SkOpCoincidence; | 25 class SkOpCoincidence; |
| 26 class SkOpContour; | 26 class SkOpContour; |
| 27 class SkOpContourHead; | 27 class SkOpContourHead; |
| 28 class SkIntersections; |
| 29 class SkIntersectionHelper; |
| 28 | 30 |
| 29 class SkOpGlobalState { | 31 class SkOpGlobalState { |
| 30 public: | 32 public: |
| 31 SkOpGlobalState(SkOpCoincidence* coincidence, SkOpContourHead* head | 33 SkOpGlobalState(SkOpCoincidence* coincidence, SkOpContourHead* head |
| 32 SkDEBUGPARAMS(const char* testName)); | 34 SkDEBUGPARAMS(const char* testName)); |
| 33 | 35 |
| 34 enum Phase { | 36 enum Phase { |
| 35 kIntersecting, | 37 kIntersecting, |
| 36 kWalking, | 38 kWalking, |
| 37 kFixWinding, | 39 kFixWinding, |
| 38 }; | 40 }; |
| 39 | 41 |
| 40 enum { | 42 enum { |
| 41 kMaxWindingTries = 10 | 43 kMaxWindingTries = 10 |
| 42 }; | 44 }; |
| 43 | 45 |
| 44 bool angleCoincidence() { | 46 bool angleCoincidence() const { |
| 45 return fAngleCoincidence; | 47 return fAngleCoincidence; |
| 46 } | 48 } |
| 47 | 49 |
| 48 void bumpNested() { | 50 void bumpNested() { |
| 49 ++fNested; | 51 ++fNested; |
| 50 } | 52 } |
| 51 | 53 |
| 52 void clearNested() { | 54 void clearNested() { |
| 53 fNested = 0; | 55 fNested = 0; |
| 54 } | 56 } |
| 55 | 57 |
| 56 SkOpCoincidence* coincidence() { | 58 SkOpCoincidence* coincidence() { |
| 57 return fCoincidence; | 59 return fCoincidence; |
| 58 } | 60 } |
| 59 | 61 |
| 60 SkOpContourHead* contourHead() { | 62 SkOpContourHead* contourHead() { |
| 61 return fContourHead; | 63 return fContourHead; |
| 62 } | 64 } |
| 63 | 65 |
| 64 #ifdef SK_DEBUG | 66 #ifdef SK_DEBUG |
| 65 const struct SkOpAngle* debugAngle(int id) const; | 67 const struct SkOpAngle* debugAngle(int id) const; |
| 66 SkOpContour* debugContour(int id); | 68 SkOpContour* debugContour(int id); |
| 67 const class SkOpPtT* debugPtT(int id) const; | 69 const class SkOpPtT* debugPtT(int id) const; |
| 68 bool debugRunFail() const; | 70 bool debugRunFail() const; |
| 69 const class SkOpSegment* debugSegment(int id) const; | 71 const class SkOpSegment* debugSegment(int id) const; |
| 70 const class SkOpSpanBase* debugSpan(int id) const; | 72 const class SkOpSpanBase* debugSpan(int id) const; |
| 71 const char* debugTestName() const { return fDebugTestName; } | 73 const char* debugTestName() const { return fDebugTestName; } |
| 72 #endif | 74 #endif |
| 73 | 75 |
| 76 #if DEBUG_T_SECT_LOOP_COUNT |
| 77 void debugAddLoopCount(SkIntersections* , const SkIntersectionHelper& , |
| 78 const SkIntersectionHelper& ); |
| 79 void debugDoYourWorst(SkOpGlobalState* ); |
| 80 void debugLoopReport(); |
| 81 void debugResetLoopCounts(); |
| 82 #endif |
| 83 |
| 74 int nested() const { | 84 int nested() const { |
| 75 return fNested; | 85 return fNested; |
| 76 } | 86 } |
| 77 | 87 |
| 78 #ifdef SK_DEBUG | 88 #ifdef SK_DEBUG |
| 79 int nextAngleID() { | 89 int nextAngleID() { |
| 80 return ++fAngleID; | 90 return ++fAngleID; |
| 81 } | 91 } |
| 82 | 92 |
| 93 int nextCoinID() { |
| 94 return ++fCoinID; |
| 95 } |
| 96 |
| 83 int nextContourID() { | 97 int nextContourID() { |
| 84 return ++fContourID; | 98 return ++fContourID; |
| 85 } | 99 } |
| 100 |
| 86 int nextPtTID() { | 101 int nextPtTID() { |
| 87 return ++fPtTID; | 102 return ++fPtTID; |
| 88 } | 103 } |
| 89 | 104 |
| 90 int nextSegmentID() { | 105 int nextSegmentID() { |
| 91 return ++fSegmentID; | 106 return ++fSegmentID; |
| 92 } | 107 } |
| 93 | 108 |
| 94 int nextSpanID() { | 109 int nextSpanID() { |
| 95 return ++fSpanID; | 110 return ++fSpanID; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 125 private: | 140 private: |
| 126 SkOpCoincidence* fCoincidence; | 141 SkOpCoincidence* fCoincidence; |
| 127 SkOpContourHead* fContourHead; | 142 SkOpContourHead* fContourHead; |
| 128 int fNested; | 143 int fNested; |
| 129 bool fWindingFailed; | 144 bool fWindingFailed; |
| 130 bool fAngleCoincidence; | 145 bool fAngleCoincidence; |
| 131 Phase fPhase; | 146 Phase fPhase; |
| 132 #ifdef SK_DEBUG | 147 #ifdef SK_DEBUG |
| 133 const char* fDebugTestName; | 148 const char* fDebugTestName; |
| 134 int fAngleID; | 149 int fAngleID; |
| 150 int fCoinID; |
| 135 int fContourID; | 151 int fContourID; |
| 136 int fPtTID; | 152 int fPtTID; |
| 137 int fSegmentID; | 153 int fSegmentID; |
| 138 int fSpanID; | 154 int fSpanID; |
| 139 #endif | 155 #endif |
| 156 #if DEBUG_T_SECT_LOOP_COUNT |
| 157 int fDebugLoopCount[3]; |
| 158 SkPath::Verb fDebugWorstVerb[6]; |
| 159 SkPoint fDebugWorstPts[24]; |
| 160 float fDebugWorstWeight[6]; |
| 161 #endif |
| 140 }; | 162 }; |
| 141 | 163 |
| 142 // Use Almost Equal when comparing coordinates. Use epsilon to compare T values. | 164 // Use Almost Equal when comparing coordinates. Use epsilon to compare T values. |
| 143 bool AlmostEqualUlps(float a, float b); | 165 bool AlmostEqualUlps(float a, float b); |
| 144 inline bool AlmostEqualUlps(double a, double b) { | 166 inline bool AlmostEqualUlps(double a, double b) { |
| 145 return AlmostEqualUlps(SkDoubleToScalar(a), SkDoubleToScalar(b)); | 167 return AlmostEqualUlps(SkDoubleToScalar(a), SkDoubleToScalar(b)); |
| 146 } | 168 } |
| 147 | 169 |
| 148 // Use Almost Dequal when comparing should not special case denormalized values. | 170 // Use Almost Dequal when comparing should not special case denormalized values. |
| 149 bool AlmostDequalUlps(float a, float b); | 171 bool AlmostDequalUlps(float a, float b); |
| (...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 504 */ | 526 */ |
| 505 inline int SkDSideBit(double x) { | 527 inline int SkDSideBit(double x) { |
| 506 return 1 << SKDSide(x); | 528 return 1 << SKDSide(x); |
| 507 } | 529 } |
| 508 | 530 |
| 509 inline double SkPinT(double t) { | 531 inline double SkPinT(double t) { |
| 510 return precisely_less_than_zero(t) ? 0 : precisely_greater_than_one(t) ? 1 :
t; | 532 return precisely_less_than_zero(t) ? 0 : precisely_greater_than_one(t) ? 1 :
t; |
| 511 } | 533 } |
| 512 | 534 |
| 513 #endif | 535 #endif |
| OLD | NEW |