diff options
author | Mathias Agopian <mathias@google.com> | 2013-05-10 18:01:12 -0700 |
---|---|---|
committer | Mathias Agopian <mathias@google.com> | 2013-05-10 18:35:43 -0700 |
commit | f3e85d432749ca77ad707bec523b67d741d43e6e (patch) | |
tree | 4955c1f1bb5c9600b2c276c26b82efac7ddc776a /services | |
parent | 6c7f25afb75ac155bad0b3bc17c0089d0337d060 (diff) | |
download | frameworks_native-f3e85d432749ca77ad707bec523b67d741d43e6e.tar.gz frameworks_native-f3e85d432749ca77ad707bec523b67d741d43e6e.tar.bz2 frameworks_native-f3e85d432749ca77ad707bec523b67d741d43e6e.zip |
take the "transparent region" into account for blending
until now it was only used to discard a layer entirely.
we're now reducing the size of the layer if it is still
visible, if possible.
this works for instance when a surfaceView is used and
only the menu bar is displayed over it.
Change-Id: I3f5527c5cd1e69ecc968272c8948f1513ada8c55
Diffstat (limited to 'services')
-rw-r--r-- | services/surfaceflinger/Layer.cpp | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 07f9b8b98..c15dfd538 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -270,6 +270,16 @@ uint32_t Layer::getContentTransform() const { return mCurrentTransform; } +static Rect reduce(const Rect& win, const Region& exclude) { + if (CC_LIKELY(exclude.isEmpty())) { + return win; + } + if (exclude.isRect()) { + return win.reduce(exclude.getBounds()); + } + return Region(win).subtract(exclude).getBounds(); +} + Rect Layer::computeBounds() const { const Layer::State& s(drawingState()); Rect win(s.active.w, s.active.h); @@ -277,8 +287,7 @@ Rect Layer::computeBounds() const { win.intersect(s.active.crop, &win); } // subtract the transparent region and snap to the bounds - win = Region(win).subtract(s.activeTransparentRegion).getBounds(); - return win; + return reduce(win, s.activeTransparentRegion); } Rect Layer::computeCrop(const sp<const DisplayDevice>& hw) const { @@ -312,6 +321,9 @@ Rect Layer::computeCrop(const sp<const DisplayDevice>& hw) const { // window's bounds activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop); + // subtract the transparent region and snap to the bounds + activeCrop = reduce(activeCrop, s.activeTransparentRegion); + if (!activeCrop.isEmpty()) { // Transform the window crop to match the buffer coordinate system, // which means using the inverse of the current transform set on the @@ -669,7 +681,7 @@ void Layer::computeGeometry(const sp<const DisplayDevice>& hw, LayerMesh* mesh) win.intersect(s.active.crop, &win); } // subtract the transparent region and snap to the bounds - win = Region(win).subtract(s.activeTransparentRegion).getBounds(); + win = reduce(win, s.activeTransparentRegion); if (mesh) { tr.transform(mesh->mVertices[0], win.left, win.top); tr.transform(mesh->mVertices[1], win.left, win.bottom); |