aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Florin Malita <fmalita@chromium.org>2017-02-17 12:58:41 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-02-17 18:47:30 +0000
commitef0a15b1642668f072d84a43d3bc99443e1701d8 (patch)
tree4bb15b7d49789c6737e347545c3aa59d6aeef82f
parent7d07d4663822c05e421f1f50460a985ab43adac4 (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>
-rw-r--r--src/effects/gradients/SkClampRange.h15
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