diff options
author | Jim Van Verth <jvanverth@google.com> | 2017-04-12 14:08:46 -0400 |
---|---|---|
committer | Jim Van Verth <jvanverth@google.com> | 2017-04-13 13:15:12 +0000 |
commit | 5745a0a37fa8b09e6ce538ab8ef58684cc00604e (patch) | |
tree | 2cacf861d62d79b9604a802d1b8936a4cce68bd2 /libs/hwui/pipeline/skia/ReorderBarrierDrawables.cpp | |
parent | 7ecd40c1fca96db6289aff0fea37573b843ee336 (diff) |
Add uncached and perspective shadows to Skia renderer
Test: manual - looked at FrameworkShadow app
Bug: 37300468
Change-Id: I72d820479141db2d83363747d9f76abbaca70d98
Diffstat (limited to 'libs/hwui/pipeline/skia/ReorderBarrierDrawables.cpp')
-rw-r--r-- | libs/hwui/pipeline/skia/ReorderBarrierDrawables.cpp | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/libs/hwui/pipeline/skia/ReorderBarrierDrawables.cpp b/libs/hwui/pipeline/skia/ReorderBarrierDrawables.cpp index d26eb59a039a..68a08693249c 100644 --- a/libs/hwui/pipeline/skia/ReorderBarrierDrawables.cpp +++ b/libs/hwui/pipeline/skia/ReorderBarrierDrawables.cpp @@ -190,9 +190,32 @@ void EndReorderBarrierDrawable::drawShadow(SkCanvas* canvas, RenderNodeDrawable* } const Vector3 lightPos = SkiaPipeline::getLightCenter(); SkPoint3 skiaLightPos = SkPoint3::Make(lightPos.x, lightPos.y, lightPos.z); - SkShadowUtils::DrawShadow(canvas, *casterPath, casterZValue, skiaLightPos, + if (shadowMatrix.hasPerspective() || revealClipPath || clippedToBounds) { + std::function<SkScalar(SkScalar, SkScalar)> casterHeightFunc; + if (shadowMatrix.hasPerspective()) { + // get the matrix with the full 3D transform + mat4 zMatrix; + caster->getRenderNode()->applyViewPropertyTransforms(zMatrix, true); + SkScalar A = zMatrix[2]; + SkScalar B = zMatrix[6]; + SkScalar C = zMatrix[mat4::kTranslateZ]; + casterHeightFunc = [A, B, C](SkScalar x, SkScalar y) { + return A*x + B*y + C; // casterZValue already baked into C + }; + } else { + casterHeightFunc = [casterZValue] (SkScalar, SkScalar) { + return casterZValue; + }; + } + + SkShadowUtils::DrawUncachedShadow(canvas, *casterPath, casterHeightFunc, skiaLightPos, SkiaPipeline::getLightRadius(), ambientAlpha, spotAlpha, SK_ColorBLACK, casterAlpha < 1.0f ? SkShadowFlags::kTransparentOccluder_ShadowFlag : 0); + } else { + SkShadowUtils::DrawShadow(canvas, *casterPath, casterZValue, skiaLightPos, + SkiaPipeline::getLightRadius(), ambientAlpha, spotAlpha, SK_ColorBLACK, + casterAlpha < 1.0f ? SkShadowFlags::kTransparentOccluder_ShadowFlag : 0); + } } }; // namespace skiapipeline |