diff options
| author | 2019-04-05 18:47:40 +0000 | |
|---|---|---|
| committer | 2019-04-05 18:47:40 +0000 | |
| commit | dee669c2b02fd5be25201f30860658ad490b28d9 (patch) | |
| tree | 48963c1a2f370c45dd7144a640bc76b037b85f67 /services/surfaceflinger/SurfaceFlinger.cpp | |
| parent | 83a199bb919fe8b8fa9b9ebba9d40980bb551069 (diff) | |
| parent | 866455f07c21964af5c195709bc2081121965200 (diff) | |
Merge "SurfaceFlinger: Add exclusion list for captureLayers." into qt-dev
Diffstat (limited to 'services/surfaceflinger/SurfaceFlinger.cpp')
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 34 |
1 files changed, 28 insertions, 6 deletions
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<IBinder>& displayToken, useIdentityTransform); } -status_t SurfaceFlinger::captureLayers(const sp<IBinder>& layerHandleBinder, - sp<GraphicBuffer>* outBuffer, const Dataspace reqDataspace, - const ui::PixelFormat reqPixelFormat, const Rect& sourceCrop, - float frameScale, bool childrenOnly) { +status_t SurfaceFlinger::captureLayers( + const sp<IBinder>& layerHandleBinder, sp<GraphicBuffer>* outBuffer, + const Dataspace reqDataspace, const ui::PixelFormat reqPixelFormat, const Rect& sourceCrop, + const std::unordered_set<sp<IBinder>, ISurfaceComposer::SpHash<IBinder>>& excludeHandles, + float frameScale, bool childrenOnly) { ATRACE_CALL(); class LayerRenderArea : public RenderArea { @@ -5530,15 +5531,36 @@ status_t SurfaceFlinger::captureLayers(const sp<IBinder>& layerHandleBinder, reqHeight = 1; } - LayerRenderArea renderArea(this, parent, crop, reqWidth, reqHeight, reqDataspace, childrenOnly); + std::unordered_set<sp<Layer>, ISurfaceComposer::SpHash<Layer>> excludeLayers; + for (const auto& handle : excludeHandles) { + BBinder* local = handle->localBinder(); + if (local != nullptr) { + auto layerHandle = reinterpret_cast<Layer::Handle*>(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<Layer> p = layer; + while (p != nullptr) { + if (excludeLayers.count(p) != 0) { + return; + } + p = p->getParent(); + } + visitor(layer); }); }; |