diff options
author | Jesse Hall <jessehall@google.com> | 2012-10-11 15:06:07 -0700 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2012-10-11 15:06:07 -0700 |
commit | e3a669656ae891a510ccbd73d26559a20f5f466b (patch) | |
tree | 96cafcc67e50b5e35ba7f6d8fd18305753bf836e | |
parent | f29b86b26aad5f50c2cae829bcce55fbb9fd8f8b (diff) | |
parent | 0de75f3f53ad2e3eb4c6820446c5175191b6631a (diff) | |
download | native-e3a669656ae891a510ccbd73d26559a20f5f466b.tar.gz |
Merge "Stop using transparent region for computing visible regions (DO NOT MERGE)"
-rw-r--r-- | services/surfaceflinger/LayerBase.cpp | 6 | ||||
-rw-r--r-- | services/surfaceflinger/LayerBase.h | 10 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 16 |
3 files changed, 29 insertions, 3 deletions
diff --git a/services/surfaceflinger/LayerBase.cpp b/services/surfaceflinger/LayerBase.cpp index 16bac8f79c..a4da92f2c4 100644 --- a/services/surfaceflinger/LayerBase.cpp +++ b/services/surfaceflinger/LayerBase.cpp @@ -196,6 +196,12 @@ void LayerBase::setCoveredRegion(const Region& coveredRegion) { coveredRegionScreen = coveredRegion; } +void LayerBase::setVisibleNonTransparentRegion(const Region& + visibleNonTransparentRegion) { + // always called from main thread + this->visibleNonTransparentRegion = visibleNonTransparentRegion; +} + uint32_t LayerBase::doTransaction(uint32_t flags) { const Layer::State& front(drawingState()); diff --git a/services/surfaceflinger/LayerBase.h b/services/surfaceflinger/LayerBase.h index c547a40725..94d074abf7 100644 --- a/services/surfaceflinger/LayerBase.h +++ b/services/surfaceflinger/LayerBase.h @@ -63,6 +63,7 @@ public: Region visibleRegionScreen; Region transparentRegionScreen; Region coveredRegionScreen; + Region visibleNonTransparentRegion; int32_t sequence; struct Geometry { @@ -98,7 +99,7 @@ public: bool setSize(uint32_t w, uint32_t h); bool setAlpha(uint8_t alpha); bool setMatrix(const layer_state_t::matrix22_t& matrix); - bool setTransparentRegionHint(const Region& opaque); + bool setTransparentRegionHint(const Region& transparent); bool setFlags(uint8_t flags, uint8_t mask); bool setCrop(const Rect& crop); @@ -159,6 +160,13 @@ public: virtual void setCoveredRegion(const Region& coveredRegion); /** + * setVisibleNonTransparentRegion - called when the visible and + * non-transparent region changes. + */ + virtual void setVisibleNonTransparentRegion(const Region& + visibleNonTransparentRegion); + + /** * validateVisibility - cache a bunch of things */ virtual void validateVisibility(const Transform& globalTransform); diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 51fcce43e6..859db58bcb 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -620,6 +620,16 @@ void SurfaceFlinger::computeVisibleRegions( */ Region coveredRegion; + /* + * transparentRegion: area of a surface that is hinted to be completely + * transparent. This is only used to tell when the layer has no visible + * non-transparent regions and can be removed from the layer list. It + * does not affect the visibleRegion of this layer or any layers + * beneath it. The hint may not be correct if apps don't respect the + * SurfaceView restrictions (which, sadly, some don't). + */ + Region transparentRegion; + // handle hidden surfaces by setting the visible region to empty if (CC_LIKELY(!(s.flags & ISurfaceComposer::eLayerHidden) && s.alpha)) { @@ -630,7 +640,7 @@ void SurfaceFlinger::computeVisibleRegions( if (!visibleRegion.isEmpty()) { // Remove the transparent area from the visible region if (translucent) { - visibleRegion.subtractSelf(layer->transparentRegionScreen); + transparentRegion = layer->transparentRegionScreen; } // compute the opaque region @@ -689,6 +699,8 @@ void SurfaceFlinger::computeVisibleRegions( // Store the visible region is screen space layer->setVisibleRegion(visibleRegion); layer->setCoveredRegion(coveredRegion); + layer->setVisibleNonTransparentRegion( + visibleRegion.subtract(transparentRegion)); // If a secure layer is partially visible, lock-down the screen! if (layer->isSecure() && !visibleRegion.isEmpty()) { @@ -740,7 +752,7 @@ void SurfaceFlinger::handlePageFlip() mVisibleLayersSortedByZ.clear(); mVisibleLayersSortedByZ.setCapacity(count); for (size_t i=0 ; i<count ; i++) { - if (!currentLayers[i]->visibleRegionScreen.isEmpty()) + if (!currentLayers[i]->visibleNonTransparentRegion.isEmpty()) mVisibleLayersSortedByZ.add(currentLayers[i]); } |