summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Mathias Agopian <mathias@google.com> 2010-06-01 16:00:07 -0700
committer Android (Google) Code Review <android-gerrit@google.com> 2010-06-01 16:00:07 -0700
commit5be7de5f62f3a274feddd1e91d55f5f174a4084c (patch)
treeab111ea400c82779cba07683860c3926006a7be0
parent1b9dcb7b8e97a4c6ffc6963313b386b89598d608 (diff)
parenta0612e41dd5e6e9ec0a89e8e7437a3dafec0ee10 (diff)
Merge "fix a bug where fading in/out of opaque 32-bits windows wasn't working" into kraken
-rw-r--r--libs/surfaceflinger/LayerBase.cpp26
-rw-r--r--libs/ui/GraphicBuffer.cpp15
2 files changed, 19 insertions, 22 deletions
diff --git a/libs/surfaceflinger/LayerBase.cpp b/libs/surfaceflinger/LayerBase.cpp
index 76733a9d8c35..7ab74b42765d 100644
--- a/libs/surfaceflinger/LayerBase.cpp
+++ b/libs/surfaceflinger/LayerBase.cpp
@@ -379,33 +379,21 @@ void LayerBase::drawWithOpenGL(const Region& clip, const Texture& texture) const
glEnable(GL_TEXTURE_2D);
+ GLenum src = mPremultipliedAlpha ? GL_ONE : GL_SRC_ALPHA;
if (UNLIKELY(s.alpha < 0xFF)) {
- // We have an alpha-modulation. We need to modulate all
- // texture components by alpha because we're always using
- // premultiplied alpha.
-
- // If the texture doesn't have an alpha channel we can
- // use REPLACE and switch to non premultiplied alpha
- // blending (SRCA/ONE_MINUS_SRCA).
-
- GLenum env, src;
- if (needsBlending()) {
- env = GL_MODULATE;
- src = mPremultipliedAlpha ? GL_ONE : GL_SRC_ALPHA;
+ const GLfloat alpha = s.alpha * (1.0f/255.0f);
+ if (mPremultipliedAlpha) {
+ glColor4f(alpha, alpha, alpha, alpha);
} else {
- env = GL_REPLACE;
- src = GL_SRC_ALPHA;
+ glColor4f(1, 1, 1, alpha);
}
- const GLfloat alpha = s.alpha * (1.0f/255.0f);
- glColor4f(alpha, alpha, alpha, alpha);
glEnable(GL_BLEND);
glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA);
- glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, env);
+ glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
} else {
- glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glColor4f(1, 1, 1, 1);
+ glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
if (needsBlending()) {
- GLenum src = mPremultipliedAlpha ? GL_ONE : GL_SRC_ALPHA;
glEnable(GL_BLEND);
glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA);
} else {
diff --git a/libs/ui/GraphicBuffer.cpp b/libs/ui/GraphicBuffer.cpp
index ba1fd9c9dcfe..35e4af34dc75 100644
--- a/libs/ui/GraphicBuffer.cpp
+++ b/libs/ui/GraphicBuffer.cpp
@@ -122,11 +122,20 @@ status_t GraphicBuffer::reallocate(uint32_t w, uint32_t h, PixelFormat f,
status_t GraphicBuffer::initSize(uint32_t w, uint32_t h, PixelFormat format,
uint32_t reqUsage)
{
- if (format == PIXEL_FORMAT_RGBX_8888)
- format = PIXEL_FORMAT_RGBA_8888;
-
GraphicBufferAllocator& allocator = GraphicBufferAllocator::get();
status_t err = allocator.alloc(w, h, format, reqUsage, &handle, &stride);
+
+ if (err<0 && format == PIXEL_FORMAT_RGBX_8888) {
+ /*
+ * There is currently a bug with some gralloc implementations
+ * not supporting RGBX_8888. In this case, we revert to using RGBA_8888
+ * which is not exactly the same, as GL_REPLACE will yield a different
+ * result.
+ */
+ format = PIXEL_FORMAT_RGBA_8888;
+ err = allocator.alloc(w, h, format, reqUsage, &handle, &stride);
+ }
+
if (err == NO_ERROR) {
this->width = w;
this->height = h;