From 866455f07c21964af5c195709bc2081121965200 Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Tue, 2 Apr 2019 16:28:26 -0700 Subject: SurfaceFlinger: Add exclusion list for captureLayers. Among other use cases, WM needs to be able to omit the IME from Task Snapshots, even while it is on-screen. Bug: 126614127 Test: Transaction_test.cpp#CaptureLayerExclude,CaptureLayerExcludeTree Change-Id: I055d99106c9ce2ed90d64eca06961d88cbd5e2d4 --- services/surfaceflinger/SurfaceFlinger.cpp | 34 ++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) (limited to 'services/surfaceflinger/SurfaceFlinger.cpp') diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 5676c59834..fccd910795 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -5405,10 +5405,11 @@ status_t SurfaceFlinger::captureScreen(const sp& displayToken, useIdentityTransform); } -status_t SurfaceFlinger::captureLayers(const sp& layerHandleBinder, - sp* outBuffer, const Dataspace reqDataspace, - const ui::PixelFormat reqPixelFormat, const Rect& sourceCrop, - float frameScale, bool childrenOnly) { +status_t SurfaceFlinger::captureLayers( + const sp& layerHandleBinder, sp* outBuffer, + const Dataspace reqDataspace, const ui::PixelFormat reqPixelFormat, const Rect& sourceCrop, + const std::unordered_set, ISurfaceComposer::SpHash>& excludeHandles, + float frameScale, bool childrenOnly) { ATRACE_CALL(); class LayerRenderArea : public RenderArea { @@ -5530,15 +5531,36 @@ status_t SurfaceFlinger::captureLayers(const sp& layerHandleBinder, reqHeight = 1; } - LayerRenderArea renderArea(this, parent, crop, reqWidth, reqHeight, reqDataspace, childrenOnly); + std::unordered_set, ISurfaceComposer::SpHash> excludeLayers; + for (const auto& handle : excludeHandles) { + BBinder* local = handle->localBinder(); + if (local != nullptr) { + auto layerHandle = reinterpret_cast(local); + excludeLayers.emplace(layerHandle->owner.promote()); + } else { + ALOGW("Invalid layer handle passed as excludeLayer to captureLayers"); + return NAME_NOT_FOUND; + } + } - auto traverseLayers = [parent, childrenOnly](const LayerVector::Visitor& visitor) { + LayerRenderArea renderArea(this, parent, crop, reqWidth, reqHeight, reqDataspace, childrenOnly); + auto traverseLayers = [parent, childrenOnly, + &excludeLayers](const LayerVector::Visitor& visitor) { parent->traverseChildrenInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) { if (!layer->isVisible()) { return; } else if (childrenOnly && layer == parent.get()) { return; } + + sp p = layer; + while (p != nullptr) { + if (excludeLayers.count(p) != 0) { + return; + } + p = p->getParent(); + } + visitor(layer); }); }; -- cgit v1.2.3-59-g8ed1b