diff options
author | 2013-10-02 14:49:34 +0000 | |
---|---|---|
committer | 2013-10-02 14:49:34 +0000 | |
commit | 7eaa53d8f7e48fd17d02b5e3bd91f90e9c1899ef (patch) | |
tree | 057de94d997d99e897c68157f7444fbca687ebf9 /src/pathops/SkPathOpsTypes.cpp | |
parent | 77af6805e5faea1e2a5c0220098aec9082f3a6e5 (diff) |
path ops work in progress
make more skps work
remove edit files
BUG=
Review URL: https://codereview.chromium.org/23542056
git-svn-id: http://skia.googlecode.com/svn/trunk@11570 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/pathops/SkPathOpsTypes.cpp')
-rw-r--r-- | src/pathops/SkPathOpsTypes.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/pathops/SkPathOpsTypes.cpp b/src/pathops/SkPathOpsTypes.cpp index 2d7388b882..df73d11ce4 100644 --- a/src/pathops/SkPathOpsTypes.cpp +++ b/src/pathops/SkPathOpsTypes.cpp @@ -7,12 +7,30 @@ #include "SkFloatBits.h" #include "SkPathOpsTypes.h" +static bool arguments_denormalized(float a, float b, int epsilon) { + float denomalizedCheck = FLT_EPSILON * epsilon / 2; + return fabsf(a) <= denomalizedCheck && fabsf(b) <= denomalizedCheck; +} + // 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) { if (!SkScalarIsFinite(a) || !SkScalarIsFinite(b)) { return false; } + if (arguments_denormalized(a, b, epsilon)) { + return true; + } + int aBits = SkFloatAs2sCompliment(a); + int bBits = SkFloatAs2sCompliment(b); + // Find the difference in ULPs. + return aBits < bBits + epsilon && bBits < aBits + epsilon; +} + +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. @@ -23,6 +41,19 @@ static bool not_equal_ulps(float a, float b, int epsilon) { if (!SkScalarIsFinite(a) || !SkScalarIsFinite(b)) { return false; } + 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 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. @@ -33,6 +64,9 @@ 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; + } int aBits = SkFloatAs2sCompliment(a); int bBits = SkFloatAs2sCompliment(b); // Find the difference in ULPs. @@ -43,6 +77,9 @@ 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; + } int aBits = SkFloatAs2sCompliment(a); int bBits = SkFloatAs2sCompliment(b); // Find the difference in ULPs. @@ -55,6 +92,11 @@ bool AlmostBequalUlps(float a, float b) { return equal_ulps(a, b, UlpsEpsilon); } +bool AlmostDequalUlps(float a, float b) { + const int UlpsEpsilon = 16; + return d_equal_ulps(a, b, UlpsEpsilon); +} + bool AlmostEqualUlps(float a, float b) { const int UlpsEpsilon = 16; return equal_ulps(a, b, UlpsEpsilon); @@ -65,6 +107,11 @@ bool NotAlmostEqualUlps(float a, float b) { return not_equal_ulps(a, b, UlpsEpsilon); } +bool NotAlmostDequalUlps(float a, float b) { + const int UlpsEpsilon = 16; + return d_not_equal_ulps(a, b, UlpsEpsilon); +} + bool RoughlyEqualUlps(float a, float b) { const int UlpsEpsilon = 256; return equal_ulps(a, b, UlpsEpsilon); |