OSDN Git Service

Fix missing recents screenshots
authorMathias Agopian <mathias@google.com>
Tue, 12 Mar 2013 03:47:24 +0000 (20:47 -0700)
committerMathias Agopian <mathias@google.com>
Tue, 12 Mar 2013 03:47:24 +0000 (20:47 -0700)
We were using the "visible layer list" when taking screenshots,
which doesn't work when a layer is behind other opaque layers
and therefore hidden.

We fix this by using the full layer list, filtered by the
layerstack of the display we're looking at.

Bug: 7552304
Change-Id: I4b6f77e5511aea94f8d218975b6e22738e7e5d5b

services/surfaceflinger/SurfaceFlinger.cpp

index 5939dc8..184f47e 100644 (file)
@@ -2708,15 +2708,17 @@ status_t SurfaceFlinger::captureScreenImplLocked(
     glClearColor(0,0,0,1);
     glClear(GL_COLOR_BUFFER_BIT);
 
-    const Vector< sp<Layer> >& layers(hw->getVisibleLayersSortedByZ());
+    const LayerVector& layers( mDrawingState.layersSortedByZ );
     const size_t count = layers.size();
     for (size_t i=0 ; i<count ; ++i) {
         const sp<Layer>& layer(layers[i]);
-        const uint32_t z = layer->drawingState().z;
-        if (z >= minLayerZ && z <= maxLayerZ) {
-            if (filtering) layer->setFiltering(true);
-            layer->draw(hw);
-            if (filtering) layer->setFiltering(false);
+        const Layer::State& state(layer->drawingState());
+        if (state.layerStack == hw->getLayerStack()) {
+            if (state.z >= minLayerZ && state.z <= maxLayerZ) {
+                if (filtering) layer->setFiltering(true);
+                layer->draw(hw);
+                if (filtering) layer->setFiltering(false);
+            }
         }
     }