Index: include/core/SkScalar.h |
diff --git a/include/core/SkScalar.h b/include/core/SkScalar.h |
index b9256badb4c02b6524ab075e39310e52fb118ebf..b37cf5c998fd4505f6dfd03b43ac39841827e91a 100644 |
--- a/include/core/SkScalar.h |
+++ b/include/core/SkScalar.h |
@@ -83,6 +83,26 @@ static inline bool SkScalarIsFinite(float x) { |
#define SkScalarRoundToInt(x) sk_float_round2int(x) |
#define SkScalarTruncToInt(x) static_cast<int>(x) |
+/** |
+ * Variant of SkScalarRoundToInt, that performs the rounding step (adding 0.5) explicitly using |
+ * double, to avoid possibly losing the low bit(s) of the answer before calling floor(). |
+ * |
+ * This routine will likely be slower than SkScalarRoundToInt(), and should only be used when the |
+ * extra precision is known to be valuable. |
+ * |
+ * In particular, this catches the following case: |
+ * SkScalar x = 0.49999997; |
+ * int ix = SkScalarRoundToInt(x); |
+ * SkASSERT(0 == ix); // <--- fails |
+ * ix = SkDScalarRoundToInt(x); |
+ * SkASSERT(0 == ix); // <--- succeeds |
+ */ |
+static inline int SkDScalarRoundToInt(SkScalar x) { |
+ double xx = x; |
+ xx += 0.5; |
+ return (int)floor(xx); |
+} |
+ |
/** Returns the absolute value of the specified SkScalar |
*/ |
#define SkScalarAbs(x) sk_float_abs(x) |