aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/pathops/SkPathOpsTypes.cpp
diff options
context:
space:
mode:
authorGravatar caryclark <caryclark@google.com>2015-12-16 12:28:35 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2015-12-16 12:28:35 -0800
commitb669300a9753893ef900207c38aeff2d467764e5 (patch)
treeedfcba83547eb0897237a2547468bb6e708448c8 /src/pathops/SkPathOpsTypes.cpp
parent54c6fe8519f2927181a0847d22a61190529645e8 (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.cpp50
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;