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

Commit 819698bb authored by Stan Iliev's avatar Stan Iliev
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)
parent 25057111
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