Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f656d4b6 authored by Stan Iliev's avatar Stan Iliev Committed by Michael Bestas
Browse files

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
(cherry picked from commit 694f3e4a)
(cherry picked from commit 819698bb)
parent 3a77f7e8
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -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