diff options
| author | Romain Guy <romainguy@google.com> | 2011-01-06 10:04:23 -0800 |
|---|---|---|
| committer | Romain Guy <romainguy@google.com> | 2011-01-06 18:34:30 -0800 |
| commit | 171c592f0b7066acf279863c8a52ddabea49d3db (patch) | |
| tree | eebf9a8c82c6a6d9db6edbf077b9299a96ae36e4 /libs/hwui | |
| parent | f0fe6d311d183c5fcf45d5e3e995fc8f9ed12f8b (diff) | |
| download | frameworks_base-171c592f0b7066acf279863c8a52ddabea49d3db.zip frameworks_base-171c592f0b7066acf279863c8a52ddabea49d3db.tar.gz frameworks_base-171c592f0b7066acf279863c8a52ddabea49d3db.tar.bz2 | |
New layers API for Views.
This API can be used to back a view and its children with either a
software layer (bitmap) or hardware layer (FBO). Layers have
various usages, including color filtering and performance
improvements during animations.
Change-Id: Ifc3bea847918042730fc5a8c2d4206dd6c9420a3
Diffstat (limited to 'libs/hwui')
| -rw-r--r-- | libs/hwui/Layer.h | 6 | ||||
| -rw-r--r-- | libs/hwui/LayerCache.cpp | 1 | ||||
| -rw-r--r-- | libs/hwui/OpenGLRenderer.cpp | 8 |
3 files changed, 14 insertions, 1 deletions
diff --git a/libs/hwui/Layer.h b/libs/hwui/Layer.h index a780183..7d54d3b 100644 --- a/libs/hwui/Layer.h +++ b/libs/hwui/Layer.h @@ -26,6 +26,7 @@ #include <SkXfermode.h> #include "Rect.h" +#include "SkiaColorFilter.h" namespace android { namespace uirenderer { @@ -93,6 +94,11 @@ struct Layer { * have been drawn. */ Region region; + + /** + * Color filter used to draw this layer. Optional. + */ + SkiaColorFilter* colorFilter; }; // struct Layer }; // namespace uirenderer diff --git a/libs/hwui/LayerCache.cpp b/libs/hwui/LayerCache.cpp index 9ce0359..ec186a4 100644 --- a/libs/hwui/LayerCache.cpp +++ b/libs/hwui/LayerCache.cpp @@ -102,6 +102,7 @@ Layer* LayerCache::get(const uint32_t width, const uint32_t height) { layer->blend = true; layer->empty = true; layer->fbo = 0; + layer->colorFilter = NULL; glGenTextures(1, &layer->texture); glBindTexture(GL_TEXTURE_2D, layer->texture); diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index eec8d8c..9613c5f 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -406,6 +406,7 @@ bool OpenGLRenderer::createLayer(sp<Snapshot> snapshot, float left, float top, layer->layer.set(bounds); layer->texCoords.set(0.0f, bounds.getHeight() / float(layer->height), bounds.getWidth() / float(layer->width), 0.0f); + layer->colorFilter = mColorFilter; // Save the layer in the snapshot snapshot->flags |= Snapshot::kFlagIsLayer; @@ -459,7 +460,6 @@ bool OpenGLRenderer::createFboLayer(Layer* layer, Rect& bounds, sp<Snapshot> sna snapshot->flags |= Snapshot::kFlagIsFboLayer; snapshot->fbo = layer->fbo; snapshot->resetTransform(-bounds.left, -bounds.top, 0.0f); - //snapshot->resetClip(0.0f, 0.0f, bounds.getWidth(), bounds.getHeight()); snapshot->resetClip(clip.left, clip.top, clip.right, clip.bottom); snapshot->viewport.set(0.0f, 0.0f, bounds.getWidth(), bounds.getHeight()); snapshot->height = bounds.getHeight(); @@ -544,7 +544,13 @@ void OpenGLRenderer::composeLayer(sp<Snapshot> current, sp<Snapshot> previous) { // drawing only the dirty region if (fboLayer) { dirtyLayer(rect.left, rect.top, rect.right, rect.bottom, *previous->transform); + if (layer->colorFilter) { + setupColorFilter(layer->colorFilter); + } composeLayerRegion(layer, rect); + if (layer->colorFilter) { + resetColorFilter(); + } } else { dirtyLayer(rect.left, rect.top, rect.right, rect.bottom); composeLayerRect(layer, rect, true); |
