Handle Z in DA

 Bug: 15671775

Change-Id: I33c7a70e78ef523ffd03165fb6c39d8e04d04f1f
diff --git a/libs/hwui/DamageAccumulator.cpp b/libs/hwui/DamageAccumulator.cpp
index 1cb87f2..8277a9a 100644
--- a/libs/hwui/DamageAccumulator.cpp
+++ b/libs/hwui/DamageAccumulator.cpp
@@ -168,7 +168,7 @@
     const RenderProperties& props = frame->renderNode->properties();
 
     // Perform clipping
-    if (props.getClipToBounds() && !frame->pendingDirty.isEmpty()) {
+    if (props.getClipDamageToBounds() && !frame->pendingDirty.isEmpty()) {
         if (!frame->pendingDirty.intersect(0, 0, props.getWidth(), props.getHeight())) {
             frame->pendingDirty.setEmpty();
         }
diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp
index 378183a..fc51170 100644
--- a/libs/hwui/RenderNode.cpp
+++ b/libs/hwui/RenderNode.cpp
@@ -118,7 +118,7 @@
 
 void RenderNode::damageSelf(TreeInfo& info) {
     if (isRenderable() && properties().getAlpha() > 0) {
-        if (properties().getClipToBounds()) {
+        if (properties().getClipDamageToBounds()) {
             info.damageAccumulator->dirty(0, 0, properties().getWidth(), properties().getHeight());
         } else {
             // Hope this is big enough?
diff --git a/libs/hwui/RenderProperties.h b/libs/hwui/RenderProperties.h
index 8c6cc9e..eab929b 100644
--- a/libs/hwui/RenderProperties.h
+++ b/libs/hwui/RenderProperties.h
@@ -30,6 +30,7 @@
 #include "Rect.h"
 #include "RevealClip.h"
 #include "Outline.h"
+#include "utils/MathUtils.h"
 
 class SkBitmap;
 class SkColorFilter;
@@ -526,6 +527,15 @@
         return mLayerProperties;
     }
 
+    // Returns true if damage calculations should be clipped to bounds
+    // TODO: Figure out something better for getZ(), as children should still be
+    // clipped to this RP's bounds. But as we will damage -INT_MAX to INT_MAX
+    // for this RP's getZ() anyway, this can be optimized when we have a
+    // Z damage estimate instead of INT_MAX
+    bool getClipDamageToBounds() const {
+        return getClipToBounds() && (getZ() <= 0 || getOutline().isEmpty());
+    }
+
 private:
 
     // Rendering properties