am 57188f0d: am c1f8bcff: Merge "Fix incorrect dirty rectangle transformation in hardware layers. Bug #3413433" into honeycomb

* commit '57188f0d1d7225991f8f5afb2740ed4cc878305b':
  Fix incorrect dirty rectangle transformation in hardware layers. Bug #3413433
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 522ac4c..6795b52 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -3550,6 +3550,12 @@
                 // Make sure we do not set both flags at the same time
                 int opaqueFlag = isOpaque ? DIRTY_OPAQUE : DIRTY;
 
+                if (child.mLayerType != LAYER_TYPE_NONE) {
+                    mPrivateFlags |= INVALIDATED;
+                    mPrivateFlags &= ~DRAWING_CACHE_VALID;
+                    child.mLocalDirtyRect.union(dirty);
+                }
+
                 final int[] location = attachInfo.mInvalidateChildLocation;
                 location[CHILD_LEFT_INDEX] = child.mLeft;
                 location[CHILD_TOP_INDEX] = child.mTop;
@@ -3563,12 +3569,6 @@
                             (int) (boundingRect.bottom + 0.5f));
                 }
 
-                if (child.mLayerType != LAYER_TYPE_NONE) {
-                    mPrivateFlags |= INVALIDATED;
-                    mPrivateFlags &= ~DRAWING_CACHE_VALID;
-                    child.mLocalDirtyRect.union(dirty);
-                }
-
                 do {
                     View view = null;
                     if (parent instanceof View) {
@@ -3652,7 +3652,7 @@
                     if (mLayerType != LAYER_TYPE_NONE) {
                         mLocalDirtyRect.union(dirty);
                     }
-                    
+
                     return mParent;
                 }
             } else {
diff --git a/libs/hwui/LayerRenderer.cpp b/libs/hwui/LayerRenderer.cpp
index aebd2b7..7379b63 100644
--- a/libs/hwui/LayerRenderer.cpp
+++ b/libs/hwui/LayerRenderer.cpp
@@ -39,6 +39,7 @@
         mLayer->region.clear();
         dirty.set(0.0f, 0.0f, mLayer->width, mLayer->height);
     } else {
+        dirty.intersect(0.0f, 0.0f, mLayer->width, mLayer->height);
         android::Rect r(dirty.left, dirty.top, dirty.right, dirty.bottom);
         mLayer->region.subtractSelf(r);
     }