diff options
author | 2017-02-17 12:58:41 -0500 | |
---|---|---|
committer | 2017-02-17 18:47:30 +0000 | |
commit | ef0a15b1642668f072d84a43d3bc99443e1701d8 (patch) | |
tree | 4bb15b7d49789c6737e347545c3aa59d6aeef82f /src/effects/gradients | |
parent | 7d07d4663822c05e421f1f50460a985ab43adac4 (diff) |
Fix TAP ASAN failure.
The current SkFixed3232 pinning logic in SkClampRange is not safe:
SkFixed3232ToFloat(SkFixed3232Max) and SkFixed3232ToFloat(SkFixed3232Min)
are not exactly representable in float, so they are not good SkTPin
limits.
Use the next representable float value towards zero. Constants computed
with nextafterf(..., 0).
Change-Id: I8e2eb35b22f65077e8ce6055d670d90d2a163bae
Reviewed-on: https://skia-review.googlesource.com/8662
Commit-Queue: Florin Malita <fmalita@chromium.org>
Reviewed-by: Mike Reed <reed@google.com>
Diffstat (limited to 'src/effects/gradients')
-rw-r--r-- | src/effects/gradients/SkClampRange.h | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/effects/gradients/SkClampRange.h b/src/effects/gradients/SkClampRange.h index 91c259ae15..8a22e72d38 100644 --- a/src/effects/gradients/SkClampRange.h +++ b/src/effects/gradients/SkClampRange.h @@ -12,9 +12,18 @@ #include "SkScalar.h" #define SkGradFixed SkFixed3232 -#define SkScalarPinToGradFixed(x) SkScalarToFixed3232(SkTPin(x, \ - SkFixed3232ToFloat(SkFixed3232Min),\ - SkFixed3232ToFloat(SkFixed3232Max))) + +// We want the largest 32.32 value representable as a float. (float)0x7FFFFFFF +// becomes too big, due to limited mantissa on the float and its rounding rules, so +// we have to manually compute the next smaller value (aka nextafter). + +// #define SkGradFixedMaxScalar nextafterf(SkFixed3232ToFloat(SkFixed3232Max), 0) +// #define SkGradFixedMinScalar nextafterf(SkFixed3232ToFloat(SkFixed3232Min), 0) +#define SkGradFixedMaxScalar ( 2147483520.0f) +#define SkGradFixedMinScalar (-2147483520.0f) +#define SkScalarPinToGradFixed(x) SkScalarToFixed3232(SkTPin(x, \ + SkGradFixedMinScalar,\ + SkGradFixedMaxScalar)) #define SkFixedToGradFixed(x) SkFixedToFixed3232(x) #define SkGradFixedToFixed(x) (SkFixed)((x) >> 16) #define kFracMax_SkGradFixed 0xFFFFFFFFLL |