From 514fb18827186591d66973c2362c859b64b63556 Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Wed, 19 Jan 2011 14:38:29 -0800 Subject: [PATCH] Don't attempt to create empty layers. Bug #3369888 Change-Id: Ic17bbd1c04bbf760cb17d0eb9e6767fd6479948c --- core/java/android/view/GLES20Canvas.java | 18 ++++++++++----- libs/hwui/FontRenderer.cpp | 18 ++++++++++----- libs/hwui/OpenGLRenderer.cpp | 28 +++++++++++++----------- 3 files changed, 40 insertions(+), 24 deletions(-) diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/GLES20Canvas.java index 99b686e075d09..f4805544c541a 100644 --- a/core/java/android/view/GLES20Canvas.java +++ b/core/java/android/view/GLES20Canvas.java @@ -452,11 +452,14 @@ class GLES20Canvas extends HardwareCanvas { @Override public int saveLayer(float left, float top, float right, float bottom, Paint paint, int saveFlags) { - boolean hasColorFilter = paint != null && setupColorFilter(paint); - final int nativePaint = paint == null ? 0 : paint.mNativePaint; - int count = nSaveLayer(mRenderer, left, top, right, bottom, nativePaint, saveFlags); - if (hasColorFilter) nResetModifiers(mRenderer); - return count; + if (left < right && top < bottom) { + boolean hasColorFilter = paint != null && setupColorFilter(paint); + final int nativePaint = paint == null ? 0 : paint.mNativePaint; + int count = nSaveLayer(mRenderer, left, top, right, bottom, nativePaint, saveFlags); + if (hasColorFilter) nResetModifiers(mRenderer); + return count; + } + return save(saveFlags); } private native int nSaveLayer(int renderer, float left, float top, float right, float bottom, @@ -471,7 +474,10 @@ class GLES20Canvas extends HardwareCanvas { @Override public int saveLayerAlpha(float left, float top, float right, float bottom, int alpha, int saveFlags) { - return nSaveLayerAlpha(mRenderer, left, top, right, bottom, alpha, saveFlags); + if (left < right && top < bottom) { + return nSaveLayerAlpha(mRenderer, left, top, right, bottom, alpha, saveFlags); + } + return save(saveFlags); } private native int nSaveLayerAlpha(int renderer, float left, float top, float right, diff --git a/libs/hwui/FontRenderer.cpp b/libs/hwui/FontRenderer.cpp index c080501df338d..c43e40dfcedda 100644 --- a/libs/hwui/FontRenderer.cpp +++ b/libs/hwui/FontRenderer.cpp @@ -298,8 +298,10 @@ Font* Font::create(FontRenderer* state, uint32_t fontId, float fontSize, // FontRenderer /////////////////////////////////////////////////////////////////////////////// +static bool sLogFontRendererCreate = true; + FontRenderer::FontRenderer() { - LOGD("Creating FontRenderer"); + if (sLogFontRendererCreate) LOGD("Creating FontRenderer"); mGammaTable = NULL; mInitialized = false; @@ -317,18 +319,24 @@ FontRenderer::FontRenderer() { char property[PROPERTY_VALUE_MAX]; if (property_get(PROPERTY_TEXT_CACHE_WIDTH, property, NULL) > 0) { - LOGD(" Setting text cache width to %s pixels", property); + if (sLogFontRendererCreate) LOGD(" Setting text cache width to %s pixels", property); mCacheWidth = atoi(property); } else { - LOGD(" Using default text cache width of %i pixels", mCacheWidth); + if (sLogFontRendererCreate) { + LOGD(" Using default text cache width of %i pixels", mCacheWidth); + } } if (property_get(PROPERTY_TEXT_CACHE_HEIGHT, property, NULL) > 0) { - LOGD(" Setting text cache width to %s pixels", property); + if (sLogFontRendererCreate) LOGD(" Setting text cache width to %s pixels", property); mCacheHeight = atoi(property); } else { - LOGD(" Using default text cache height of %i pixels", mCacheHeight); + if (sLogFontRendererCreate) { + LOGD(" Using default text cache height of %i pixels", mCacheHeight); + } } + + sLogFontRendererCreate = false; } FontRenderer::~FontRenderer() { diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 2c50ac384d1c8..6477eb09f22a9 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -430,18 +430,18 @@ bool OpenGLRenderer::createLayer(sp snapshot, float left, float top, } else { // Copy the framebuffer into the layer glBindTexture(GL_TEXTURE_2D, layer->texture); - - if (layer->empty) { - glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bounds.left, - snapshot->height - bounds.bottom, layer->width, layer->height, 0); - layer->empty = false; - } else { - glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, bounds.left, - snapshot->height - bounds.bottom, bounds.getWidth(), bounds.getHeight()); + if (!bounds.isEmpty()) { + if (layer->empty) { + glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bounds.left, + snapshot->height - bounds.bottom, layer->width, layer->height, 0); + layer->empty = false; + } else { + glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, bounds.left, + snapshot->height - bounds.bottom, bounds.getWidth(), bounds.getHeight()); + } + // Enqueue the buffer coordinates to clear the corresponding region later + mLayers.push(new Rect(bounds)); } - - // Enqueue the buffer coordinates to clear the corresponding region later - mLayers.push(new Rect(bounds)); } return true; @@ -565,8 +565,10 @@ void OpenGLRenderer::composeLayer(sp current, sp previous) { resetColorFilter(); } } else { - dirtyLayer(rect.left, rect.top, rect.right, rect.bottom); - composeLayerRect(layer, rect, true); + if (!rect.isEmpty()) { + dirtyLayer(rect.left, rect.top, rect.right, rect.bottom); + composeLayerRect(layer, rect, true); + } } if (fboLayer) {