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