Unify drawing for background blur and blur regions
Bug: 171681577
Test: manual
Change-Id: I21f00c706ffd085a6dcc8275c8b1b9f1b0ef7379
diff --git a/libs/renderengine/skia/SkiaGLRenderEngine.cpp b/libs/renderengine/skia/SkiaGLRenderEngine.cpp
index 1f25fbf..fff7854 100644
--- a/libs/renderengine/skia/SkiaGLRenderEngine.cpp
+++ b/libs/renderengine/skia/SkiaGLRenderEngine.cpp
@@ -547,9 +547,11 @@
const auto layerRect = drawTransform.mapRect(dest);
if (layer->backgroundBlurRadius > 0) {
ATRACE_NAME("BackgroundBlur");
- auto blurredSurface =
- mBlurFilter->draw(canvas, surface, layer->backgroundBlurRadius, layerRect);
+ auto blurredSurface = mBlurFilter->generate(canvas, surface,
+ layer->backgroundBlurRadius, layerRect);
cachedBlurs[layer->backgroundBlurRadius] = blurredSurface;
+
+ drawBlurRegion(canvas, getBlurRegion(layer), drawTransform, blurredSurface);
}
if (layer->blurRegions.size() > 0) {
for (auto region : layer->blurRegions) {
@@ -663,13 +665,13 @@
paint.setColorFilter(SkColorFilters::Matrix(toSkColorMatrix(display.colorTransform)));
- canvas->save();
- canvas->concat(drawTransform);
-
for (const auto effectRegion : layer->blurRegions) {
- drawBlurRegion(canvas, effectRegion, dest, cachedBlurs[effectRegion.blurRadius]);
+ drawBlurRegion(canvas, effectRegion, drawTransform,
+ cachedBlurs[effectRegion.blurRadius]);
}
+ canvas->save();
+ canvas->concat(drawTransform);
if (layer->shadow.length > 0) {
const auto rect = layer->geometry.roundedCornersRadius > 0
? getSkRect(layer->geometry.roundedCornersCrop)
@@ -730,6 +732,21 @@
return SkRRect::MakeRectXY(rect, cornerRadius, cornerRadius);
}
+inline BlurRegion SkiaGLRenderEngine::getBlurRegion(const LayerSettings* layer) {
+ const auto rect = getSkRect(layer->geometry.boundaries);
+ const auto cornersRadius = layer->geometry.roundedCornersRadius;
+ return BlurRegion{.blurRadius = static_cast<uint32_t>(layer->backgroundBlurRadius),
+ .cornerRadiusTL = cornersRadius,
+ .cornerRadiusTR = cornersRadius,
+ .cornerRadiusBL = cornersRadius,
+ .cornerRadiusBR = cornersRadius,
+ .alpha = 1,
+ .left = static_cast<int>(rect.fLeft),
+ .top = static_cast<int>(rect.fTop),
+ .right = static_cast<int>(rect.fRight),
+ .bottom = static_cast<int>(rect.fBottom)};
+}
+
inline SkColor SkiaGLRenderEngine::getSkColor(const vec4& color) {
return SkColorSetARGB(color.a * 255, color.r * 255, color.g * 255, color.b * 255);
}
@@ -777,18 +794,19 @@
}
void SkiaGLRenderEngine::drawBlurRegion(SkCanvas* canvas, const BlurRegion& effectRegion,
- const SkRect& layerBoundaries,
+ const SkMatrix& drawTransform,
sk_sp<SkSurface> blurredSurface) {
ATRACE_CALL();
+
SkPaint paint;
paint.setAlpha(static_cast<int>(effectRegion.alpha * 255));
- const auto rect = SkRect::MakeLTRB(effectRegion.left, effectRegion.top, effectRegion.right,
- effectRegion.bottom);
-
- const auto matrix = mBlurFilter->getShaderMatrix(
- SkMatrix::MakeTrans(layerBoundaries.left(), layerBoundaries.top()));
+ const auto matrix = mBlurFilter->getShaderMatrix();
paint.setShader(blurredSurface->makeImageSnapshot()->makeShader(matrix));
+ auto rect = SkRect::MakeLTRB(effectRegion.left, effectRegion.top, effectRegion.right,
+ effectRegion.bottom);
+ drawTransform.mapRect(&rect);
+
if (effectRegion.cornerRadiusTL > 0 || effectRegion.cornerRadiusTR > 0 ||
effectRegion.cornerRadiusBL > 0 || effectRegion.cornerRadiusBR > 0) {
const SkVector radii[4] =
diff --git a/libs/renderengine/skia/SkiaGLRenderEngine.h b/libs/renderengine/skia/SkiaGLRenderEngine.h
index c65e431..43db3b1 100644
--- a/libs/renderengine/skia/SkiaGLRenderEngine.h
+++ b/libs/renderengine/skia/SkiaGLRenderEngine.h
@@ -67,6 +67,7 @@
inline SkRect getSkRect(const FloatRect& layer);
inline SkRect getSkRect(const Rect& layer);
inline SkRRect getRoundedRect(const LayerSettings* layer);
+ inline BlurRegion getBlurRegion(const LayerSettings* layer);
inline SkColor getSkColor(const vec4& color);
inline SkM44 getSkM44(const mat4& matrix);
inline SkMatrix getDrawTransform(const LayerSettings* layer, const SkMatrix& screenTransform);
@@ -76,8 +77,8 @@
bool waitFence(base::unique_fd fenceFd);
void drawShadow(SkCanvas* canvas, const SkRect& casterRect, float casterCornerRadius,
const ShadowSettings& shadowSettings);
- void drawBlurRegion(SkCanvas* canvas, const BlurRegion& blurRegion, const SkRect& layerBounds,
- sk_sp<SkSurface> blurrendSurface);
+ void drawBlurRegion(SkCanvas* canvas, const BlurRegion& blurRegion,
+ const SkMatrix& drawTransform, sk_sp<SkSurface> blurrendSurface);
EGLDisplay mEGLDisplay;
EGLConfig mEGLConfig;
diff --git a/libs/renderengine/skia/filters/BlurFilter.cpp b/libs/renderengine/skia/filters/BlurFilter.cpp
index dfb306f..a514825 100644
--- a/libs/renderengine/skia/filters/BlurFilter.cpp
+++ b/libs/renderengine/skia/filters/BlurFilter.cpp
@@ -130,26 +130,8 @@
return lastDrawTarget;
}
-sk_sp<SkSurface> BlurFilter::draw(SkCanvas* canvas, const sk_sp<SkSurface> input,
- const uint32_t blurRadius, SkRect rect) const {
- ATRACE_CALL();
- sk_sp<SkSurface> surface = generate(canvas, input, blurRadius, rect);
- const auto image = surface->makeImageSnapshot();
-
- SkPaint paint;
- paint.setShader(image->makeShader(SkMatrix::MakeScale(kInverseInputScale)));
- paint.setFilterQuality(kLow_SkFilterQuality);
- paint.setAlpha(std::min(1.0f, (float)blurRadius / kMaxCrossFadeRadius) * 255);
-
- canvas->drawRect(rect, paint);
-
- return surface;
-}
-
-SkMatrix BlurFilter::getShaderMatrix(const SkMatrix& transformMatrix) const {
- SkMatrix matrix;
- matrix.setConcat(transformMatrix, SkMatrix::MakeScale(kInverseInputScale));
- return matrix;
+SkMatrix BlurFilter::getShaderMatrix() const {
+ return SkMatrix::MakeScale(kInverseInputScale);
}
} // namespace skia
diff --git a/libs/renderengine/skia/filters/BlurFilter.h b/libs/renderengine/skia/filters/BlurFilter.h
index c0a92f6..734bfcb 100644
--- a/libs/renderengine/skia/filters/BlurFilter.h
+++ b/libs/renderengine/skia/filters/BlurFilter.h
@@ -50,11 +50,8 @@
// Execute blur, saving it to a texture
sk_sp<SkSurface> generate(SkCanvas* canvas, const sk_sp<SkSurface> input, const uint32_t radius,
SkRect rect) const;
- // Same as generate but also drawing to the screen
- sk_sp<SkSurface> draw(SkCanvas* canvas, const sk_sp<SkSurface> input, const uint32_t radius,
- SkRect rect) const;
// Returns a matrix that should be applied to the blur shader
- SkMatrix getShaderMatrix(const SkMatrix& transformMatrix) const;
+ SkMatrix getShaderMatrix() const;
private:
sk_sp<SkRuntimeEffect> mBlurEffect;