diff options
-rw-r--r-- | core/java/android/view/ViewGroup.java | 25 | ||||
-rw-r--r-- | libs/hwui/OpenGLRenderer.cpp | 11 |
2 files changed, 26 insertions, 10 deletions
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 5c06151c0dbc..7ecf28114eb1 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -2447,21 +2447,26 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } cache = child.getDrawingCache(true); } else { - if (layerType == LAYER_TYPE_SOFTWARE) { - child.buildDrawingCache(true); - cache = child.getDrawingCache(true); - } else if (layerType == LAYER_TYPE_NONE) { - // Delay getting the display list until animation-driven alpha values are - // set up and possibly passed on to the view - hasDisplayList = child.canHaveDisplayList(); + switch (layerType) { + case LAYER_TYPE_SOFTWARE: + child.buildDrawingCache(true); + cache = child.getDrawingCache(true); + break; + case LAYER_TYPE_NONE: + // Delay getting the display list until animation-driven alpha values are + // set up and possibly passed on to the view + hasDisplayList = child.canHaveDisplayList(); + break; } } } final boolean hasNoCache = cache == null || hasDisplayList; + final boolean offsetForScroll = cache == null && !hasDisplayList && + layerType != LAYER_TYPE_HARDWARE; final int restoreTo = canvas.save(); - if (cache == null && !hasDisplayList) { + if (offsetForScroll) { canvas.translate(cl - sx, ct - sy); } else { canvas.translate(cl, ct); @@ -2477,7 +2482,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager int transX = 0; int transY = 0; - if (cache == null && !hasDisplayList) { + if (offsetForScroll) { transX = -sx; transY = -sy; } @@ -2532,7 +2537,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } if ((flags & FLAG_CLIP_CHILDREN) == FLAG_CLIP_CHILDREN) { - if (cache == null && !hasDisplayList) { + if (offsetForScroll) { canvas.clipRect(sx, sy, sx + (cr - cl), sy + (cb - ct)); } else { if (!scalingRequired || cache == null) { diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 48b3d6ea6c75..361815a07ab3 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -213,6 +213,17 @@ bool OpenGLRenderer::callDrawGLFunction(Functor *functor) { if (mDirtyClip) { setScissorFromClip(); } + +#if RENDER_LAYERS_AS_REGIONS + // Since we don't know what the functor will draw, let's dirty + // tne entire clip region + if (hasLayer()) { + Rect clip(*mSnapshot->clipRect); + clip.snapToPixelBoundaries(); + dirtyLayerUnchecked(clip, getRegion()); + } +#endif + status_t result = (*functor)(); resume(); return (result == 0) ? false : true; |