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>
diff --git a/src/effects/gradients/SkClampRange.h b/src/effects/gradients/SkClampRange.h
index 91c259a..8a22e72 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