From beff8d83ef062975459f149ad0c632a3797d78ce Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Tue, 1 Feb 2011 23:53:34 -0800 Subject: [PATCH] Fix incorrect dirty rectangle transformation in hardware layers. Bug #3413433 Change-Id: Iba201c7c4b4f11937797f3afcbf20c5a7395be25 --- core/java/android/view/ViewGroup.java | 14 +++++++------- libs/hwui/LayerRenderer.cpp | 1 + 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 5d5a09a484d2d..09e1d89bb8a2c 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -3537,6 +3537,12 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager // 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; @@ -3550,12 +3556,6 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager (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) { @@ -3639,7 +3639,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager if (mLayerType != LAYER_TYPE_NONE) { mLocalDirtyRect.union(dirty); } - + return mParent; } } else { diff --git a/libs/hwui/LayerRenderer.cpp b/libs/hwui/LayerRenderer.cpp index aebd2b7c696db..7379b639eed17 100644 --- a/libs/hwui/LayerRenderer.cpp +++ b/libs/hwui/LayerRenderer.cpp @@ -39,6 +39,7 @@ void LayerRenderer::prepareDirty(float left, float top, float right, float botto 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); }