2121#include " SkiaRenderEngine.h"
2222
2323#include < SkBlendMode.h>
24+ #include < SkBlurTypes.h>
2425#include < SkCanvas.h>
2526#include < SkColor.h>
2627#include < SkColorFilter.h>
3233#include < SkImageFilters.h>
3334#include < SkImageInfo.h>
3435#include < SkM44.h>
36+ #include < SkMaskFilter.h>
3537#include < SkMatrix.h>
3638#include < SkPaint.h>
3739#include < SkPath.h>
@@ -986,20 +988,19 @@ void SkiaRenderEngine::drawLayersInternal(
986988 drawShadow (canvas, rrect, layer.shadow );
987989 }
988990
991+ // TODO(b/367464660): Move this code above and
992+ // update elevation shadow rendering to use these bounds since they should be
993+ // identical.
994+ SkRRect originalBounds, originalClip;
995+ std::tie (originalBounds, originalClip) =
996+ getBoundsAndClip (layer.geometry .originalBounds , layer.geometry .roundedCornersCrop ,
997+ layer.geometry .roundedCornersRadius );
998+ const SkRRect& preferredOriginalBounds =
999+ originalBounds.isRect () && !originalClip.isEmpty () ? originalClip : originalBounds;
1000+
9891001 // Similar to shadows, do the rendering before the clip is applied because even when the
9901002 // layer is occluded it should have an outline.
9911003 if (layer.borderSettings .strokeWidth > 0 ) {
992- // TODO(b/367464660): Move this code to the parent scope and
993- // update shadow rendering above to use these bounds since they should be
994- // identical.
995- SkRRect originalBounds, originalClip;
996- std::tie (originalBounds, originalClip) =
997- getBoundsAndClip (layer.geometry .boundaries , layer.geometry .roundedCornersCrop ,
998- layer.geometry .roundedCornersRadius );
999- const SkRRect& preferredOriginalBounds =
1000- originalBounds.isRect () && !originalClip.isEmpty () ? originalClip
1001- : originalBounds;
1002-
10031004 SkRRect outlineRect = preferredOriginalBounds;
10041005 outlineRect.outset (layer.borderSettings .strokeWidth , layer.borderSettings .strokeWidth );
10051006
@@ -1010,6 +1011,21 @@ void SkiaRenderEngine::drawLayersInternal(
10101011 canvas->drawDRRect (outlineRect, preferredOriginalBounds, paint);
10111012 }
10121013
1014+ if (!layer.boxShadowSettings .boxShadows .empty ()) {
1015+ for (const gui::BoxShadowSettings::BoxShadowParams& box :
1016+ layer.boxShadowSettings .boxShadows ) {
1017+ SkRRect boxRect = preferredOriginalBounds;
1018+ boxRect.outset (box.spreadRadius , box.spreadRadius );
1019+ boxRect.offset (box.offsetX , box.offsetY );
1020+ float sigma = convertBlurUserRadiusToSigma (box.blurRadius );
1021+ SkPaint blur;
1022+ blur.setAntiAlias (true );
1023+ blur.setColor (box.color );
1024+ blur.setMaskFilter (SkMaskFilter::MakeBlur (kNormal_SkBlurStyle , sigma, false ));
1025+ canvas->drawRRect (boxRect, blur);
1026+ }
1027+ }
1028+
10131029 const float layerDimmingRatio = layer.whitePointNits <= 0 .f
10141030 ? displayDimmingRatio
10151031 : (layer.whitePointNits / maxLayerWhitePoint) * displayDimmingRatio;
0 commit comments