From 694f3e4a5518e8e3fe025a5a04e9088fe41df97d Mon Sep 17 00:00:00 2001 From: Stan Iliev Date: Mon, 29 Jul 2019 17:00:49 -0400 Subject: [PATCH] Improve integer aligned coordinate detection 65.9998 should be detected as integer aligned. Before this CL only 65.0001 was detected as an integer. Test: Pass TextureViewTest#testSamplingWithTransform Bug: 137682518 Change-Id: I65e650f50040ab56d2237c14d5d8ee191349b93e --- libs/hwui/pipeline/skia/LayerDrawable.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/libs/hwui/pipeline/skia/LayerDrawable.cpp b/libs/hwui/pipeline/skia/LayerDrawable.cpp index 96b17e1d79758..b0173846e582c 100644 --- a/libs/hwui/pipeline/skia/LayerDrawable.cpp +++ b/libs/hwui/pipeline/skia/LayerDrawable.cpp @@ -33,6 +33,10 @@ void LayerDrawable::onDraw(SkCanvas* canvas) { } } +static inline SkScalar isIntegerAligned(SkScalar x) { + return fabsf(roundf(x) - x) <= NON_ZERO_EPSILON; +} + // Disable filtering when there is no scaling in screen coordinates and the corners have the same // fraction (for translate) or zero fraction (for any other rect-to-rect transform). static bool shouldFilterRect(const SkMatrix& matrix, const SkRect& srcRect, const SkRect& dstRect) { @@ -62,10 +66,10 @@ static bool shouldFilterRect(const SkMatrix& matrix, const SkRect& srcRect, cons if (requiresIntegerTranslate) { // Device rect and source rect should be integer aligned to ensure there's no difference // in how nearest-neighbor sampling is resolved. - return !(MathUtils::isZero(SkScalarFraction(srcRect.x())) && - MathUtils::isZero(SkScalarFraction(srcRect.y())) && - MathUtils::isZero(SkScalarFraction(dstDevRect.x())) && - MathUtils::isZero(SkScalarFraction(dstDevRect.y()))); + return !(isIntegerAligned(srcRect.x()) && + isIntegerAligned(srcRect.y()) && + isIntegerAligned(dstDevRect.x()) && + isIntegerAligned(dstDevRect.y())); } else { // As long as src and device rects are translated by the same fractional amount, // filtering won't be needed