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

Commit 763e450b authored by Leon Scroggins III's avatar Leon Scroggins III Committed by Leon Scroggins
Browse files

RenderEngine: Limit the size of blur input to the display size

Some layers are extraordinarily large. In the particular case we've
found, the layer does not have any content, but even if it did, content
outside the display would not impact the blur. So limit the size of the
rectangle we use for blurring, which in turn limits the size of the
buffers we allocate to compute the blur.

Use the canvas' existing clip, which has already been adjusted to the
size of the display.

Bug: 283427479
Bug: 292539958
Test: manual (logcat)
Change-Id: I17e646cce0dca02f4e6a18032ecd1e9120fcf880
Merged-In: I17e646cce0dca02f4e6a18032ecd1e9120fcf880
parent ce68dd7e
Loading
Loading
Loading
Loading
+13 −1
Original line number Diff line number Diff line
@@ -813,8 +813,20 @@ void SkiaRenderEngine::drawLayersInternal(
            if (!blurInput) {
                blurInput = activeSurface->makeImageSnapshot();
            }

            // rect to be blurred in the coordinate space of blurInput
            const auto blurRect = canvas->getTotalMatrix().mapRect(bounds.rect());
            SkRect blurRect = canvas->getTotalMatrix().mapRect(bounds.rect());

            // Some layers may be much bigger than the screen. If we used
            // `blurRect` directly, this would allocate a large buffer with no
            // benefit. Apply the clip, which already takes the display size
            // into account. The clipped size will then be used to calculate the
            // size of the buffer we will create for blurring.
            if (!blurRect.intersect(SkRect::Make(canvas->getDeviceClipBounds()))) {
                // This should not happen, but if it did, we would use the full
                // sized layer, which should still be fine.
                ALOGW("blur bounds does not intersect display clip!");
            }

            // if the clip needs to be applied then apply it now and make sure
            // it is restored before we attempt to draw any shadows.