Chromium Code Reviews| Index: src/pathops/SkPathOpsTypes.cpp |
| diff --git a/src/pathops/SkPathOpsTypes.cpp b/src/pathops/SkPathOpsTypes.cpp |
| index ca84405aa780f15b8db4ec24313b139ae524635d..1ed484afee4f42fb1ed3f61f078214f8d9bbc829 100644 |
| --- a/src/pathops/SkPathOpsTypes.cpp |
| +++ b/src/pathops/SkPathOpsTypes.cpp |
| @@ -16,6 +16,16 @@ static bool arguments_denormalized(float a, float b, int epsilon) { |
| // 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, int depsilon) { |
| + if (arguments_denormalized(a, b, depsilon)) { |
| + return true; |
| + } |
| + int aBits = SkFloatAs2sCompliment(a); |
| + int bBits = SkFloatAs2sCompliment(b); |
| + // Find the difference in ULPs. |
| + return aBits < bBits + epsilon && bBits < aBits + epsilon; |
| +} |
| + |
| +static bool equal_ulps_pin(float a, float b, int epsilon, int depsilon) { |
|
reed1
2015/12/15 14:17:21
Just an idea, may not be any clearer...
To avoid
|
| if (!SkScalarIsFinite(a) || !SkScalarIsFinite(b)) { |
| return false; |
| } |
| @@ -29,9 +39,6 @@ static bool equal_ulps(float a, float b, int epsilon, int depsilon) { |
| } |
| static bool d_equal_ulps(float a, float b, int epsilon) { |
| - if (!SkScalarIsFinite(a) || !SkScalarIsFinite(b)) { |
| - return false; |
| - } |
| int aBits = SkFloatAs2sCompliment(a); |
| int bBits = SkFloatAs2sCompliment(b); |
| // Find the difference in ULPs. |
| @@ -39,6 +46,16 @@ static bool d_equal_ulps(float a, float b, int epsilon) { |
| } |
| static bool not_equal_ulps(float a, float b, int epsilon) { |
| + if (arguments_denormalized(a, b, epsilon)) { |
| + return false; |
| + } |
| + int aBits = SkFloatAs2sCompliment(a); |
| + int bBits = SkFloatAs2sCompliment(b); |
| + // Find the difference in ULPs. |
| + return aBits >= bBits + epsilon || bBits >= aBits + epsilon; |
| +} |
| + |
| +static bool not_equal_ulps_pin(float a, float b, int epsilon) { |
| if (!SkScalarIsFinite(a) || !SkScalarIsFinite(b)) { |
| return false; |
| } |
| @@ -52,9 +69,6 @@ static bool not_equal_ulps(float a, float b, int epsilon) { |
| } |
| static bool d_not_equal_ulps(float a, float b, int epsilon) { |
| - if (!SkScalarIsFinite(a) || !SkScalarIsFinite(b)) { |
| - return false; |
| - } |
| int aBits = SkFloatAs2sCompliment(a); |
| int bBits = SkFloatAs2sCompliment(b); |
| // Find the difference in ULPs. |
| @@ -62,9 +76,6 @@ static bool d_not_equal_ulps(float a, float b, int epsilon) { |
| } |
| static bool less_ulps(float a, float b, int epsilon) { |
| - if (!SkScalarIsFinite(a) || !SkScalarIsFinite(b)) { |
| - return false; |
| - } |
| if (arguments_denormalized(a, b, epsilon)) { |
| return a <= b - FLT_EPSILON * epsilon; |
| } |
| @@ -75,9 +86,6 @@ static bool less_ulps(float a, float b, int epsilon) { |
| } |
| static bool less_or_equal_ulps(float a, float b, int epsilon) { |
| - if (!SkScalarIsFinite(a) || !SkScalarIsFinite(b)) { |
| - return false; |
| - } |
| if (arguments_denormalized(a, b, epsilon)) { |
| return a < b + FLT_EPSILON * epsilon; |
| } |
| @@ -104,10 +112,7 @@ bool AlmostDequalUlps(float a, float b) { |
| } |
| bool AlmostDequalUlps(double a, double b) { |
| - if (SkScalarIsFinite(a) || SkScalarIsFinite(b)) { |
| - return AlmostDequalUlps(SkDoubleToScalar(a), SkDoubleToScalar(b)); |
| - } |
| - return fabs(a - b) / SkTMax(fabs(a), fabs(b)) < FLT_EPSILON * 16; |
| + return AlmostDequalUlps(SkDoubleToScalar(a), SkDoubleToScalar(b)); |
| } |
| bool AlmostEqualUlps(float a, float b) { |
| @@ -115,11 +120,21 @@ bool AlmostEqualUlps(float a, float b) { |
| return equal_ulps(a, b, UlpsEpsilon, UlpsEpsilon); |
| } |
| +bool AlmostEqualUlps_Pin(float a, float b) { |
| + const int UlpsEpsilon = 16; |
| + return equal_ulps_pin(a, b, UlpsEpsilon, UlpsEpsilon); |
| +} |
| + |
| bool NotAlmostEqualUlps(float a, float b) { |
| const int UlpsEpsilon = 16; |
| return not_equal_ulps(a, b, UlpsEpsilon); |
| } |
| +bool NotAlmostEqualUlps_Pin(float a, float b) { |
| + const int UlpsEpsilon = 16; |
| + return not_equal_ulps_pin(a, b, UlpsEpsilon); |
| +} |
| + |
| bool NotAlmostDequalUlps(float a, float b) { |
| const int UlpsEpsilon = 16; |
| return d_not_equal_ulps(a, b, UlpsEpsilon); |
| @@ -148,9 +163,6 @@ bool AlmostLessOrEqualUlps(float a, float b) { |
| } |
| int UlpsDistance(float a, float b) { |
| - if (!SkScalarIsFinite(a) || !SkScalarIsFinite(b)) { |
| - return SK_MaxS32; |
| - } |
| SkFloatIntUnion floatIntA, floatIntB; |
| floatIntA.fFloat = a; |
| floatIntB.fFloat = b; |