Loading libs/hwui/Matrix.h +1 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ namespace android { namespace uirenderer { #define SK_MATRIX_STRING "[%.2f %.2f %.2f] [%.2f %.2f %.2f] [%.2f %.2f %.2f]" #define SK_MATRIX_STRING_V "[%.9f %.9f %.9f] [%.9f %.9f %.9f] [%.9f %.9f %.9f]" #define SK_MATRIX_ARGS(m) \ (m)->get(0), (m)->get(1), (m)->get(2), (m)->get(3), (m)->get(4), (m)->get(5), (m)->get(6), \ (m)->get(7), (m)->get(8) Loading libs/hwui/pipeline/skia/LayerDrawable.cpp +21 −5 Original line number Diff line number Diff line Loading @@ -14,6 +14,7 @@ * limitations under the License. */ #include <utils/MathUtils.h> #include "LayerDrawable.h" #include "GrBackendSurface.h" Loading @@ -32,6 +33,24 @@ void LayerDrawable::onDraw(SkCanvas* canvas) { } } // This is a less-strict matrix.isTranslate() that will still report being translate-only // on imperceptibly small scaleX & scaleY values. static bool isBasicallyTranslate(const SkMatrix& matrix) { if (!matrix.isScaleTranslate()) return false; return MathUtils::isOne(matrix.getScaleX()) && MathUtils::isOne(matrix.getScaleY()); } static bool shouldFilter(const SkMatrix& matrix) { if (!matrix.isScaleTranslate()) return true; // We only care about meaningful scale here bool noScale = MathUtils::isOne(matrix.getScaleX()) && MathUtils::isOne(matrix.getScaleY()); bool pixelAligned = SkScalarIsInt(matrix.getTranslateX()) && SkScalarIsInt(matrix.getTranslateY()); return !(noScale && pixelAligned); } bool LayerDrawable::DrawLayer(GrContext* context, SkCanvas* canvas, Layer* layer, const SkRect* srcRect, const SkRect* dstRect, bool useLayerTransform) { Loading Loading @@ -101,7 +120,7 @@ bool LayerDrawable::DrawLayer(GrContext* context, SkCanvas* canvas, Layer* layer // Integer translation is defined as when src rect and dst rect align fractionally. // Skia TextureOp has the above logic build-in, but not NonAAFillRectOp. TextureOp works // only for SrcOver blending and without color filter (readback uses Src blending). bool isIntegerTranslate = totalMatrix.isTranslate() bool isIntegerTranslate = isBasicallyTranslate(totalMatrix) && SkScalarFraction(skiaDestRect.fLeft + totalMatrix[SkMatrix::kMTransX]) == SkScalarFraction(skiaSrcRect.fLeft) && SkScalarFraction(skiaDestRect.fTop + totalMatrix[SkMatrix::kMTransY]) Loading @@ -112,10 +131,7 @@ bool LayerDrawable::DrawLayer(GrContext* context, SkCanvas* canvas, Layer* layer canvas->drawImageRect(layerImage.get(), skiaSrcRect, skiaDestRect, &paint, SkCanvas::kFast_SrcRectConstraint); } else { bool isIntegerTranslate = totalMatrix.isTranslate() && SkScalarIsInt(totalMatrix[SkMatrix::kMTransX]) && SkScalarIsInt(totalMatrix[SkMatrix::kMTransY]); if (layer->getForceFilter() || !isIntegerTranslate) { if (layer->getForceFilter() || shouldFilter(totalMatrix)) { paint.setFilterQuality(kLow_SkFilterQuality); } canvas->drawImage(layerImage.get(), 0, 0, &paint); Loading libs/hwui/utils/MathUtils.h +4 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,10 @@ public: return (value >= -NON_ZERO_EPSILON) && (value <= NON_ZERO_EPSILON); } inline static bool isOne(float value) { return areEqual(value, 1.0f); } inline static bool isPositive(float value) { return value >= NON_ZERO_EPSILON; } /** Loading Loading
libs/hwui/Matrix.h +1 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ namespace android { namespace uirenderer { #define SK_MATRIX_STRING "[%.2f %.2f %.2f] [%.2f %.2f %.2f] [%.2f %.2f %.2f]" #define SK_MATRIX_STRING_V "[%.9f %.9f %.9f] [%.9f %.9f %.9f] [%.9f %.9f %.9f]" #define SK_MATRIX_ARGS(m) \ (m)->get(0), (m)->get(1), (m)->get(2), (m)->get(3), (m)->get(4), (m)->get(5), (m)->get(6), \ (m)->get(7), (m)->get(8) Loading
libs/hwui/pipeline/skia/LayerDrawable.cpp +21 −5 Original line number Diff line number Diff line Loading @@ -14,6 +14,7 @@ * limitations under the License. */ #include <utils/MathUtils.h> #include "LayerDrawable.h" #include "GrBackendSurface.h" Loading @@ -32,6 +33,24 @@ void LayerDrawable::onDraw(SkCanvas* canvas) { } } // This is a less-strict matrix.isTranslate() that will still report being translate-only // on imperceptibly small scaleX & scaleY values. static bool isBasicallyTranslate(const SkMatrix& matrix) { if (!matrix.isScaleTranslate()) return false; return MathUtils::isOne(matrix.getScaleX()) && MathUtils::isOne(matrix.getScaleY()); } static bool shouldFilter(const SkMatrix& matrix) { if (!matrix.isScaleTranslate()) return true; // We only care about meaningful scale here bool noScale = MathUtils::isOne(matrix.getScaleX()) && MathUtils::isOne(matrix.getScaleY()); bool pixelAligned = SkScalarIsInt(matrix.getTranslateX()) && SkScalarIsInt(matrix.getTranslateY()); return !(noScale && pixelAligned); } bool LayerDrawable::DrawLayer(GrContext* context, SkCanvas* canvas, Layer* layer, const SkRect* srcRect, const SkRect* dstRect, bool useLayerTransform) { Loading Loading @@ -101,7 +120,7 @@ bool LayerDrawable::DrawLayer(GrContext* context, SkCanvas* canvas, Layer* layer // Integer translation is defined as when src rect and dst rect align fractionally. // Skia TextureOp has the above logic build-in, but not NonAAFillRectOp. TextureOp works // only for SrcOver blending and without color filter (readback uses Src blending). bool isIntegerTranslate = totalMatrix.isTranslate() bool isIntegerTranslate = isBasicallyTranslate(totalMatrix) && SkScalarFraction(skiaDestRect.fLeft + totalMatrix[SkMatrix::kMTransX]) == SkScalarFraction(skiaSrcRect.fLeft) && SkScalarFraction(skiaDestRect.fTop + totalMatrix[SkMatrix::kMTransY]) Loading @@ -112,10 +131,7 @@ bool LayerDrawable::DrawLayer(GrContext* context, SkCanvas* canvas, Layer* layer canvas->drawImageRect(layerImage.get(), skiaSrcRect, skiaDestRect, &paint, SkCanvas::kFast_SrcRectConstraint); } else { bool isIntegerTranslate = totalMatrix.isTranslate() && SkScalarIsInt(totalMatrix[SkMatrix::kMTransX]) && SkScalarIsInt(totalMatrix[SkMatrix::kMTransY]); if (layer->getForceFilter() || !isIntegerTranslate) { if (layer->getForceFilter() || shouldFilter(totalMatrix)) { paint.setFilterQuality(kLow_SkFilterQuality); } canvas->drawImage(layerImage.get(), 0, 0, &paint); Loading
libs/hwui/utils/MathUtils.h +4 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,10 @@ public: return (value >= -NON_ZERO_EPSILON) && (value <= NON_ZERO_EPSILON); } inline static bool isOne(float value) { return areEqual(value, 1.0f); } inline static bool isPositive(float value) { return value >= NON_ZERO_EPSILON; } /** Loading