diff options
Diffstat (limited to 'libs/hwui/OpenGLRenderer.cpp')
-rw-r--r-- | libs/hwui/OpenGLRenderer.cpp | 36 |
1 files changed, 19 insertions, 17 deletions
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 @@ int OpenGLRenderer::saveLayer(float left, float top, float right, float bottom, const GLuint previousFbo = mSnapshot->fbo; const int count = saveSnapshot(flags); - 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 (!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; + } + } 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 @@ bool OpenGLRenderer::createLayer(sp<Snapshot> snapshot, float left, float top, 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::drawLines(float* points, int count, SkPaint* paint) { } 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); |