| Index: src/pathops/SkPathOpsPoint.h
 | 
| diff --git a/src/pathops/SkPathOpsPoint.h b/src/pathops/SkPathOpsPoint.h
 | 
| index c3e0b40ab9f619620e2a0e0afd045068564226b7..8fd247ee51888436196d44c0e562a5b39279f6cd 100644
 | 
| --- a/src/pathops/SkPathOpsPoint.h
 | 
| +++ b/src/pathops/SkPathOpsPoint.h
 | 
| @@ -15,7 +15,13 @@ inline bool AlmostEqualUlps(const SkPoint& pt1, const SkPoint& pt2) {
 | 
|  }
 | 
|  
 | 
|  struct SkDVector {
 | 
| -    double fX, fY;
 | 
| +    double fX;
 | 
| +    double fY;
 | 
| +
 | 
| +    void set(const SkVector& pt) {
 | 
| +        fX = pt.fX;
 | 
| +        fY = pt.fY;
 | 
| +    }
 | 
|  
 | 
|      friend SkDPoint operator+(const SkDPoint& a, const SkDVector& b);
 | 
|  
 | 
| @@ -48,6 +54,13 @@ struct SkDVector {
 | 
|          return fX * a.fY - fY * a.fX;
 | 
|      }
 | 
|  
 | 
| +    // similar to cross, this bastardization considers nearly coincident to be zero
 | 
| +    double crossCheck(const SkDVector& a) const {
 | 
| +        double xy = fX * a.fY;
 | 
| +        double yx = fY * a.fX;
 | 
| +        return AlmostEqualUlps(xy, yx) ? 0 : xy - yx;
 | 
| +    }
 | 
| +
 | 
|      double dot(const SkDVector& a) const {
 | 
|          return fX * a.fX + fY * a.fY;
 | 
|      }
 | 
| @@ -85,7 +98,6 @@ struct SkDPoint {
 | 
|          fY = pt.fY;
 | 
|      }
 | 
|  
 | 
| -
 | 
|      void operator+=(const SkDVector& v) {
 | 
|          fX += v.fX;
 | 
|          fY += v.fY;
 | 
| @@ -136,6 +148,15 @@ struct SkDPoint {
 | 
|          return AlmostBequalUlps((double) largest, largest + dist); // is dist within ULPS tolerance?
 | 
|      }
 | 
|  
 | 
| +#if SK_DEBUG
 | 
| +    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);
 | 
| +    }
 | 
| +#endif
 | 
| +
 | 
|      bool approximatelyPEqual(const SkDPoint& a) const {
 | 
|          if (approximately_equal(fX, a.fX) && approximately_equal(fY, a.fY)) {
 | 
|              return true;
 | 
| @@ -150,6 +171,20 @@ struct SkDPoint {
 | 
|          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?
 | 
| +    }
 | 
| +
 | 
|      bool approximatelyZero() const {
 | 
|          return approximately_zero(fX) && approximately_zero(fY);
 | 
|      }
 | 
| @@ -191,23 +226,9 @@ struct SkDPoint {
 | 
|          return roughly_equal(a.fY, fY) && roughly_equal(a.fX, fX);
 | 
|      }
 | 
|  
 | 
| -    #ifdef SK_DEBUG
 | 
| -    void dump() {
 | 
| -        SkDebugf("{");
 | 
| -        DebugDumpDouble(fX);
 | 
| -        SkDebugf(", ");
 | 
| -        DebugDumpDouble(fY);
 | 
| -        SkDebugf("}");
 | 
| -    }
 | 
| -
 | 
| -    static void dump(const SkPoint& pt) {
 | 
| -        SkDebugf("{");
 | 
| -        DebugDumpFloat(pt.fX);
 | 
| -        SkDebugf(", ");
 | 
| -        DebugDumpFloat(pt.fY);
 | 
| -        SkDebugf("}");
 | 
| -    }
 | 
| -   #endif
 | 
| +    // utilities callable by the user from the debugger when the implementation code is linked in
 | 
| +    void dump() const;
 | 
| +    static void Dump(const SkPoint& pt);
 | 
|  };
 | 
|  
 | 
|  #endif
 | 
| 
 |