Index: src/pathops/SkPathOpsTypes.cpp |
diff --git a/src/pathops/SkPathOpsTypes.cpp b/src/pathops/SkPathOpsTypes.cpp |
index a076d155f2ffeda23e596d2c82188a6150b383bf..8135c57025757fa0b2f2d815a052b39e53b5e7e5 100644 |
--- a/src/pathops/SkPathOpsTypes.cpp |
+++ b/src/pathops/SkPathOpsTypes.cpp |
@@ -11,40 +11,40 @@ |
// from http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/ |
// FIXME: move to SkFloatBits.h |
-static bool equal_ulps(float A, float B, int epsilon) { |
+static bool equal_ulps(float a, float b, int epsilon) { |
SkFloatIntUnion floatIntA, floatIntB; |
- floatIntA.fFloat = A; |
- floatIntB.fFloat = B; |
+ floatIntA.fFloat = a; |
+ floatIntB.fFloat = b; |
// Different signs means they do not match. |
if ((floatIntA.fSignBitInt < 0) != (floatIntB.fSignBitInt < 0)) { |
// Check for equality to make sure +0 == -0 |
- return A == B; |
+ return a == b; |
} |
// Find the difference in ULPs. |
int ulpsDiff = abs(floatIntA.fSignBitInt - floatIntB.fSignBitInt); |
return ulpsDiff <= epsilon; |
} |
-static bool less_ulps(float A, float B, int epsilon) { |
+static bool less_ulps(float a, float b, int epsilon) { |
SkFloatIntUnion floatIntA, floatIntB; |
- floatIntA.fFloat = A; |
- floatIntB.fFloat = B; |
+ floatIntA.fFloat = a; |
+ floatIntB.fFloat = b; |
// Check different signs with float epsilon since we only care if they're both close to 0. |
if ((floatIntA.fSignBitInt < 0) != (floatIntB.fSignBitInt < 0)) { |
- return A <= B + FLT_EPSILON * epsilon; |
+ return a <= b + FLT_EPSILON * epsilon; |
} |
// Find the difference in ULPs. |
return floatIntA.fSignBitInt <= floatIntB.fSignBitInt + epsilon; |
} |
-bool AlmostEqualUlps(float A, float B) { |
+bool AlmostEqualUlps(float a, float b) { |
const int UlpsEpsilon = 16; |
- return equal_ulps(A, B, UlpsEpsilon); |
+ return equal_ulps(a, b, UlpsEpsilon); |
} |
-bool RoughlyEqualUlps(float A, float B) { |
+bool RoughlyEqualUlps(float a, float b) { |
const int UlpsEpsilon = 256; |
- return equal_ulps(A, B, UlpsEpsilon); |
+ return equal_ulps(a, b, UlpsEpsilon); |
} |
bool AlmostBetweenUlps(float a, float b, float c) { |
@@ -53,6 +53,19 @@ bool AlmostBetweenUlps(float a, float b, float c) { |
: less_ulps(b, a, UlpsEpsilon) && less_ulps(c, b, UlpsEpsilon); |
} |
+int UlpsDistance(float a, float b) { |
+ SkFloatIntUnion floatIntA, floatIntB; |
+ floatIntA.fFloat = a; |
+ floatIntB.fFloat = b; |
+ // Different signs means they do not match. |
+ if ((floatIntA.fSignBitInt < 0) != (floatIntB.fSignBitInt < 0)) { |
+ // Check for equality to make sure +0 == -0 |
+ return a == b ? 0 : SK_MaxS32; |
+ } |
+ // Find the difference in ULPs. |
+ return abs(floatIntA.fSignBitInt - floatIntB.fSignBitInt); |
+} |
+ |
// cube root approximation using bit hack for 64-bit float |
// adapted from Kahan's cbrt |
static double cbrt_5d(double d) { |