Index: experimental/Intersection/DataTypes.h |
diff --git a/experimental/Intersection/DataTypes.h b/experimental/Intersection/DataTypes.h |
deleted file mode 100644 |
index 870a6de7659b1057eb9771680b9de2a95ce9653e..0000000000000000000000000000000000000000 |
--- a/experimental/Intersection/DataTypes.h |
+++ /dev/null |
@@ -1,418 +0,0 @@ |
-/* |
- * 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 __DataTypes_h__ |
-#define __DataTypes_h__ |
- |
-#include <float.h> // for FLT_EPSILON |
-#include <math.h> // for fabs, sqrt |
- |
-#include "SkPoint.h" |
- |
-#define FORCE_RELEASE 0 // set force release to 1 for multiple thread -- no debugging |
-#define ONE_OFF_DEBUG 1 |
-#define ONE_OFF_DEBUG_MATHEMATICA 0 |
- |
-// FIXME: move these into SkTypes.h |
-template <typename T> inline T SkTMax(T a, T b) { |
- if (a < b) |
- a = b; |
- return a; |
-} |
- |
-template <typename T> inline T SkTMin(T a, T b) { |
- if (a > b) |
- a = b; |
- return a; |
-} |
- |
-extern bool AlmostEqualUlps(float A, float B); |
-inline bool AlmostEqualUlps(double A, double B) { return AlmostEqualUlps((float) A, (float) B); } |
- |
-// FIXME: delete |
-int UlpsDiff(float A, float B); |
- |
-// FLT_EPSILON == 1.19209290E-07 == 1 / (2 ^ 23) |
-// DBL_EPSILON == 2.22045e-16 |
-const double FLT_EPSILON_CUBED = FLT_EPSILON * FLT_EPSILON * FLT_EPSILON; |
-const double FLT_EPSILON_HALF = FLT_EPSILON / 2; |
-const double FLT_EPSILON_SQUARED = FLT_EPSILON * FLT_EPSILON; |
-const double FLT_EPSILON_SQRT = sqrt(FLT_EPSILON); |
-const double FLT_EPSILON_INVERSE = 1 / FLT_EPSILON; |
-const double DBL_EPSILON_ERR = DBL_EPSILON * 4; // tune -- allow a few bits of error |
-const double ROUGH_EPSILON = FLT_EPSILON * 64; |
-const double MORE_ROUGH_EPSILON = FLT_EPSILON * 256; |
- |
-inline bool approximately_zero(double x) { |
- return fabs(x) < FLT_EPSILON; |
-} |
- |
-inline bool precisely_zero(double x) { |
- return fabs(x) < DBL_EPSILON_ERR; |
-} |
- |
-inline bool approximately_zero(float x) { |
- return fabs(x) < FLT_EPSILON; |
-} |
- |
-inline bool approximately_zero_cubed(double x) { |
- return fabs(x) < FLT_EPSILON_CUBED; |
-} |
- |
-inline bool approximately_zero_half(double x) { |
- return fabs(x) < FLT_EPSILON_HALF; |
-} |
- |
-inline bool approximately_zero_squared(double x) { |
- return fabs(x) < FLT_EPSILON_SQUARED; |
-} |
- |
-inline bool approximately_zero_sqrt(double x) { |
- return fabs(x) < FLT_EPSILON_SQRT; |
-} |
- |
-inline bool approximately_zero_inverse(double x) { |
- return fabs(x) > FLT_EPSILON_INVERSE; |
-} |
- |
-// FIXME: if called multiple times with the same denom, we want to pass 1/y instead |
-inline bool approximately_zero_when_compared_to(double x, double y) { |
- return x == 0 || fabs(x / y) < FLT_EPSILON; |
-} |
- |
-// Use this for comparing Ts in the range of 0 to 1. For general numbers (larger and smaller) use |
-// AlmostEqualUlps instead. |
-inline bool approximately_equal(double x, double y) { |
-#if 1 |
- return approximately_zero(x - y); |
-#else |
-// see http://visualstudiomagazine.com/blogs/tool-tracker/2011/11/compare-floating-point-numbers.aspx |
-// this allows very small (e.g. degenerate) values to compare unequally, but in this case, |
-// AlmostEqualUlps should be used instead. |
- if (x == y) { |
- return true; |
- } |
- double absY = fabs(y); |
- if (x == 0) { |
- return absY < FLT_EPSILON; |
- } |
- double absX = fabs(x); |
- if (y == 0) { |
- return absX < FLT_EPSILON; |
- } |
- return fabs(x - y) < (absX > absY ? absX : absY) * FLT_EPSILON; |
-#endif |
-} |
- |
-inline bool precisely_equal(double x, double y) { |
- return precisely_zero(x - y); |
-} |
- |
-inline bool approximately_equal_half(double x, double y) { |
- return approximately_zero_half(x - y); |
-} |
- |
-inline bool approximately_equal_squared(double x, double y) { |
- return approximately_equal(x, y); |
-} |
- |
-inline bool approximately_greater(double x, double y) { |
- return x - FLT_EPSILON >= y; |
-} |
- |
-inline bool approximately_greater_or_equal(double x, double y) { |
- return x + FLT_EPSILON > y; |
-} |
- |
-inline bool approximately_lesser(double x, double y) { |
- return x + FLT_EPSILON <= y; |
-} |
- |
-inline bool approximately_lesser_or_equal(double x, double y) { |
- return x - FLT_EPSILON < y; |
-} |
- |
-inline double approximately_pin(double x) { |
- return approximately_zero(x) ? 0 : x; |
-} |
- |
-inline float approximately_pin(float x) { |
- return approximately_zero(x) ? 0 : x; |
-} |
- |
-inline bool approximately_greater_than_one(double x) { |
- return x > 1 - FLT_EPSILON; |
-} |
- |
-inline bool precisely_greater_than_one(double x) { |
- return x > 1 - DBL_EPSILON_ERR; |
-} |
- |
-inline bool approximately_less_than_zero(double x) { |
- return x < FLT_EPSILON; |
-} |
- |
-inline bool precisely_less_than_zero(double x) { |
- return x < DBL_EPSILON_ERR; |
-} |
- |
-inline bool approximately_negative(double x) { |
- return x < FLT_EPSILON; |
-} |
- |
-inline bool precisely_negative(double x) { |
- return x < DBL_EPSILON_ERR; |
-} |
- |
-inline bool approximately_one_or_less(double x) { |
- return x < 1 + FLT_EPSILON; |
-} |
- |
-inline bool approximately_positive(double x) { |
- return x > -FLT_EPSILON; |
-} |
- |
-inline bool approximately_positive_squared(double x) { |
- return x > -(FLT_EPSILON_SQUARED); |
-} |
- |
-inline bool approximately_zero_or_more(double x) { |
- return x > -FLT_EPSILON; |
-} |
- |
-inline bool approximately_between(double a, double b, double c) { |
- return a <= c ? approximately_negative(a - b) && approximately_negative(b - c) |
- : approximately_negative(b - a) && approximately_negative(c - b); |
-} |
- |
-// returns true if (a <= b <= c) || (a >= b >= c) |
-inline bool between(double a, double b, double c) { |
- SkASSERT(((a <= b && b <= c) || (a >= b && b >= c)) == ((a - b) * (c - b) <= 0)); |
- return (a - b) * (c - b) <= 0; |
-} |
- |
-inline bool more_roughly_equal(double x, double y) { |
- return fabs(x - y) < MORE_ROUGH_EPSILON; |
-} |
- |
-inline bool roughly_equal(double x, double y) { |
- return fabs(x - y) < ROUGH_EPSILON; |
-} |
- |
-struct _Point; |
- |
-struct _Vector { |
- double x; |
- double y; |
- |
- friend _Point operator+(const _Point& a, const _Vector& b); |
- |
- void operator+=(const _Vector& v) { |
- x += v.x; |
- y += v.y; |
- } |
- |
- void operator-=(const _Vector& v) { |
- x -= v.x; |
- y -= v.y; |
- } |
- |
- void operator/=(const double s) { |
- x /= s; |
- y /= s; |
- } |
- |
- void operator*=(const double s) { |
- x *= s; |
- y *= s; |
- } |
- |
- double cross(const _Vector& a) const { |
- return x * a.y - y * a.x; |
- } |
- |
- double dot(const _Vector& a) const { |
- return x * a.x + y * a.y; |
- } |
- |
- double length() const { |
- return sqrt(lengthSquared()); |
- } |
- |
- double lengthSquared() const { |
- return x * x + y * y; |
- } |
- |
- SkVector asSkVector() const { |
- SkVector v = {SkDoubleToScalar(x), SkDoubleToScalar(y)}; |
- return v; |
- } |
-}; |
- |
-struct _Point { |
- double x; |
- double y; |
- |
- friend _Vector operator-(const _Point& a, const _Point& b); |
- |
- void operator+=(const _Vector& v) { |
- x += v.x; |
- y += v.y; |
- } |
- |
- void operator-=(const _Vector& v) { |
- x -= v.x; |
- y -= v.y; |
- } |
- |
- friend bool operator==(const _Point& a, const _Point& b) { |
- return a.x == b.x && a.y == b.y; |
- } |
- |
- friend bool operator!=(const _Point& a, const _Point& b) { |
- return a.x != b.x || a.y != b.y; |
- } |
- |
- // note: this can not be implemented with |
- // return approximately_equal(a.y, y) && approximately_equal(a.x, x); |
- // because that will not take the magnitude of the values |
- bool approximatelyEqual(const _Point& a) const { |
- double denom = SkTMax(fabs(x), SkTMax(fabs(y), SkTMax(fabs(a.x), fabs(a.y)))); |
- if (denom == 0) { |
- return true; |
- } |
- double inv = 1 / denom; |
- return approximately_equal(x * inv, a.x * inv) && approximately_equal(y * inv, a.y * inv); |
- } |
- |
- bool approximatelyEqual(const SkPoint& a) const { |
- double denom = SkTMax(fabs(x), SkTMax(fabs(y), SkTMax(fabs(a.fX), fabs(a.fY)))); |
- if (denom == 0) { |
- return true; |
- } |
- double inv = 1 / denom; |
- return approximately_equal(x * inv, a.fX * inv) && approximately_equal(y * inv, a.fY * inv); |
- } |
- |
- bool approximatelyEqualHalf(const _Point& a) const { |
- double denom = SkTMax(fabs(x), SkTMax(fabs(y), SkTMax(fabs(a.x), fabs(a.y)))); |
- if (denom == 0) { |
- return true; |
- } |
- double inv = 1 / denom; |
- return approximately_equal_half(x * inv, a.x * inv) |
- && approximately_equal_half(y * inv, a.y * inv); |
- } |
- |
- bool approximatelyZero() const { |
- return approximately_zero(x) && approximately_zero(y); |
- } |
- |
- SkPoint asSkPoint() const { |
- SkPoint pt = {SkDoubleToScalar(x), SkDoubleToScalar(y)}; |
- return pt; |
- } |
- |
- double distance(const _Point& a) const { |
- _Vector temp = *this - a; |
- return temp.length(); |
- } |
- |
- double distanceSquared(const _Point& a) const { |
- _Vector temp = *this - a; |
- return temp.lengthSquared(); |
- } |
- |
- double moreRoughlyEqual(const _Point& a) const { |
- return more_roughly_equal(a.y, y) && more_roughly_equal(a.x, x); |
- } |
- |
- double roughlyEqual(const _Point& a) const { |
- return roughly_equal(a.y, y) && roughly_equal(a.x, x); |
- } |
-}; |
- |
-typedef _Point _Line[2]; |
-typedef _Point Quadratic[3]; |
-typedef _Point Triangle[3]; |
-typedef _Point Cubic[4]; |
- |
-struct _Rect { |
- double left; |
- double top; |
- double right; |
- double bottom; |
- |
- void add(const _Point& pt) { |
- if (left > pt.x) { |
- left = pt.x; |
- } |
- if (top > pt.y) { |
- top = pt.y; |
- } |
- if (right < pt.x) { |
- right = pt.x; |
- } |
- if (bottom < pt.y) { |
- bottom = pt.y; |
- } |
- } |
- |
- // FIXME: used by debugging only ? |
- bool contains(const _Point& pt) const { |
- return approximately_between(left, pt.x, right) |
- && approximately_between(top, pt.y, bottom); |
- } |
- |
- bool intersects(_Rect& r) const { |
- SkASSERT(left <= right); |
- SkASSERT(top <= bottom); |
- SkASSERT(r.left <= r.right); |
- SkASSERT(r.top <= r.bottom); |
- return r.left <= right && left <= r.right && r.top <= bottom && top <= r.bottom; |
- } |
- |
- void set(const _Point& pt) { |
- left = right = pt.x; |
- top = bottom = pt.y; |
- } |
- |
- void setBounds(const _Line& line) { |
- set(line[0]); |
- add(line[1]); |
- } |
- |
- void setBounds(const Cubic& ); |
- void setBounds(const Quadratic& ); |
- void setRawBounds(const Cubic& ); |
- void setRawBounds(const Quadratic& ); |
-}; |
- |
-struct CubicPair { |
- const Cubic& first() const { return (const Cubic&) pts[0]; } |
- const Cubic& second() const { return (const Cubic&) pts[3]; } |
- _Point pts[7]; |
-}; |
- |
-struct QuadraticPair { |
- const Quadratic& first() const { return (const Quadratic&) pts[0]; } |
- const Quadratic& second() const { return (const Quadratic&) pts[2]; } |
- _Point pts[5]; |
-}; |
- |
-// FIXME: move these into SkFloatingPoint.h |
-#include "SkFloatingPoint.h" |
- |
-#define sk_double_isnan(a) sk_float_isnan(a) |
- |
-// FIXME: move these to debugging file |
-#ifdef SK_DEBUG |
-void mathematica_ize(char* str, size_t bufferSize); |
-bool valid_wind(int winding); |
-void winding_printf(int winding); |
-#endif |
- |
-#endif // __DataTypes_h__ |