Chromium Code Reviews| 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); |
|
bungeman-skia
2014/05/05 15:39:31
So this is round to nearest, round half up. C++11
reed1
2014/05/05 15:56:37
Agreed, that's why unfortunately we have to write
|
| +} |
| + |
| /** Returns the absolute value of the specified SkScalar |
| */ |
| #define SkScalarAbs(x) sk_float_abs(x) |