summaryrefslogtreecommitdiffstats
path: root/libs
diff options
context:
space:
mode:
authorRomain Guy <romainguy@android.com>2010-10-23 23:10:35 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2010-10-23 23:10:35 -0700
commit9c937f3687968e1a07f2e061fca1ad64fa106c04 (patch)
tree4903e88f50bdd965b557650651af49781f2ac8d3 /libs
parent0175e01f54670d0133d131222826f7033e2e2c03 (diff)
parentae88e5e8e9cb6c9539314c4360c5b20f8ec1fefc (diff)
downloadframeworks_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.cpp34
-rw-r--r--libs/hwui/Rect.h8
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 {