Clip outline to View clip bounds for shadow computation
bug:18509823
This allows animations of View clipBounds (and other callers of
setClipBounds) to affect shadows, instead of leaving them floating.
Change-Id: I249fa4b371a170cb0c54001f5b0e0097e109b8b8
diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp
index bbba2dd8..810e487 100644
--- a/libs/hwui/RenderNode.cpp
+++ b/libs/hwui/RenderNode.cpp
@@ -680,13 +680,32 @@
float casterAlpha = properties().getAlpha() * properties().getOutline().getAlpha();
- const SkPath* outlinePath = casterOutlinePath;
- if (revealClipPath) {
- // if we can't simply use the caster's path directly, create a temporary one
- SkPath* frameAllocatedPath = handler.allocPathForFrame();
- // intersect the outline with the convex reveal clip
- Op(*casterOutlinePath, *revealClipPath, kIntersect_PathOp, frameAllocatedPath);
+ // holds temporary SkPath to store the result of intersections
+ SkPath* frameAllocatedPath = NULL;
+ const SkPath* outlinePath = casterOutlinePath;
+
+ // intersect the outline with the reveal clip, if present
+ if (revealClipPath) {
+ frameAllocatedPath = handler.allocPathForFrame();
+
+ Op(*outlinePath, *revealClipPath, kIntersect_PathOp, frameAllocatedPath);
+ outlinePath = frameAllocatedPath;
+ }
+
+ // intersect the outline with the clipBounds, if present
+ if (properties().getClippingFlags() & CLIP_TO_CLIP_BOUNDS) {
+ if (!frameAllocatedPath) {
+ frameAllocatedPath = handler.allocPathForFrame();
+ }
+
+ Rect clipBounds;
+ properties().getClippingRectForFlags(CLIP_TO_CLIP_BOUNDS, &clipBounds);
+ SkPath clipBoundsPath;
+ clipBoundsPath.addRect(clipBounds.left, clipBounds.top,
+ clipBounds.right, clipBounds.bottom);
+
+ Op(*outlinePath, clipBoundsPath, kIntersect_PathOp, frameAllocatedPath);
outlinePath = frameAllocatedPath;
}