Disable shadow drawing for empty/null outlines

Change-Id: I60d0f326cfab97d88c49d17cf32e619b5e60b94a
diff --git a/libs/hwui/DisplayListOp.h b/libs/hwui/DisplayListOp.h
index f1d70eb..e4867220 100644
--- a/libs/hwui/DisplayListOp.h
+++ b/libs/hwui/DisplayListOp.h
@@ -1547,32 +1547,23 @@
 public:
     DrawShadowOp(const mat4& transformXY, const mat4& transformZ,
             float casterAlpha, bool casterUnclipped,
-            float fallbackWidth, float fallbackHeight,
-            const SkPath* outline, const SkPath* revealClip)
+            const SkPath* casterOutline, const SkPath* revealClip)
             : DrawOp(NULL), mTransformXY(transformXY), mTransformZ(transformZ),
-            mCasterAlpha(casterAlpha), mCasterUnclipped(casterUnclipped),
-            mFallbackWidth(fallbackWidth), mFallbackHeight(fallbackHeight),
-            mOutline(outline), mRevealClip(revealClip) {}
+            mCasterAlpha(casterAlpha), mCasterUnclipped(casterUnclipped) {
+        mOutline = *casterOutline;
+        if (revealClip) {
+            // intersect the outline with the convex reveal clip
+            Op(mOutline, *revealClip, kIntersect_PathOp, &mOutline);
+        }
+    }
 
     virtual status_t applyDraw(OpenGLRenderer& renderer, Rect& dirty) {
-        SkPath casterPerimeter;
-        if (!mOutline || mOutline->isEmpty()) {
-            casterPerimeter.addRect(0, 0, mFallbackWidth, mFallbackHeight);
-        } else {
-            casterPerimeter = *mOutline;
-        }
-
-        if (mRevealClip) {
-            // intersect the outline with the convex reveal clip
-            Op(casterPerimeter, *mRevealClip, kIntersect_PathOp, &casterPerimeter);
-        }
-
         return renderer.drawShadow(mTransformXY, mTransformZ,
-                mCasterAlpha, mCasterUnclipped, &casterPerimeter);
+                mCasterAlpha, mCasterUnclipped, &mOutline);
     }
 
     virtual void output(int level, uint32_t logFlags) const {
-        OP_LOG("DrawShadow of outline %p", mOutline);
+        OP_LOGS("DrawShadow");
     }
 
     virtual const char* name() { return "DrawShadow"; }
@@ -1582,12 +1573,7 @@
     const mat4 mTransformZ;
     const float mCasterAlpha;
     const bool mCasterUnclipped;
-    const float mFallbackWidth;
-    const float mFallbackHeight;
-
-    // these point at convex SkPaths owned by RenderProperties, or null
-    const SkPath* mOutline;
-    const SkPath* mRevealClip;
+    SkPath mOutline;
 };
 
 class DrawLayerOp : public DrawOp {
diff --git a/libs/hwui/Outline.h b/libs/hwui/Outline.h
index 5c24335..5e7f899 100644
--- a/libs/hwui/Outline.h
+++ b/libs/hwui/Outline.h
@@ -49,6 +49,10 @@
         mBounds.set(outline->getBounds());
     }
 
+    bool isEmpty() const {
+        return mType == kOutlineType_None;
+    }
+
     void setEmpty() {
         mType = kOutlineType_None;
         mPath.reset();
diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp
index f0645a9..df74f31 100644
--- a/libs/hwui/RenderNode.cpp
+++ b/libs/hwui/RenderNode.cpp
@@ -473,7 +473,7 @@
 
 template <class T>
 void RenderNode::issueDrawShadowOperation(const Matrix4& transformFromParent, T& handler) {
-    if (properties().getAlpha() <= 0.0f) return;
+    if (properties().getAlpha() <= 0.0f || properties().getOutline().isEmpty()) return;
 
     mat4 shadowMatrixXY(transformFromParent);
     applyViewPropertyTransforms(shadowMatrixXY);
@@ -487,6 +487,8 @@
     const SkPath* revealClipPath = revealClip.hasConvexClip()
             ?  revealClip.getPath() : NULL; // only pass the reveal clip's path if it's convex
 
+    if (revealClipPath && revealClipPath->isEmpty()) return;
+
     /**
      * The drawing area of the caster is always the same as the its perimeter (which
      * the shadow system uses) *except* in the inverse clip case. Inform the shadow
@@ -498,7 +500,6 @@
     DisplayListOp* shadowOp  = new (handler.allocator()) DrawShadowOp(
             shadowMatrixXY, shadowMatrixZ,
             properties().getAlpha(), casterUnclipped,
-            properties().getWidth(), properties().getHeight(),
             outlinePath, revealClipPath);
     handler(shadowOp, PROPERTY_SAVECOUNT, properties().getClipToBounds());
 }