diff options
| author | 2019-10-02 13:46:32 -0700 | |
|---|---|---|
| committer | 2019-10-02 13:46:32 -0700 | |
| commit | b66e3a080efce8d2b34cd6260e74244b04666c9e (patch) | |
| tree | 90857b9c4fb9b7e983fad571f770ffbb14a03131 | |
| parent | 8f8ed1dd17c706f2ce495ed6da445bd6a5c1d713 (diff) | |
| parent | 8a0098befeedb5df5683639ebd3d663c9872c168 (diff) | |
Merge "Improve comparison of fractions" am: 0517cd144f am: b7cdf14a1f
am: 8a0098befe
Change-Id: If5e59001e02555aca6d3520fa4ecd7f42eab5506
| -rw-r--r-- | libs/hwui/pipeline/skia/LayerDrawable.cpp | 25 |
1 files changed, 6 insertions, 19 deletions
diff --git a/libs/hwui/pipeline/skia/LayerDrawable.cpp b/libs/hwui/pipeline/skia/LayerDrawable.cpp index b0173846e582..f839213e9007 100644 --- a/libs/hwui/pipeline/skia/LayerDrawable.cpp +++ b/libs/hwui/pipeline/skia/LayerDrawable.cpp @@ -43,41 +43,28 @@ static bool shouldFilterRect(const SkMatrix& matrix, const SkRect& srcRect, cons if (!matrix.rectStaysRect()) return true; SkRect dstDevRect = matrix.mapRect(dstRect); float dstW, dstH; - bool requiresIntegerTranslate = false; if (MathUtils::isZero(matrix.getScaleX()) && MathUtils::isZero(matrix.getScaleY())) { // Has a 90 or 270 degree rotation, although total matrix may also have scale factors // in m10 and m01. Those scalings are automatically handled by mapRect so comparing // dimensions is sufficient, but swap width and height comparison. dstW = dstDevRect.height(); dstH = dstDevRect.width(); - requiresIntegerTranslate = true; } else { // Handle H/V flips or 180 rotation matrices. Axes may have been mirrored, but // dimensions are still safe to compare directly. dstW = dstDevRect.width(); dstH = dstDevRect.height(); - requiresIntegerTranslate = - matrix.getScaleX() < -NON_ZERO_EPSILON || matrix.getScaleY() < -NON_ZERO_EPSILON; } if (!(MathUtils::areEqual(dstW, srcRect.width()) && MathUtils::areEqual(dstH, srcRect.height()))) { return true; } - 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 !(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 - return !(MathUtils::areEqual(SkScalarFraction(srcRect.x()), - SkScalarFraction(dstDevRect.x())) && - MathUtils::areEqual(SkScalarFraction(srcRect.y()), - SkScalarFraction(dstDevRect.y()))); - } + // Device rect and source rect should be integer aligned to ensure there's no difference + // in how nearest-neighbor sampling is resolved. + return !(isIntegerAligned(srcRect.x()) && + isIntegerAligned(srcRect.y()) && + isIntegerAligned(dstDevRect.x()) && + isIntegerAligned(dstDevRect.y())); } bool LayerDrawable::DrawLayer(GrContext* context, SkCanvas* canvas, Layer* layer, |