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

Commit 63e8695e authored by Leon Scroggins III's avatar Leon Scroggins III
Browse files

Fix shadow corner radius during PIP size change

Bug: 187441996
Test: manual
Test: go/wm-smoke
Test: libcompositionengine_test
Test: TODO

The now-deleted code was intended to remove rounding when part of the
content is offscreen, but it removes rounding on corners that are
entirely on screen. Remove the code, which fixes a bug seen when
expanding a PIP. If the content is partially offscreen, our drawing code
will handle this correctly.

In addition, if the bounds is an SkRect and there is a roundRectClip,
draw the rounded version.

Change-Id: I6ee07321c04474f96a572015f301e01441ca5afc
parent 50f6e980
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -898,7 +898,16 @@ status_t SkiaGLRenderEngine::drawLayers(const DisplaySettings& display,
        if (layer->shadow.length > 0) {
            // This would require a new parameter/flag to SkShadowUtils::DrawShadow
            LOG_ALWAYS_FATAL_IF(layer->disableBlending, "Cannot disableBlending with a shadow");
            drawShadow(canvas, bounds, layer->shadow);

            // Technically, if bounds is a rect and roundRectClip is not empty,
            // it means that the bounds and roundedCornersCrop were different
            // enough that we should intersect them to find the proper shadow.
            // In practice, this often happens when the two rectangles appear to
            // not match due to rounding errors. Draw the rounded version, which
            // looks more like the intent.
            const auto& rrect =
                    bounds.isRect() && !roundRectClip.isEmpty() ? roundRectClip : bounds;
            drawShadow(canvas, rrect, layer->shadow);
            continue;
        }

+0 −17
Original line number Diff line number Diff line
@@ -623,23 +623,6 @@ std::optional<compositionengine::LayerFE::LayerSettings> Layer::prepareShadowCli
        return {};
    }

    float casterCornerRadius = shadowLayer.geometry.roundedCornersRadius;
    const FloatRect& cornerRadiusCropRect = shadowLayer.geometry.roundedCornersCrop;
    const FloatRect& casterRect = shadowLayer.geometry.boundaries;

    // crop used to set the corner radius may be larger than the content rect. Adjust the corner
    // radius accordingly.
    if (casterCornerRadius > 0.f) {
        float cropRectOffset = std::max(std::abs(cornerRadiusCropRect.top - casterRect.top),
                                        std::abs(cornerRadiusCropRect.left - casterRect.left));
        if (cropRectOffset > casterCornerRadius) {
            casterCornerRadius = 0;
        } else {
            casterCornerRadius -= cropRectOffset;
        }
        shadowLayer.geometry.roundedCornersRadius = casterCornerRadius;
    }

    return shadowLayer;
}