Merge "Clip outline to View clip bounds for shadow computation" into lmp-mr1-dev
diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp
index bbba2dd..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;
     }