summaryrefslogtreecommitdiffstats
path: root/libs/hwui
diff options
context:
space:
mode:
authorRomain Guy <romainguy@google.com>2011-01-06 10:04:23 -0800
committerRomain Guy <romainguy@google.com>2011-01-06 18:34:30 -0800
commit171c592f0b7066acf279863c8a52ddabea49d3db (patch)
treeeebf9a8c82c6a6d9db6edbf077b9299a96ae36e4 /libs/hwui
parentf0fe6d311d183c5fcf45d5e3e995fc8f9ed12f8b (diff)
downloadframeworks_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.h6
-rw-r--r--libs/hwui/LayerCache.cpp1
-rw-r--r--libs/hwui/OpenGLRenderer.cpp8
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);