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

Commit 694f3e4a 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
parent af0279c9
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