From 8f5d66b748b82bc0b45c2f261ec87e8fe81b2efd Mon Sep 17 00:00:00 2001 From: Nader Jawad Date: Wed, 7 Apr 2021 16:05:13 -0700 Subject: Do not use SkImageFilter for Stretch Refactor stretch implementation to manually draw the shader as a rect instead of using SkImageFilter Bug: 184184033 Test: Re-ran stretch tests Change-Id: I6263f5474b185b3f81ef9fd1bec3e43e86da49f2 --- libs/hwui/pipeline/skia/RenderNodeDrawable.cpp | 27 +++++++++++--------------- 1 file changed, 11 insertions(+), 16 deletions(-) (limited to 'libs/hwui/pipeline/skia/RenderNodeDrawable.cpp') diff --git a/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp b/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp index 5627a7e27232..77d99a67b602 100644 --- a/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp +++ b/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp @@ -180,20 +180,7 @@ static bool layerNeedsPaint(const sk_sp& snapshotImage, const LayerProp paint->setColorFilter(sk_ref_sp(properties.getColorFilter())); sk_sp imageFilter = sk_ref_sp(properties.getImageFilter()); - sk_sp stretchFilter = - properties.getStretchEffect().getImageFilter(snapshotImage); - sk_sp filter; - if (imageFilter && stretchFilter) { - filter = SkImageFilters::Compose( - std::move(stretchFilter), - std::move(imageFilter) - ); - } else if (stretchFilter) { - filter = std::move(stretchFilter); - } else { - filter = std::move(imageFilter); - } - paint->setImageFilter(std::move(filter)); + paint->setImageFilter(std::move(imageFilter)); return true; } return false; @@ -262,8 +249,16 @@ void RenderNodeDrawable::drawContent(SkCanvas* canvas) const { TransformCanvas transformCanvas(canvas); displayList->draw(&transformCanvas); } - canvas->drawImageRect(snapshotImage, bounds, bounds, sampling, &paint, - SkCanvas::kStrict_SrcRectConstraint); + + const StretchEffect& stretch = properties.layerProperties().getStretchEffect(); + if (stretch.isEmpty()) { + canvas->drawImageRect(snapshotImage, bounds, bounds, sampling, &paint, + SkCanvas::kStrict_SrcRectConstraint); + } else { + sk_sp stretchShader = stretch.getShader(snapshotImage); + paint.setShader(stretchShader); + canvas->drawRect(bounds, paint); + } if (!renderNode->getSkiaLayer()->hasRenderedSinceRepaint) { renderNode->getSkiaLayer()->hasRenderedSinceRepaint = true; -- cgit v1.2.3