SkPathOpsTypes.h revision 1049f1246e7be4ccb68001361efceb8933e6f81c
107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com/*
207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com * Copyright 2012 Google Inc.
307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com *
407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com * Use of this source code is governed by a BSD-style license that can be
507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com * found in the LICENSE file.
607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com */
707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#ifndef SkPathOpsTypes_DEFINED
807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#define SkPathOpsTypes_DEFINED
907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
1007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#include <float.h>  // for FLT_EPSILON
1107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#include <math.h>   // for fabs, sqrt
1207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
1307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#include "SkFloatingPoint.h"
14277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com#include "SkPath.h"
1507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#include "SkPathOps.h"
1607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#include "SkPathOpsDebug.h"
1707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#include "SkScalar.h"
1807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
1907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comenum SkPathOpsMask {
2007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    kWinding_PathOpsMask = -1,
2107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    kNo_PathOpsMask = 0,
2207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    kEvenOdd_PathOpsMask = 1
2307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com};
2407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
2554359294a7c9dc54802d512a5d891a35c1663392caryclarkclass SkOpCoincidence;
2654359294a7c9dc54802d512a5d891a35c1663392caryclarkclass SkOpContour;
2754359294a7c9dc54802d512a5d891a35c1663392caryclark
2854359294a7c9dc54802d512a5d891a35c1663392caryclarkclass SkOpGlobalState {
2954359294a7c9dc54802d512a5d891a35c1663392caryclarkpublic:
301049f1246e7be4ccb68001361efceb8933e6f81ccaryclark    SkOpGlobalState(SkOpCoincidence* coincidence  SkDEBUGPARAMS(SkOpContour* head))
3154359294a7c9dc54802d512a5d891a35c1663392caryclark        : fCoincidence(coincidence)
3254359294a7c9dc54802d512a5d891a35c1663392caryclark        , fWindingFailed(false)
3354359294a7c9dc54802d512a5d891a35c1663392caryclark        , fAngleCoincidence(false)
3454359294a7c9dc54802d512a5d891a35c1663392caryclark#if DEBUG_VALIDATE
3554359294a7c9dc54802d512a5d891a35c1663392caryclark        , fPhase(kIntersecting)
3654359294a7c9dc54802d512a5d891a35c1663392caryclark#endif
371049f1246e7be4ccb68001361efceb8933e6f81ccaryclark        SkDEBUGPARAMS(fHead(head))
381049f1246e7be4ccb68001361efceb8933e6f81ccaryclark        SkDEBUGPARAMS(fAngleID(0))
391049f1246e7be4ccb68001361efceb8933e6f81ccaryclark        SkDEBUGPARAMS(fContourID(0))
401049f1246e7be4ccb68001361efceb8933e6f81ccaryclark        SkDEBUGPARAMS(fPtTID(0))
411049f1246e7be4ccb68001361efceb8933e6f81ccaryclark        SkDEBUGPARAMS(fSegmentID(0))
421049f1246e7be4ccb68001361efceb8933e6f81ccaryclark        SkDEBUGPARAMS(fSpanID(0)) {
4354359294a7c9dc54802d512a5d891a35c1663392caryclark    }
4454359294a7c9dc54802d512a5d891a35c1663392caryclark
4554359294a7c9dc54802d512a5d891a35c1663392caryclark#if DEBUG_VALIDATE
4654359294a7c9dc54802d512a5d891a35c1663392caryclark    enum Phase {
4754359294a7c9dc54802d512a5d891a35c1663392caryclark        kIntersecting,
4854359294a7c9dc54802d512a5d891a35c1663392caryclark        kWalking
4954359294a7c9dc54802d512a5d891a35c1663392caryclark    };
5054359294a7c9dc54802d512a5d891a35c1663392caryclark#endif
5154359294a7c9dc54802d512a5d891a35c1663392caryclark
5254359294a7c9dc54802d512a5d891a35c1663392caryclark    bool angleCoincidence() {
5354359294a7c9dc54802d512a5d891a35c1663392caryclark        return fAngleCoincidence;
5454359294a7c9dc54802d512a5d891a35c1663392caryclark    }
5554359294a7c9dc54802d512a5d891a35c1663392caryclark
5654359294a7c9dc54802d512a5d891a35c1663392caryclark    SkOpCoincidence* coincidence() {
5754359294a7c9dc54802d512a5d891a35c1663392caryclark        return fCoincidence;
5854359294a7c9dc54802d512a5d891a35c1663392caryclark    }
5954359294a7c9dc54802d512a5d891a35c1663392caryclark
6054359294a7c9dc54802d512a5d891a35c1663392caryclark#ifdef SK_DEBUG
6154359294a7c9dc54802d512a5d891a35c1663392caryclark    const struct SkOpAngle* debugAngle(int id) const;
6254359294a7c9dc54802d512a5d891a35c1663392caryclark    SkOpContour* debugContour(int id);
6354359294a7c9dc54802d512a5d891a35c1663392caryclark    const class SkOpPtT* debugPtT(int id) const;
6454359294a7c9dc54802d512a5d891a35c1663392caryclark    const class SkOpSegment* debugSegment(int id) const;
6554359294a7c9dc54802d512a5d891a35c1663392caryclark    const class SkOpSpanBase* debugSpan(int id) const;
6654359294a7c9dc54802d512a5d891a35c1663392caryclark
6754359294a7c9dc54802d512a5d891a35c1663392caryclark    int nextAngleID() {
6854359294a7c9dc54802d512a5d891a35c1663392caryclark        return ++fAngleID;
6954359294a7c9dc54802d512a5d891a35c1663392caryclark    }
7054359294a7c9dc54802d512a5d891a35c1663392caryclark
7154359294a7c9dc54802d512a5d891a35c1663392caryclark    int nextContourID() {
7254359294a7c9dc54802d512a5d891a35c1663392caryclark        return ++fContourID;
7354359294a7c9dc54802d512a5d891a35c1663392caryclark    }
7454359294a7c9dc54802d512a5d891a35c1663392caryclark    int nextPtTID() {
7554359294a7c9dc54802d512a5d891a35c1663392caryclark        return ++fPtTID;
7654359294a7c9dc54802d512a5d891a35c1663392caryclark    }
7754359294a7c9dc54802d512a5d891a35c1663392caryclark
7854359294a7c9dc54802d512a5d891a35c1663392caryclark    int nextSegmentID() {
7954359294a7c9dc54802d512a5d891a35c1663392caryclark        return ++fSegmentID;
8054359294a7c9dc54802d512a5d891a35c1663392caryclark    }
8154359294a7c9dc54802d512a5d891a35c1663392caryclark
8254359294a7c9dc54802d512a5d891a35c1663392caryclark    int nextSpanID() {
8354359294a7c9dc54802d512a5d891a35c1663392caryclark        return ++fSpanID;
8454359294a7c9dc54802d512a5d891a35c1663392caryclark    }
8554359294a7c9dc54802d512a5d891a35c1663392caryclark#endif
8654359294a7c9dc54802d512a5d891a35c1663392caryclark
8754359294a7c9dc54802d512a5d891a35c1663392caryclark#if DEBUG_VALIDATE
8854359294a7c9dc54802d512a5d891a35c1663392caryclark    Phase phase() const {
8954359294a7c9dc54802d512a5d891a35c1663392caryclark        return fPhase;
9054359294a7c9dc54802d512a5d891a35c1663392caryclark    }
9154359294a7c9dc54802d512a5d891a35c1663392caryclark#endif
9254359294a7c9dc54802d512a5d891a35c1663392caryclark
9354359294a7c9dc54802d512a5d891a35c1663392caryclark    void setAngleCoincidence() {
9454359294a7c9dc54802d512a5d891a35c1663392caryclark        fAngleCoincidence = true;
9554359294a7c9dc54802d512a5d891a35c1663392caryclark    }
9654359294a7c9dc54802d512a5d891a35c1663392caryclark
9754359294a7c9dc54802d512a5d891a35c1663392caryclark#if DEBUG_VALIDATE
9854359294a7c9dc54802d512a5d891a35c1663392caryclark    void setPhase(Phase phase) {
9954359294a7c9dc54802d512a5d891a35c1663392caryclark        SkASSERT(fPhase != phase);
10054359294a7c9dc54802d512a5d891a35c1663392caryclark        fPhase = phase;
10154359294a7c9dc54802d512a5d891a35c1663392caryclark    }
10254359294a7c9dc54802d512a5d891a35c1663392caryclark#endif
10354359294a7c9dc54802d512a5d891a35c1663392caryclark
10454359294a7c9dc54802d512a5d891a35c1663392caryclark    // called in very rare cases where angles are sorted incorrectly -- signfies op will fail
10554359294a7c9dc54802d512a5d891a35c1663392caryclark    void setWindingFailed() {
10654359294a7c9dc54802d512a5d891a35c1663392caryclark        fWindingFailed = true;
10754359294a7c9dc54802d512a5d891a35c1663392caryclark    }
10854359294a7c9dc54802d512a5d891a35c1663392caryclark
10954359294a7c9dc54802d512a5d891a35c1663392caryclark    bool windingFailed() const {
11054359294a7c9dc54802d512a5d891a35c1663392caryclark        return fWindingFailed;
11154359294a7c9dc54802d512a5d891a35c1663392caryclark    }
11254359294a7c9dc54802d512a5d891a35c1663392caryclark
11354359294a7c9dc54802d512a5d891a35c1663392caryclarkprivate:
11454359294a7c9dc54802d512a5d891a35c1663392caryclark    SkOpCoincidence* fCoincidence;
11554359294a7c9dc54802d512a5d891a35c1663392caryclark    bool fWindingFailed;
11654359294a7c9dc54802d512a5d891a35c1663392caryclark    bool fAngleCoincidence;
11754359294a7c9dc54802d512a5d891a35c1663392caryclark#if DEBUG_VALIDATE
11854359294a7c9dc54802d512a5d891a35c1663392caryclark    Phase fPhase;
11954359294a7c9dc54802d512a5d891a35c1663392caryclark#endif
12054359294a7c9dc54802d512a5d891a35c1663392caryclark#ifdef SK_DEBUG
12154359294a7c9dc54802d512a5d891a35c1663392caryclark    SkOpContour* fHead;
12254359294a7c9dc54802d512a5d891a35c1663392caryclark    int fAngleID;
12354359294a7c9dc54802d512a5d891a35c1663392caryclark    int fContourID;
12454359294a7c9dc54802d512a5d891a35c1663392caryclark    int fPtTID;
12554359294a7c9dc54802d512a5d891a35c1663392caryclark    int fSegmentID;
12654359294a7c9dc54802d512a5d891a35c1663392caryclark    int fSpanID;
12754359294a7c9dc54802d512a5d891a35c1663392caryclark#endif
12854359294a7c9dc54802d512a5d891a35c1663392caryclark};
12954359294a7c9dc54802d512a5d891a35c1663392caryclark
130c3f63570c35a1e2bc84b33906c6401d6f3062bf2caryclark@google.com// Use Almost Equal when comparing coordinates. Use epsilon to compare T values.
1314fdbb229649caf74e5c1b55a1823926df903af34caryclark@google.combool AlmostEqualUlps(float a, float b);
1324fdbb229649caf74e5c1b55a1823926df903af34caryclark@google.cominline bool AlmostEqualUlps(double a, double b) {
1334fdbb229649caf74e5c1b55a1823926df903af34caryclark@google.com    return AlmostEqualUlps(SkDoubleToScalar(a), SkDoubleToScalar(b));
13407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
13507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
1367eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com// Use Almost Dequal when comparing should not special case denormalized values.
1377eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.combool AlmostDequalUlps(float a, float b);
1382db7fe7d3b7ee875e1099a22f0af17520696f5d7commit-bot@chromium.orgbool AlmostDequalUlps(double a, double b);
1397eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com
140570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.combool NotAlmostEqualUlps(float a, float b);
141570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.cominline bool NotAlmostEqualUlps(double a, double b) {
142570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    return NotAlmostEqualUlps(SkDoubleToScalar(a), SkDoubleToScalar(b));
143570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com}
144570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com
1457eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.combool NotAlmostDequalUlps(float a, float b);
1467eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.cominline bool NotAlmostDequalUlps(double a, double b) {
1477eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com    return NotAlmostDequalUlps(SkDoubleToScalar(a), SkDoubleToScalar(b));
1487eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com}
1497eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com
150570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com// Use Almost Bequal when comparing coordinates in conjunction with between.
151570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.combool AlmostBequalUlps(float a, float b);
152570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.cominline bool AlmostBequalUlps(double a, double b) {
153570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    return AlmostBequalUlps(SkDoubleToScalar(a), SkDoubleToScalar(b));
154570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com}
155570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com
156a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.combool AlmostPequalUlps(float a, float b);
157a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.cominline bool AlmostPequalUlps(double a, double b) {
158a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.com    return AlmostPequalUlps(SkDoubleToScalar(a), SkDoubleToScalar(b));
159a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.com}
160a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.com
1614fdbb229649caf74e5c1b55a1823926df903af34caryclark@google.combool RoughlyEqualUlps(float a, float b);
1624fdbb229649caf74e5c1b55a1823926df903af34caryclark@google.cominline bool RoughlyEqualUlps(double a, double b) {
1634fdbb229649caf74e5c1b55a1823926df903af34caryclark@google.com    return RoughlyEqualUlps(SkDoubleToScalar(a), SkDoubleToScalar(b));
16407e97fccd2d85076cd22ef411b0773ab92a18abecaryclark@google.com}
16507e97fccd2d85076cd22ef411b0773ab92a18abecaryclark@google.com
166570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.combool AlmostLessUlps(float a, float b);
167570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.cominline bool AlmostLessUlps(double a, double b) {
168570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    return AlmostLessUlps(SkDoubleToScalar(a), SkDoubleToScalar(b));
169570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com}
170570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com
171570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.combool AlmostLessOrEqualUlps(float a, float b);
172570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.cominline bool AlmostLessOrEqualUlps(double a, double b) {
173570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    return AlmostLessOrEqualUlps(SkDoubleToScalar(a), SkDoubleToScalar(b));
174570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com}
175570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com
176fa2aeee27af27f2934ee52a9732148f66481fb03caryclark@google.combool AlmostBetweenUlps(float a, float b, float c);
1774fdbb229649caf74e5c1b55a1823926df903af34caryclark@google.cominline bool AlmostBetweenUlps(double a, double b, double c) {
1784fdbb229649caf74e5c1b55a1823926df903af34caryclark@google.com    return AlmostBetweenUlps(SkDoubleToScalar(a), SkDoubleToScalar(b), SkDoubleToScalar(c));
1794fdbb229649caf74e5c1b55a1823926df903af34caryclark@google.com}
1804fdbb229649caf74e5c1b55a1823926df903af34caryclark@google.com
1814fdbb229649caf74e5c1b55a1823926df903af34caryclark@google.comint UlpsDistance(float a, float b);
1824fdbb229649caf74e5c1b55a1823926df903af34caryclark@google.cominline int UlpsDistance(double a, double b) {
1834fdbb229649caf74e5c1b55a1823926df903af34caryclark@google.com    return UlpsDistance(SkDoubleToScalar(a), SkDoubleToScalar(b));
184fa2aeee27af27f2934ee52a9732148f66481fb03caryclark@google.com}
185fa2aeee27af27f2934ee52a9732148f66481fb03caryclark@google.com
18607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com// FLT_EPSILON == 1.19209290E-07 == 1 / (2 ^ 23)
18707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com// DBL_EPSILON == 2.22045e-16
18807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comconst double FLT_EPSILON_CUBED = FLT_EPSILON * FLT_EPSILON * FLT_EPSILON;
18907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comconst double FLT_EPSILON_HALF = FLT_EPSILON / 2;
190cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.comconst double FLT_EPSILON_DOUBLE = FLT_EPSILON * 2;
1914431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.orgconst double FLT_EPSILON_ORDERABLE_ERR = FLT_EPSILON * 16;
19207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comconst double FLT_EPSILON_SQUARED = FLT_EPSILON * FLT_EPSILON;
19307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comconst double FLT_EPSILON_SQRT = sqrt(FLT_EPSILON);
19407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comconst double FLT_EPSILON_INVERSE = 1 / FLT_EPSILON;
19507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comconst double DBL_EPSILON_ERR = DBL_EPSILON * 4;  // FIXME: tune -- allow a few bits of error
196cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.comconst double DBL_EPSILON_SUBDIVIDE_ERR = DBL_EPSILON * 16;
19707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comconst double ROUGH_EPSILON = FLT_EPSILON * 64;
19807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comconst double MORE_ROUGH_EPSILON = FLT_EPSILON * 256;
199dac1d17027dcaa5596885a9f333979418b35001ccaryclarkconst double WAY_ROUGH_EPSILON = FLT_EPSILON * 2048;
20054359294a7c9dc54802d512a5d891a35c1663392caryclarkconst double BUMP_EPSILON = FLT_EPSILON * 4096;
201dac1d17027dcaa5596885a9f333979418b35001ccaryclark
202dac1d17027dcaa5596885a9f333979418b35001ccaryclarkinline bool zero_or_one(double x) {
203dac1d17027dcaa5596885a9f333979418b35001ccaryclark    return x == 0 || x == 1;
204dac1d17027dcaa5596885a9f333979418b35001ccaryclark}
20507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
20607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_zero(double x) {
20707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return fabs(x) < FLT_EPSILON;
20807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
20907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
21007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool precisely_zero(double x) {
21107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return fabs(x) < DBL_EPSILON_ERR;
21207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
21307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
214cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.cominline bool precisely_subdivide_zero(double x) {
215cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.com    return fabs(x) < DBL_EPSILON_SUBDIVIDE_ERR;
216cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.com}
217cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.com
21807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_zero(float x) {
21907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return fabs(x) < FLT_EPSILON;
22007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
22107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
22207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_zero_cubed(double x) {
22307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return fabs(x) < FLT_EPSILON_CUBED;
22407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
22507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
22607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_zero_half(double x) {
22707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return fabs(x) < FLT_EPSILON_HALF;
22807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
22907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
230cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.cominline bool approximately_zero_double(double x) {
231cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.com    return fabs(x) < FLT_EPSILON_DOUBLE;
232cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.com}
233cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.com
2344431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.orginline bool approximately_zero_orderable(double x) {
2354431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org    return fabs(x) < FLT_EPSILON_ORDERABLE_ERR;
2364431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org}
2374431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org
23807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_zero_squared(double x) {
23907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return fabs(x) < FLT_EPSILON_SQUARED;
24007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
24107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
24207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_zero_sqrt(double x) {
24307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return fabs(x) < FLT_EPSILON_SQRT;
24407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
24507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
246cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.cominline bool roughly_zero(double x) {
247cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.com    return fabs(x) < ROUGH_EPSILON;
248cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.com}
249cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.com
25007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_zero_inverse(double x) {
25107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return fabs(x) > FLT_EPSILON_INVERSE;
25207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
25307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
25407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com// OPTIMIZATION: if called multiple times with the same denom, we want to pass 1/y instead
25507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_zero_when_compared_to(double x, double y) {
2564431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org    return x == 0 || fabs(x) < fabs(y * FLT_EPSILON);
25707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
25807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
25954359294a7c9dc54802d512a5d891a35c1663392caryclarkinline bool precisely_zero_when_compared_to(double x, double y) {
26054359294a7c9dc54802d512a5d891a35c1663392caryclark    return x == 0 || fabs(x) < fabs(y * DBL_EPSILON);
26154359294a7c9dc54802d512a5d891a35c1663392caryclark}
26254359294a7c9dc54802d512a5d891a35c1663392caryclark
26307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com// Use this for comparing Ts in the range of 0 to 1. For general numbers (larger and smaller) use
26407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com// AlmostEqualUlps instead.
26507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_equal(double x, double y) {
26607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return approximately_zero(x - y);
26707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
26807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
26907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool precisely_equal(double x, double y) {
27007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return precisely_zero(x - y);
27107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
27207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
273cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.cominline bool precisely_subdivide_equal(double x, double y) {
274cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.com    return precisely_subdivide_zero(x - y);
275cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.com}
276cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.com
27707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_equal_half(double x, double y) {
27807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return approximately_zero_half(x - y);
27907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
28007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
281cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.cominline bool approximately_equal_double(double x, double y) {
282cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.com    return approximately_zero_double(x - y);
283cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.com}
284cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.com
2854431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.orginline bool approximately_equal_orderable(double x, double y) {
2864431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org    return approximately_zero_orderable(x - y);
2874431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org}
2884431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org
28907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_equal_squared(double x, double y) {
29007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return approximately_equal(x, y);
29107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
29207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
29307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_greater(double x, double y) {
29407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return x - FLT_EPSILON >= y;
29507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
29607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
2974431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.orginline bool approximately_greater_double(double x, double y) {
2984431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org    return x - FLT_EPSILON_DOUBLE >= y;
2994431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org}
3004431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org
3014431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.orginline bool approximately_greater_orderable(double x, double y) {
3024431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org    return x - FLT_EPSILON_ORDERABLE_ERR >= y;
3034431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org}
3044431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org
30507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_greater_or_equal(double x, double y) {
30607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return x + FLT_EPSILON > y;
30707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
30807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
3094431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.orginline bool approximately_greater_or_equal_double(double x, double y) {
3104431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org    return x + FLT_EPSILON_DOUBLE > y;
3114431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org}
3124431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org
3134431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.orginline bool approximately_greater_or_equal_orderable(double x, double y) {
3144431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org    return x + FLT_EPSILON_ORDERABLE_ERR > y;
3154431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org}
3164431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org
31707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_lesser(double x, double y) {
31807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return x + FLT_EPSILON <= y;
31907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
32007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
3214431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.orginline bool approximately_lesser_double(double x, double y) {
3224431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org    return x + FLT_EPSILON_DOUBLE <= y;
3234431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org}
3244431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org
3254431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.orginline bool approximately_lesser_orderable(double x, double y) {
3264431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org    return x + FLT_EPSILON_ORDERABLE_ERR <= y;
3274431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org}
3284431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org
32907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_lesser_or_equal(double x, double y) {
33007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return x - FLT_EPSILON < y;
33107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
33207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
3334431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.orginline bool approximately_lesser_or_equal_double(double x, double y) {
3344431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org    return x - FLT_EPSILON_DOUBLE < y;
3354431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org}
3364431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org
3374431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.orginline bool approximately_lesser_or_equal_orderable(double x, double y) {
3384431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org    return x - FLT_EPSILON_ORDERABLE_ERR < y;
3394431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org}
3404431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org
34107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_greater_than_one(double x) {
34207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return x > 1 - FLT_EPSILON;
34307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
34407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
34507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool precisely_greater_than_one(double x) {
34607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return x > 1 - DBL_EPSILON_ERR;
34707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
34807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
34907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_less_than_zero(double x) {
35007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return x < FLT_EPSILON;
35107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
35207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
35307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool precisely_less_than_zero(double x) {
35407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return x < DBL_EPSILON_ERR;
35507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
35607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
35707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_negative(double x) {
35807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return x < FLT_EPSILON;
35907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
36007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
3614431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.orginline bool approximately_negative_orderable(double x) {
3624431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org    return x < FLT_EPSILON_ORDERABLE_ERR;
3634431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org}
3644431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org
36507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool precisely_negative(double x) {
36607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return x < DBL_EPSILON_ERR;
36707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
36807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
36907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_one_or_less(double x) {
37007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return x < 1 + FLT_EPSILON;
37107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
37207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
3734431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.orginline bool approximately_one_or_less_double(double x) {
3744431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org    return x < 1 + FLT_EPSILON_DOUBLE;
3754431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org}
3764431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org
37707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_positive(double x) {
37807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return x > -FLT_EPSILON;
37907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
38007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
38107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_positive_squared(double x) {
38207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return x > -(FLT_EPSILON_SQUARED);
38307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
38407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
38507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_zero_or_more(double x) {
38607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return x > -FLT_EPSILON;
38707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
38807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
3894431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.orginline bool approximately_zero_or_more_double(double x) {
3904431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org    return x > -FLT_EPSILON_DOUBLE;
3914431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org}
3924431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org
3934431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.orginline bool approximately_between_orderable(double a, double b, double c) {
3944431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org    return a <= c
3954431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org            ? approximately_negative_orderable(a - b) && approximately_negative_orderable(b - c)
3964431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org            : approximately_negative_orderable(b - a) && approximately_negative_orderable(c - b);
3974431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org}
3984431e7757cfcb8cfa99535eed0e9f156dabf95c2commit-bot@chromium.org
39907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool approximately_between(double a, double b, double c) {
40007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return a <= c ? approximately_negative(a - b) && approximately_negative(b - c)
40107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com            : approximately_negative(b - a) && approximately_negative(c - b);
40207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
4030361032c0b53401030a720bc8b4930c3ec59f19ecaryclark@google.com
4040361032c0b53401030a720bc8b4930c3ec59f19ecaryclark@google.cominline bool precisely_between(double a, double b, double c) {
4050361032c0b53401030a720bc8b4930c3ec59f19ecaryclark@google.com    return a <= c ? precisely_negative(a - b) && precisely_negative(b - c)
4060361032c0b53401030a720bc8b4930c3ec59f19ecaryclark@google.com            : precisely_negative(b - a) && precisely_negative(c - b);
4070361032c0b53401030a720bc8b4930c3ec59f19ecaryclark@google.com}
40807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
40907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com// returns true if (a <= b <= c) || (a >= b >= c)
41007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool between(double a, double b, double c) {
41154359294a7c9dc54802d512a5d891a35c1663392caryclark    SkASSERT(((a <= b && b <= c) || (a >= b && b >= c)) == ((a - b) * (c - b) <= 0)
41254359294a7c9dc54802d512a5d891a35c1663392caryclark            || (precisely_zero(a) && precisely_zero(b) && precisely_zero(c)));
41307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return (a - b) * (c - b) <= 0;
41407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
41507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
416dac1d17027dcaa5596885a9f333979418b35001ccaryclarkinline bool roughly_equal(double x, double y) {
417dac1d17027dcaa5596885a9f333979418b35001ccaryclark    return fabs(x - y) < ROUGH_EPSILON;
418dac1d17027dcaa5596885a9f333979418b35001ccaryclark}
419dac1d17027dcaa5596885a9f333979418b35001ccaryclark
42054359294a7c9dc54802d512a5d891a35c1663392caryclarkinline bool roughly_negative(double x) {
42154359294a7c9dc54802d512a5d891a35c1663392caryclark    return x < ROUGH_EPSILON;
42254359294a7c9dc54802d512a5d891a35c1663392caryclark}
42354359294a7c9dc54802d512a5d891a35c1663392caryclark
42454359294a7c9dc54802d512a5d891a35c1663392caryclarkinline bool roughly_between(double a, double b, double c) {
42554359294a7c9dc54802d512a5d891a35c1663392caryclark    return a <= c ? roughly_negative(a - b) && roughly_negative(b - c)
42654359294a7c9dc54802d512a5d891a35c1663392caryclark            : roughly_negative(b - a) && roughly_negative(c - b);
42754359294a7c9dc54802d512a5d891a35c1663392caryclark}
42854359294a7c9dc54802d512a5d891a35c1663392caryclark
42907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline bool more_roughly_equal(double x, double y) {
43007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return fabs(x - y) < MORE_ROUGH_EPSILON;
43107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
43207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
433dac1d17027dcaa5596885a9f333979418b35001ccaryclarkinline bool way_roughly_equal(double x, double y) {
434dac1d17027dcaa5596885a9f333979418b35001ccaryclark    return fabs(x - y) < WAY_ROUGH_EPSILON;
43507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
43607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
43707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstruct SkDPoint;
43807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstruct SkDVector;
43907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstruct SkDLine;
44007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstruct SkDQuad;
4411049f1246e7be4ccb68001361efceb8933e6f81ccaryclarkstruct SkDConic;
44207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstruct SkDCubic;
44307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstruct SkDRect;
44407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
445277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.cominline SkPath::Verb SkPathOpsPointsToVerb(int points) {
446277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com    int verb = (1 << points) >> 1;
447277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com#ifdef SK_DEBUG
448277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com    switch (points) {
449277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com        case 0: SkASSERT(SkPath::kMove_Verb == verb); break;
450277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com        case 1: SkASSERT(SkPath::kLine_Verb == verb); break;
451277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com        case 2: SkASSERT(SkPath::kQuad_Verb == verb); break;
452277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com        case 3: SkASSERT(SkPath::kCubic_Verb == verb); break;
453330313a8a8343876ee596da39da06a5d69badd9cmtklein@google.com        default: SkDEBUGFAIL("should not be here");
454277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com    }
455277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com#endif
456277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com    return (SkPath::Verb)verb;
457277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com}
458277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com
459277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.cominline int SkPathOpsVerbToPoints(SkPath::Verb verb) {
4601049f1246e7be4ccb68001361efceb8933e6f81ccaryclark    int points = (int) verb - (((int) verb + 1) >> 2);
461277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com#ifdef SK_DEBUG
462277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com    switch (verb) {
463277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com        case SkPath::kLine_Verb: SkASSERT(1 == points); break;
464277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com        case SkPath::kQuad_Verb: SkASSERT(2 == points); break;
4651049f1246e7be4ccb68001361efceb8933e6f81ccaryclark        case SkPath::kConic_Verb: SkASSERT(2 == points); break;
466277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com        case SkPath::kCubic_Verb: SkASSERT(3 == points); break;
467330313a8a8343876ee596da39da06a5d69badd9cmtklein@google.com        default: SkDEBUGFAIL("should not get here");
468277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com    }
469277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com#endif
470277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com    return points;
471277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com}
472277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com
47307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline double SkDInterp(double A, double B, double t) {
47407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return A + (B - A) * t;
47507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
47607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
47707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comdouble SkDCubeRoot(double x);
47807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
47907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com/* Returns -1 if negative, 0 if zero, 1 if positive
48007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com*/
48107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline int SkDSign(double x) {
48207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return (x > 0) - (x < 0);
48307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
48407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
48507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com/* Returns 0 if negative, 1 if zero, 2 if positive
48607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com*/
48707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline int SKDSide(double x) {
48807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return (x > 0) + (x >= 0);
48907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
49007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
49107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com/* Returns 1 if negative, 2 if zero, 4 if positive
49207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com*/
49307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.cominline int SkDSideBit(double x) {
49407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return 1 << SKDSide(x);
49507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
49607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
497fa2aeee27af27f2934ee52a9732148f66481fb03caryclark@google.cominline double SkPinT(double t) {
498fa2aeee27af27f2934ee52a9732148f66481fb03caryclark@google.com    return precisely_less_than_zero(t) ? 0 : precisely_greater_than_one(t) ? 1 : t;
499fa2aeee27af27f2934ee52a9732148f66481fb03caryclark@google.com}
500fa2aeee27af27f2934ee52a9732148f66481fb03caryclark@google.com
50107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#endif
502