Index: src/pathops/SkPathOpsPoint.h |
=================================================================== |
--- src/pathops/SkPathOpsPoint.h (revision 0) |
+++ src/pathops/SkPathOpsPoint.h (revision 0) |
@@ -0,0 +1,156 @@ |
+/* |
+ * Copyright 2012 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+#ifndef SkPathOpsPoint_DEFINED |
+#define SkPathOpsPoint_DEFINED |
+ |
+#include "SkPathOpsTypes.h" |
+#include "SkPoint.h" |
+ |
+struct SkDVector { |
+ double fX, fY; |
+ |
+ friend SkDPoint operator+(const SkDPoint& a, const SkDVector& b); |
+ |
+ void operator+=(const SkDVector& v) { |
+ fX += v.fX; |
+ fY += v.fY; |
+ } |
+ |
+ void operator-=(const SkDVector& v) { |
+ fX -= v.fX; |
+ fY -= v.fY; |
+ } |
+ |
+ void operator/=(const double s) { |
+ fX /= s; |
+ fY /= s; |
+ } |
+ |
+ void operator*=(const double s) { |
+ fX *= s; |
+ fY *= s; |
+ } |
+ |
+ SkVector asSkVector() const { |
+ SkVector v = {SkDoubleToScalar(fX), SkDoubleToScalar(fY)}; |
+ return v; |
+ } |
+ |
+ double cross(const SkDVector& a) const { |
+ return fX * a.fY - fY * a.fX; |
+ } |
+ |
+ double dot(const SkDVector& a) const { |
+ return fX * a.fX + fY * a.fY; |
+ } |
+ |
+ double length() const { |
+ return sqrt(lengthSquared()); |
+ } |
+ |
+ double lengthSquared() const { |
+ return fX * fX + fY * fY; |
+ } |
+}; |
+ |
+struct SkDPoint { |
+ double fX; |
+ double fY; |
+ |
+ void set(const SkPoint& pt) { |
+ fX = pt.fX; |
+ fY = pt.fY; |
+ } |
+ |
+ friend SkDVector operator-(const SkDPoint& a, const SkDPoint& b); |
+ |
+ friend bool operator==(const SkDPoint& a, const SkDPoint& b) { |
+ return a.fX == b.fX && a.fY == b.fY; |
+ } |
+ |
+ friend bool operator!=(const SkDPoint& a, const SkDPoint& b) { |
+ return a.fX != b.fX || a.fY != b.fY; |
+ } |
+ |
+ void operator=(const SkPoint& pt) { |
+ fX = pt.fX; |
+ fY = pt.fY; |
+ } |
+ |
+ |
+ void operator+=(const SkDVector& v) { |
+ fX += v.fX; |
+ fY += v.fY; |
+ } |
+ |
+ void operator-=(const SkDVector& v) { |
+ fX -= v.fX; |
+ fY -= v.fY; |
+ } |
+ |
+ // note: this can not be implemented with |
+ // return approximately_equal(a.fY, fY) && approximately_equal(a.fX, fX); |
+ // because that will not take the magnitude of the values |
+ bool approximatelyEqual(const SkDPoint& a) const { |
+ double denom = SkTMax(fabs(fX), SkTMax(fabs(fY), SkTMax(fabs(a.fX), fabs(a.fY)))); |
+ if (denom == 0) { |
+ return true; |
+ } |
+ double inv = 1 / denom; |
+ return approximately_equal(fX * inv, a.fX * inv) |
+ && approximately_equal(fY * inv, a.fY * inv); |
+ } |
+ |
+ bool approximatelyEqual(const SkPoint& a) const { |
+ double denom = SkTMax(fabs(fX), SkTMax(fabs(fY), SkTMax(fabs(a.fX), fabs(a.fY)))); |
+ if (denom == 0) { |
+ return true; |
+ } |
+ double inv = 1 / denom; |
+ return approximately_equal(fX * inv, a.fX * inv) |
+ && approximately_equal(fY * inv, a.fY * inv); |
+ } |
+ |
+ bool approximatelyEqualHalf(const SkDPoint& a) const { |
+ double denom = SkTMax(fabs(fX), SkTMax(fabs(fY), SkTMax(fabs(a.fX), fabs(a.fY)))); |
+ if (denom == 0) { |
+ return true; |
+ } |
+ double inv = 1 / denom; |
+ return approximately_equal_half(fX * inv, a.fX * inv) |
+ && approximately_equal_half(fY * inv, a.fY * inv); |
+ } |
+ |
+ bool approximatelyZero() const { |
+ return approximately_zero(fX) && approximately_zero(fY); |
+ } |
+ |
+ SkPoint asSkPoint() const { |
+ SkPoint pt = {SkDoubleToScalar(fX), SkDoubleToScalar(fY)}; |
+ return pt; |
+ } |
+ |
+ double distance(const SkDPoint& a) const { |
+ SkDVector temp = *this - a; |
+ return temp.length(); |
+ } |
+ |
+ double distanceSquared(const SkDPoint& a) const { |
+ SkDVector temp = *this - a; |
+ return temp.lengthSquared(); |
+ } |
+ |
+ double moreRoughlyEqual(const SkDPoint& a) const { |
+ return more_roughly_equal(a.fY, fY) && more_roughly_equal(a.fX, fX); |
+ } |
+ |
+ double roughlyEqual(const SkDPoint& a) const { |
+ return roughly_equal(a.fY, fY) && roughly_equal(a.fX, fX); |
+ } |
+}; |
+ |
+#endif |