diff options
author | Romain Guy <romainguy@android.com> | 2010-10-23 23:10:35 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2010-10-23 23:10:35 -0700 |
commit | 9c937f3687968e1a07f2e061fca1ad64fa106c04 (patch) | |
tree | 4903e88f50bdd965b557650651af49781f2ac8d3 /libs | |
parent | 0175e01f54670d0133d131222826f7033e2e2c03 (diff) | |
parent | ae88e5e8e9cb6c9539314c4360c5b20f8ec1fefc (diff) | |
download | frameworks_base-9c937f3687968e1a07f2e061fca1ad64fa106c04.zip frameworks_base-9c937f3687968e1a07f2e061fca1ad64fa106c04.tar.gz frameworks_base-9c937f3687968e1a07f2e061fca1ad64fa106c04.tar.bz2 |
Merge "Fix rendering issue with layers."
Diffstat (limited to 'libs')
-rw-r--r-- | libs/hwui/OpenGLRenderer.cpp | 34 | ||||
-rw-r--r-- | libs/hwui/Rect.h | 8 |
2 files changed, 24 insertions, 18 deletions
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index faad297..7495a06 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -353,19 +353,22 @@ bool OpenGLRenderer::createLayer(sp<Snapshot> snapshot, float left, float top, // Window coordinates of the layer Rect bounds(left, top, right, bottom); - if (!fboLayer) { + if (fboLayer) { + // Clear the previous layer regions before we change the viewport + clearLayerRegions(); + } else { mSnapshot->transform->mapRect(bounds); // Layers only make sense if they are in the framebuffer's bounds bounds.intersect(*snapshot->clipRect); + // We cannot work with sub-pixels in this case + bounds.snapToPixelBoundaries(); + // When the layer is not an FBO, we may use glCopyTexImage so we // need to make sure the layer does not extend outside the bounds // of the framebuffer bounds.intersect(snapshot->previous->viewport); - - // We cannot work with sub-pixels in this case - bounds.snapToPixelBoundaries(); } if (bounds.isEmpty() || bounds.getWidth() > mMaxTextureSize || @@ -454,14 +457,14 @@ bool OpenGLRenderer::createLayer(sp<Snapshot> snapshot, float left, float top, // Copy the framebuffer into the layer glBindTexture(GL_TEXTURE_2D, layer->texture); - if (layer->empty) { - glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bounds.left, mHeight - bounds.bottom, - layer->width, layer->height, 0); - layer->empty = false; - } else { - glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, bounds.left, mHeight - bounds.bottom, - bounds.getWidth(), bounds.getHeight()); - } + 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)); @@ -487,7 +490,8 @@ void OpenGLRenderer::composeLayer(sp<Snapshot> current, sp<Snapshot> previous) { } // Restore the clip from the previous snapshot - const Rect& clip = *previous->clipRect; + Rect& clip(*previous->clipRect); + clip.snapToPixelBoundaries(); glScissor(clip.left, previous->height - clip.bottom, clip.getWidth(), clip.getHeight()); Layer* layer = current->layer; @@ -795,7 +799,8 @@ void OpenGLRenderer::drawLines(float* points, int count, SkPaint* paint) { } void OpenGLRenderer::drawColor(int color, SkXfermode::Mode mode) { - const Rect& clip = *mSnapshot->clipRect; + Rect& clip(*mSnapshot->clipRect); + clip.snapToPixelBoundaries(); drawColorRect(clip.left, clip.top, clip.right, clip.bottom, color, mode, true); } @@ -863,6 +868,7 @@ void OpenGLRenderer::drawText(const char* text, int bytesCount, int count, paint->getTextSize()); Rect clipRect(*mSnapshot->clipRect); + clipRect.snapToPixelBoundaries(); glScissor(clipRect.left, mSnapshot->height - clipRect.bottom, clipRect.getWidth(), clipRect.getHeight()); diff --git a/libs/hwui/Rect.h b/libs/hwui/Rect.h index c571ea1..8f3655c 100644 --- a/libs/hwui/Rect.h +++ b/libs/hwui/Rect.h @@ -149,10 +149,10 @@ struct Rect { } void snapToPixelBoundaries() { - left = floorf(left); - top = floorf(top); - right = ceilf(right); - bottom = ceilf(bottom); + left = floorf(left + 0.5f); + top = floorf(top + 0.5f); + right = floorf(right + 0.5f); + bottom = floorf(bottom + 0.5f); } void dump() const { |