Index: include/core/SkFixed.h |
diff --git a/include/core/SkFixed.h b/include/core/SkFixed.h |
index 8bbf2f0dfec48e298a3953843a58129601014202..8a56104172af0d043cc81fa00a5ed2fa36665277 100644 |
--- a/include/core/SkFixed.h |
+++ b/include/core/SkFixed.h |
@@ -29,8 +29,18 @@ typedef int32_t SkFixed; |
#define SK_FixedTanPIOver8 (0x6A0A) |
#define SK_FixedRoot2Over2 (0xB505) |
-#define SkFixedToFloat(x) ((x) * 1.52587890625e-5f) |
-#define SkFloatToFixed(x) ((SkFixed)((x) * SK_Fixed1)) |
+#define SkFixedToFloat(x) ((x) * 1.52587890625e-5f) |
+#define SkFloatToFixed_Unsafe(x) ((SkFixed)((x) * SK_Fixed1)) |
+ |
+#ifdef SK_DEBUG |
+ static inline SkFixed SkFloatToFixed(float x) { |
mtklein
2016/03/22 12:38:02
It should be fine to use this definition in Debug
|
+ const SkFixed result = SkFloatToFixed_Unsafe(x); |
+ SkASSERT(truncf(x * SK_Fixed1) == static_cast<float>(result)); |
+ return result; |
+ } |
+#else |
+ #define SkFloatToFixed(x) SkFloatToFixed_Unsafe(x) |
+#endif |
// Pins over/under flows to SK_FixedMax/SK_FixedMin (slower than just a cast). |
static inline SkFixed SkFloatPinToFixed(float x) { |
@@ -43,20 +53,19 @@ static inline SkFixed SkFloatPinToFixed(float x) { |
return result; |
} |
+#define SkFixedToDouble(x) ((x) * 1.52587890625e-5) |
+#define SkDoubleToFixed_Unsafe(x) ((SkFixed)((x) * SK_Fixed1)) |
+ |
#ifdef SK_DEBUG |
mtklein
2016/03/22 12:38:02
Ditto.
|
- static inline SkFixed SkFloatToFixed_Check(float x) { |
- int64_t n64 = (int64_t)(x * SK_Fixed1); |
- SkFixed n32 = (SkFixed)n64; |
- SkASSERT(n64 == n32); |
- return n32; |
+ static inline SkFixed SkDoubleToFixed(double x) { |
+ const SkFixed result = SkDoubleToFixed_Unsafe(x); |
+ SkASSERT(trunc(x * SK_Fixed1) == static_cast<double>(result)); |
+ return result; |
} |
#else |
- #define SkFloatToFixed_Check(x) SkFloatToFixed(x) |
+ #define SkDoubleToFixed(x) SkDoubleToFixed_Unsafe(x) |
#endif |
-#define SkFixedToDouble(x) ((x) * 1.52587890625e-5) |
-#define SkDoubleToFixed(x) ((SkFixed)((x) * SK_Fixed1)) |
- |
// Pins over/under flows to SK_FixedMax/SK_FixedMin (slower than just a cast). |
static inline SkFixed SkDoublePinToFixed(double x) { |
x *= SK_Fixed1; |
@@ -152,19 +161,30 @@ inline SkFixed SkFixedMul_longlong(SkFixed a, SkFixed b) { |
#undef SkFixedMul |
#define SkFixedMul(x, y) SkFixedMul_arm(x, y) |
- #undef SkFloatToFixed |
- #define SkFloatToFixed(x) SkFloatToFixed_arm(x) |
+ #undef SkFloatToFixed_Unsafe |
+ #define SkFloatToFixed_Unsafe(x) SkFloatToFixed_arm(x) |
mtklein
2016/03/22 12:38:02
Can you double check that SkFloatToFixed still cal
|
#endif |
/////////////////////////////////////////////////////////////////////////////// |
typedef int64_t SkFixed3232; // 32.32 |
-#define SkIntToFixed3232(x) (SkLeftShift((SkFixed3232)(x), 32)) |
-#define SkFixed3232ToInt(x) ((int)((x) >> 32)) |
-#define SkFixedToFixed3232(x) (SkLeftShift((SkFixed3232)(x), 16)) |
-#define SkFixed3232ToFixed(x) ((SkFixed)((x) >> 16)) |
-#define SkFloatToFixed3232(x) ((SkFixed3232)((x) * (65536.0f * 65536.0f))) |
+#define SK_Fixed3232_1 (static_cast<SkFixed3232>(1) << 32) |
+#define SkIntToFixed3232(x) (SkLeftShift((SkFixed3232)(x), 32)) |
+#define SkFixed3232ToInt(x) ((int)((x) >> 32)) |
+#define SkFixedToFixed3232(x) (SkLeftShift((SkFixed3232)(x), 16)) |
+#define SkFixed3232ToFixed(x) ((SkFixed)((x) >> 16)) |
+#define SkFloatToFixed3232_Unsafe(x) (static_cast<SkFixed3232>((x) * SK_Fixed3232_1)) |
+ |
+#ifdef SK_DEBUG |
mtklein
2016/03/22 12:38:03
ditto
|
+ static inline SkFixed3232 SkFloatToFixed3232(float x) { |
+ const SkFixed3232 result = SkFloatToFixed3232_Unsafe(x); |
+ SkASSERT(truncf(x * SK_Fixed3232_1) == static_cast<float>(result)); |
+ return result; |
+ } |
+#else |
+ #define SkFloatToFixed3232(x) SkFloatToFixed3232_Unsafe(x) |
+#endif |
#define SkScalarToFixed3232(x) SkFloatToFixed3232(x) |