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

Commit b0e764c6 authored by Derek Sollenberger's avatar Derek Sollenberger
Browse files

Apply shadow to roundedRects in RenderEngine.

This CL results in more accurate shadows compared to previous
code, but still does not handle the situation where the shadow
layer has a parent with a round rect clip AND the intersection
of that clip with this layer does not result in a round rect.

Test: atest librenderengine_test
Bug: 186773838
Change-Id: I91dffd82bb4d5837cb20926ff0880dfc183e560c
parent 8e8b3bf3
Loading
Loading
Loading
Loading
+3 −9
Original line number Diff line number Diff line
@@ -905,12 +905,9 @@ status_t SkiaGLRenderEngine::drawLayers(const DisplaySettings& display,
        // TODO(b/175915334): consider relaxing this restriction to enable more flexible
        // composition - using a well-defined invalid color is long-term less error-prone.
        if (layer->shadow.length > 0) {
            const auto rect = layer->geometry.roundedCornersRadius > 0
                    ? getSkRect(layer->geometry.roundedCornersCrop)
                    : bounds.rect();
            // This would require a new parameter/flag to SkShadowUtils::DrawShadow
            LOG_ALWAYS_FATAL_IF(layer->disableBlending, "Cannot disableBlending with a shadow");
            drawShadow(canvas, rect, layer->geometry.roundedCornersRadius, layer->shadow);
            drawShadow(canvas, bounds, layer->shadow);
            continue;
        }

@@ -1199,17 +1196,14 @@ size_t SkiaGLRenderEngine::getMaxViewportDims() const {
    return mGrContext->maxRenderTargetSize();
}

void SkiaGLRenderEngine::drawShadow(SkCanvas* canvas, const SkRect& casterRect, float cornerRadius,
void SkiaGLRenderEngine::drawShadow(SkCanvas* canvas, const SkRRect& casterRRect,
                                    const ShadowSettings& settings) {
    ATRACE_CALL();
    const float casterZ = settings.length / 2.0f;
    const auto shadowShape = cornerRadius > 0
            ? SkPath::RRect(SkRRect::MakeRectXY(casterRect, cornerRadius, cornerRadius))
            : SkPath::Rect(casterRect);
    const auto flags =
            settings.casterIsTranslucent ? kTransparentOccluder_ShadowFlag : kNone_ShadowFlag;

    SkShadowUtils::DrawShadow(canvas, shadowShape, SkPoint3::Make(0, 0, casterZ),
    SkShadowUtils::DrawShadow(canvas, SkPath::RRect(casterRRect), SkPoint3::Make(0, 0, casterZ),
                              getSkPoint3(settings.lightPos), settings.lightRadius,
                              getSkColor(settings.ambientColor), getSkColor(settings.spotColor),
                              flags);
+1 −1
Original line number Diff line number Diff line
@@ -97,7 +97,7 @@ private:
    base::unique_fd flush();
    bool waitFence(base::unique_fd fenceFd);
    void initCanvas(SkCanvas* canvas, const DisplaySettings& display);
    void drawShadow(SkCanvas* canvas, const SkRect& casterRect, float casterCornerRadius,
    void drawShadow(SkCanvas* canvas, const SkRRect& casterRRect,
                    const ShadowSettings& shadowSettings);
    // If requiresLinearEffect is true or the layer has a stretchEffect a new shader is returned.
    // Otherwise it returns the input shader.