summaryrefslogtreecommitdiff
path: root/libs/hwui/pipeline/skia/ReorderBarrierDrawables.cpp
diff options
context:
space:
mode:
authorJim Van Verth <jvanverth@google.com>2017-04-12 14:08:46 -0400
committerJim Van Verth <jvanverth@google.com>2017-04-13 13:15:12 +0000
commit5745a0a37fa8b09e6ce538ab8ef58684cc00604e (patch)
tree2cacf861d62d79b9604a802d1b8936a4cce68bd2 /libs/hwui/pipeline/skia/ReorderBarrierDrawables.cpp
parent7ecd40c1fca96db6289aff0fea37573b843ee336 (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.cpp25
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