| 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)
|
|
|