diff options
author | 2015-12-16 12:28:35 -0800 | |
---|---|---|
committer | 2015-12-16 12:28:35 -0800 | |
commit | b669300a9753893ef900207c38aeff2d467764e5 (patch) | |
tree | edfcba83547eb0897237a2547468bb6e708448c8 /src/pathops/SkPathOpsTypes.cpp | |
parent | 54c6fe8519f2927181a0847d22a61190529645e8 (diff) |
only call scalar finite when necessary
Mike points that the the ulps compares
rank high in path ops profiles. The
check for finite scalars is rarely
required.
Call it less by:
- specializing _pin version of compares
- checking for 0 divides up front
- handling failing cases before comparing
- casting float to double before adding
R=reed@google.com
Review URL: https://codereview.chromium.org/1522183002
Diffstat (limited to 'src/pathops/SkPathOpsTypes.cpp')
-rw-r--r-- | src/pathops/SkPathOpsTypes.cpp | 50 |
1 files changed, 31 insertions, 19 deletions
diff --git a/src/pathops/SkPathOpsTypes.cpp b/src/pathops/SkPathOpsTypes.cpp index ca84405aa7..1ed484afee 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) { 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; |