From 4e332f82fce0126045e9cb2ef0a2097a6c4c40a3 Mon Sep 17 00:00:00 2001 From: "commit-bot@chromium.org" Date: Mon, 5 May 2014 16:04:42 +0000 Subject: add rounding-using-doubles methods on SkScalar and SkRect Inspired by the excellent repro case for https://crbug.com/364224 patch from issue 265933010 BUG=skia: R=bungeman@google.com Author: reed@google.com Review URL: https://codereview.chromium.org/267003002 git-svn-id: http://skia.googlecode.com/svn/trunk@14566 2bbb7eff-a529-9590-31e7-b0007b416f81 --- include/core/SkRect.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'include/core/SkRect.h') diff --git a/include/core/SkRect.h b/include/core/SkRect.h index 397e4a03ee..fd8cb16020 100644 --- a/include/core/SkRect.h +++ b/include/core/SkRect.h @@ -731,6 +731,24 @@ struct SK_API SkRect { SkScalarRoundToInt(fRight), SkScalarRoundToInt(fBottom)); } + /** + * Variant of round() that explicitly performs the rounding step (i.e. floor(x + 0.5)) using + * double instead of SkScalar (float). It does this by calling SkDScalarRoundToInt(), which + * may be slower than calling SkScalarRountToInt(), but gives slightly more accurate results. + * + * e.g. + * SkScalar x = 0.49999997f; + * int ix = SkScalarRoundToInt(x); + * SkASSERT(0 == ix); // <--- fails + * ix = SkDScalarRoundToInt(x); + * SkASSERT(0 == ix); // <--- succeeds + */ + void dround(SkIRect* dst) const { + SkASSERT(dst); + dst->set(SkDScalarRoundToInt(fLeft), SkDScalarRoundToInt(fTop), + SkDScalarRoundToInt(fRight), SkDScalarRoundToInt(fBottom)); + } + /** * Set the dst rectangle by rounding "out" this rectangle, choosing the * SkScalarFloor of top and left, and the SkScalarCeil of right and bottom. -- cgit v1.2.3