Fix rendering bug with saveLayerAlpha/drawColor.

drawColor() was not calling quickReject because it fills the clip region
and thus always passes the test. However, quickReject also checks whether
the current layer is invisible. drawColor() now performs the same check
and avoid drawing inside an invisible layer.

Change-Id: I63d0e9a8a9c0fba774f0f5c3870d58e6ed96fbd1
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index 855a4e0..09e01f6 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -260,25 +260,25 @@
     const GLuint previousFbo = mSnapshot->fbo;
     const int count = saveSnapshot(flags);
 
-    int alpha = 255;
-    SkXfermode::Mode mode;
+    if (!mSnapshot->invisible) {
+        int alpha = 255;
+        SkXfermode::Mode mode;
 
-    if (p) {
-        alpha = p->getAlpha();
-        if (!mCaches.extensions.hasFramebufferFetch()) {
-            const bool isMode = SkXfermode::IsMode(p->getXfermode(), &mode);
-            if (!isMode) {
-                // Assume SRC_OVER
-                mode = SkXfermode::kSrcOver_Mode;
+        if (p) {
+            alpha = p->getAlpha();
+            if (!mCaches.extensions.hasFramebufferFetch()) {
+                const bool isMode = SkXfermode::IsMode(p->getXfermode(), &mode);
+                if (!isMode) {
+                    // Assume SRC_OVER
+                    mode = SkXfermode::kSrcOver_Mode;
+                }
+            } else {
+                mode = getXfermode(p->getXfermode());
             }
         } else {
-            mode = getXfermode(p->getXfermode());
+            mode = SkXfermode::kSrcOver_Mode;
         }
-    } else {
-        mode = SkXfermode::kSrcOver_Mode;
-    }
 
-    if (!mSnapshot->previous->invisible) {
         createLayer(mSnapshot, left, top, right, bottom, alpha, mode, flags, previousFbo);
     }
 
@@ -379,8 +379,7 @@
             bounds.getHeight() > mCaches.maxTextureSize) {
         snapshot->invisible = true;
     } else {
-        snapshot->invisible = snapshot->previous->invisible ||
-                (alpha <= ALPHA_THRESHOLD && fboLayer);
+        snapshot->invisible = snapshot->invisible || (alpha <= ALPHA_THRESHOLD && fboLayer);
     }
 
     // Bail out if we won't draw in this snapshot
@@ -1011,6 +1010,9 @@
 }
 
 void OpenGLRenderer::drawColor(int color, SkXfermode::Mode mode) {
+    // No need to check against the clip, we fill the clip region
+    if (mSnapshot->invisible) return;
+
     Rect& clip(*mSnapshot->clipRect);
     clip.snapToPixelBoundaries();
     drawColorRect(clip.left, clip.top, clip.right, clip.bottom, color, mode, true);