| Index: src/pathops/SkPathOpsTypes.h
|
| diff --git a/src/pathops/SkPathOpsTypes.h b/src/pathops/SkPathOpsTypes.h
|
| index 00c3e5fe9344cc464384953994106bfb7d8ad807..ad2ad463e68279be9efc852f571a8246402601af 100644
|
| --- a/src/pathops/SkPathOpsTypes.h
|
| +++ b/src/pathops/SkPathOpsTypes.h
|
| @@ -22,6 +22,7 @@ enum SkPathOpsMask {
|
| kEvenOdd_PathOpsMask = 1
|
| };
|
|
|
| +class SkChunkAlloc;
|
| class SkOpCoincidence;
|
| class SkOpContour;
|
| class SkOpContourHead;
|
| @@ -30,8 +31,8 @@ class SkIntersectionHelper;
|
|
|
| class SkOpGlobalState {
|
| public:
|
| - SkOpGlobalState(SkOpCoincidence* coincidence, SkOpContourHead* head
|
| - SkDEBUGPARAMS(bool debugSkipAssert)
|
| + SkOpGlobalState(SkOpContourHead* head,
|
| + SkChunkAlloc* allocator SkDEBUGPARAMS(bool debugSkipAssert)
|
| SkDEBUGPARAMS(const char* testName));
|
|
|
| enum Phase {
|
| @@ -44,6 +45,10 @@ public:
|
| kMaxWindingTries = 10
|
| };
|
|
|
| + SkChunkAlloc* allocator() {
|
| + return fAllocator;
|
| + }
|
| +
|
| bool angleCoincidence() const {
|
| return fAngleCoincidence;
|
| }
|
| @@ -65,7 +70,8 @@ public:
|
| }
|
|
|
| #ifdef SK_DEBUG
|
| - const struct SkOpAngle* debugAngle(int id) const;
|
| + const class SkOpAngle* debugAngle(int id) const;
|
| + const SkOpCoincidence* debugCoincidence() const;
|
| SkOpContour* debugContour(int id);
|
| const class SkOpPtT* debugPtT(int id) const;
|
| bool debugRunFail() const;
|
| @@ -83,6 +89,11 @@ public:
|
| void debugResetLoopCounts();
|
| #endif
|
|
|
| +#if DEBUG_COINCIDENCE
|
| + void debugSetCheckHealth(bool check) { fDebugCheckHealth = check; }
|
| + bool debugCheckHealth() const { return fDebugCheckHealth; }
|
| +#endif
|
| +
|
| int nested() const {
|
| return fNested;
|
| }
|
| @@ -120,6 +131,10 @@ public:
|
| void setAngleCoincidence() {
|
| fAngleCoincidence = true;
|
| }
|
| +
|
| + void setCoincidence(SkOpCoincidence* coincidence) {
|
| + fCoincidence = coincidence;
|
| + }
|
|
|
| void setContourHead(SkOpContourHead* contourHead) {
|
| fContourHead = contourHead;
|
| @@ -140,6 +155,7 @@ public:
|
| }
|
|
|
| private:
|
| + SkChunkAlloc* fAllocator;
|
| SkOpCoincidence* fCoincidence;
|
| SkOpContourHead* fContourHead;
|
| int fNested;
|
| @@ -162,6 +178,9 @@ private:
|
| SkPoint fDebugWorstPts[24];
|
| float fDebugWorstWeight[6];
|
| #endif
|
| +#if DEBUG_COINCIDENCE
|
| + bool fDebugCheckHealth;
|
| +#endif
|
| };
|
|
|
| // Use Almost Equal when comparing coordinates. Use epsilon to compare T values.
|
| @@ -170,6 +189,11 @@ inline bool AlmostEqualUlps(double a, double b) {
|
| return AlmostEqualUlps(SkDoubleToScalar(a), SkDoubleToScalar(b));
|
| }
|
|
|
| +bool AlmostEqualUlpsNoNormalCheck(float a, float b);
|
| +inline bool AlmostEqualUlpsNoNormalCheck(double a, double b) {
|
| + return AlmostEqualUlpsNoNormalCheck(SkDoubleToScalar(a), SkDoubleToScalar(b));
|
| +}
|
| +
|
| bool AlmostEqualUlps_Pin(float a, float b);
|
| inline bool AlmostEqualUlps_Pin(double a, double b) {
|
| return AlmostEqualUlps_Pin(SkDoubleToScalar(a), SkDoubleToScalar(b));
|
| @@ -246,6 +270,8 @@ const double MORE_ROUGH_EPSILON = FLT_EPSILON * 256;
|
| const double WAY_ROUGH_EPSILON = FLT_EPSILON * 2048;
|
| const double BUMP_EPSILON = FLT_EPSILON * 4096;
|
|
|
| +const SkScalar INVERSE_NUMBER_RANGE = FLT_EPSILON_ORDERABLE_ERR;
|
| +
|
| inline bool zero_or_one(double x) {
|
| return x == 0 || x == 1;
|
| }
|
| @@ -298,7 +324,6 @@ inline bool approximately_zero_inverse(double x) {
|
| return fabs(x) > FLT_EPSILON_INVERSE;
|
| }
|
|
|
| -// OPTIMIZATION: if called multiple times with the same denom, we want to pass 1/y instead
|
| inline bool approximately_zero_when_compared_to(double x, double y) {
|
| return x == 0 || fabs(x) < fabs(y * FLT_EPSILON);
|
| }
|
| @@ -307,6 +332,10 @@ inline bool precisely_zero_when_compared_to(double x, double y) {
|
| return x == 0 || fabs(x) < fabs(y * DBL_EPSILON);
|
| }
|
|
|
| +inline bool roughly_zero_when_compared_to(double x, double y) {
|
| + return x == 0 || fabs(x) < fabs(y * ROUGH_EPSILON);
|
| +}
|
| +
|
| // Use this for comparing Ts in the range of 0 to 1. For general numbers (larger and smaller) use
|
| // AlmostEqualUlps instead.
|
| inline bool approximately_equal(double x, double y) {
|
|
|