Correctly mark layers dirty when drawing WebView.

Change-Id: I7ae0c3cfa0916d8fbeaf01e8da127c621a06a0f4
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 5c06151..7ecf281 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -2447,21 +2447,26 @@
                 }
                 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 @@
                 int transX = 0;
                 int transY = 0;
 
-                if (cache == null && !hasDisplayList) {
+                if (offsetForScroll) {
                     transX = -sx;
                     transY = -sy;
                 }
@@ -2532,7 +2537,7 @@
         }
 
         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 48b3d6e..361815a 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -213,6 +213,17 @@
     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;