diff options
Diffstat (limited to 'src/pathops/SkPathOpsPoint.h')
-rw-r--r-- | src/pathops/SkPathOpsPoint.h | 53 |
1 files changed, 42 insertions, 11 deletions
diff --git a/src/pathops/SkPathOpsPoint.h b/src/pathops/SkPathOpsPoint.h index 2d07427783..7ddfbfb5d1 100644 --- a/src/pathops/SkPathOpsPoint.h +++ b/src/pathops/SkPathOpsPoint.h @@ -25,25 +25,21 @@ struct SkDVector { friend SkDPoint operator+(const SkDPoint& a, const SkDVector& b); - // only used by testing void operator+=(const SkDVector& v) { fX += v.fX; fY += v.fY; } - // only called by nearestT, which is currently only used by testing void operator-=(const SkDVector& v) { fX -= v.fX; fY -= v.fY; } - // only used by testing void operator/=(const double s) { fX /= s; fY /= s; } - // only used by testing void operator*=(const double s) { fX *= s; fY *= s; @@ -54,7 +50,6 @@ struct SkDVector { return v; } - // only used by testing double cross(const SkDVector& a) const { return fX * a.fY - fY * a.fX; } @@ -103,13 +98,11 @@ struct SkDPoint { fY = pt.fY; } - // only used by testing void operator+=(const SkDVector& v) { fX += v.fX; fY += v.fY; } - // only used by testing void operator-=(const SkDVector& v) { fX -= v.fX; fY -= v.fY; @@ -129,7 +122,7 @@ struct SkDPoint { double tiniest = SkTMin(SkTMin(SkTMin(fX, a.fX), fY), a.fY); double largest = SkTMax(SkTMax(SkTMax(fX, a.fX), fY), a.fY); largest = SkTMax(largest, -tiniest); - return AlmostPequalUlps(largest, largest + dist); // is the dist within ULPS tolerance? + return AlmostBequalUlps(largest, largest + dist); // is the dist within ULPS tolerance? } bool approximatelyEqual(const SkPoint& a) const { @@ -152,10 +145,44 @@ struct SkDPoint { float tiniest = SkTMin(SkTMin(SkTMin(a.fX, b.fX), a.fY), b.fY); float largest = SkTMax(SkTMax(SkTMax(a.fX, b.fX), a.fY), b.fY); largest = SkTMax(largest, -tiniest); - return AlmostPequalUlps((double) largest, largest + dist); // is dist within ULPS tolerance? + return AlmostBequalUlps((double) largest, largest + dist); // is dist within ULPS tolerance? + } + + static bool RoughlyEqual(const SkPoint& a, const SkPoint& b) { + if (approximately_equal(a.fX, b.fX) && approximately_equal(a.fY, b.fY)) { + return true; + } + return RoughlyEqualUlps(a.fX, b.fX) && RoughlyEqualUlps(a.fY, b.fY); + } + + bool approximatelyPEqual(const SkDPoint& a) const { + if (approximately_equal(fX, a.fX) && approximately_equal(fY, a.fY)) { + return true; + } + if (!RoughlyEqualUlps(fX, a.fX) || !RoughlyEqualUlps(fY, a.fY)) { + return false; + } + double dist = distance(a); // OPTIMIZATION: can we compare against distSq instead ? + double tiniest = SkTMin(SkTMin(SkTMin(fX, a.fX), fY), a.fY); + double largest = SkTMax(SkTMax(SkTMax(fX, a.fX), fY), a.fY); + largest = SkTMax(largest, -tiniest); + return AlmostPequalUlps(largest, largest + dist); // is the dist within ULPS tolerance? + } + + bool approximatelyDEqual(const SkDPoint& a) const { + if (approximately_equal(fX, a.fX) && approximately_equal(fY, a.fY)) { + return true; + } + if (!RoughlyEqualUlps(fX, a.fX) || !RoughlyEqualUlps(fY, a.fY)) { + return false; + } + double dist = distance(a); // OPTIMIZATION: can we compare against distSq instead ? + double tiniest = SkTMin(SkTMin(SkTMin(fX, a.fX), fY), a.fY); + double largest = SkTMax(SkTMax(SkTMax(fX, a.fX), fY), a.fY); + largest = SkTMax(largest, -tiniest); + return AlmostDequalUlps(largest, largest + dist); // is the dist within ULPS tolerance? } - // only used by testing bool approximatelyZero() const { return approximately_zero(fX) && approximately_zero(fY); } @@ -182,7 +209,7 @@ struct SkDPoint { return result; } - bool roughlyEqual(const SkDPoint& a) const { + bool moreRoughlyEqual(const SkDPoint& a) const { if (roughly_equal(fX, a.fX) && roughly_equal(fY, a.fY)) { return true; } @@ -193,6 +220,10 @@ struct SkDPoint { return RoughlyEqualUlps(largest, largest + dist); // is the dist within ULPS tolerance? } + bool roughlyEqual(const SkDPoint& a) const { + return roughly_equal(a.fY, fY) && roughly_equal(a.fX, fX); + } + // utilities callable by the user from the debugger when the implementation code is linked in void dump() const; static void Dump(const SkPoint& pt); |