summaryrefslogtreecommitdiffstats
path: root/libs/hwui
diff options
context:
space:
mode:
authorRomain Guy <romainguy@android.com>2010-10-22 17:49:18 -0700
committerRomain Guy <romainguy@android.com>2010-10-22 17:49:18 -0700
commitae88e5e8e9cb6c9539314c4360c5b20f8ec1fefc (patch)
tree451798ed04880220134161c51b1f417fb8450797 /libs/hwui
parent58ae6db4ff8a9d0910e1183ee8be9a038a2712a6 (diff)
downloadframeworks_base-ae88e5e8e9cb6c9539314c4360c5b20f8ec1fefc.zip
frameworks_base-ae88e5e8e9cb6c9539314c4360c5b20f8ec1fefc.tar.gz
frameworks_base-ae88e5e8e9cb6c9539314c4360c5b20f8ec1fefc.tar.bz2
Fix rendering issue with layers.
A change was made earlier in the renderer to not snap the current clip rect on every clip operation. The clip rect must not be snapped to pixel boundaries before being used for pixel precision operations. Some operations were doing this correctly, others were not. For instance, a layer was always created by rounding to the correct pixels, but composing a layer was done with a non rounded clip, thus resulting in slightly odd behaviors. Change-Id: I31c2cf0a343450470bcd449c3f13fe37648b9c7c
Diffstat (limited to 'libs/hwui')
-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 {