Loading libs/gui/ISurfaceComposer.cpp +21 −6 Original line number Diff line number Diff line Loading @@ -141,16 +141,22 @@ public: return result; } virtual status_t captureLayers(const sp<IBinder>& layerHandleBinder, sp<GraphicBuffer>* outBuffer, const ui::Dataspace reqDataspace, const ui::PixelFormat reqPixelFormat, const Rect& sourceCrop, float frameScale, bool childrenOnly) { virtual status_t captureLayers( const sp<IBinder>& layerHandleBinder, sp<GraphicBuffer>* outBuffer, const ui::Dataspace reqDataspace, const ui::PixelFormat reqPixelFormat, const Rect& sourceCrop, const std::unordered_set<sp<IBinder>, SpHash<IBinder>>& excludeLayers, float frameScale, bool childrenOnly) { Parcel data, reply; data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); data.writeStrongBinder(layerHandleBinder); data.writeInt32(static_cast<int32_t>(reqDataspace)); data.writeInt32(static_cast<int32_t>(reqPixelFormat)); data.write(sourceCrop); data.writeInt32(excludeLayers.size()); for (auto el : excludeLayers) { data.writeStrongBinder(el); } data.writeFloat(frameScale); data.writeBool(childrenOnly); status_t result = remote()->transact(BnSurfaceComposer::CAPTURE_LAYERS, data, &reply); Loading Loading @@ -1038,11 +1044,20 @@ status_t BnSurfaceComposer::onTransact( sp<GraphicBuffer> outBuffer; Rect sourceCrop(Rect::EMPTY_RECT); data.read(sourceCrop); std::unordered_set<sp<IBinder>, SpHash<IBinder>> excludeHandles; int numExcludeHandles = data.readInt32(); excludeHandles.reserve(numExcludeHandles); for (int i = 0; i < numExcludeHandles; i++) { excludeHandles.emplace(data.readStrongBinder()); } float frameScale = data.readFloat(); bool childrenOnly = data.readBool(); status_t res = captureLayers(layerHandleBinder, &outBuffer, reqDataspace, reqPixelFormat, sourceCrop, frameScale, childrenOnly); status_t res = captureLayers(layerHandleBinder, &outBuffer, reqDataspace, reqPixelFormat, sourceCrop, excludeHandles, frameScale, childrenOnly); reply->writeInt32(res); if (res == NO_ERROR) { reply->write(*outBuffer); Loading libs/gui/SurfaceComposerClient.cpp +9 −7 Original line number Diff line number Diff line Loading @@ -1570,18 +1570,20 @@ status_t ScreenshotClient::captureLayers(const sp<IBinder>& layerHandle, sp<ISurfaceComposer> s(ComposerService::getComposerService()); if (s == nullptr) return NO_INIT; status_t ret = s->captureLayers(layerHandle, outBuffer, reqDataSpace, reqPixelFormat, sourceCrop, frameScale, false /* childrenOnly */); sourceCrop, {}, frameScale, false /* childrenOnly */); return ret; } status_t ScreenshotClient::captureChildLayers(const sp<IBinder>& layerHandle, const ui::Dataspace reqDataSpace, status_t ScreenshotClient::captureChildLayers( const sp<IBinder>& layerHandle, const ui::Dataspace reqDataSpace, const ui::PixelFormat reqPixelFormat, Rect sourceCrop, const std::unordered_set<sp<IBinder>, ISurfaceComposer::SpHash<IBinder>>& excludeHandles, float frameScale, sp<GraphicBuffer>* outBuffer) { sp<ISurfaceComposer> s(ComposerService::getComposerService()); if (s == nullptr) return NO_INIT; status_t ret = s->captureLayers(layerHandle, outBuffer, reqDataSpace, reqPixelFormat, sourceCrop, frameScale, true /* childrenOnly */); status_t ret = s->captureLayers(layerHandle, outBuffer, reqDataSpace, reqPixelFormat, sourceCrop, excludeHandles, frameScale, true /* childrenOnly */); return ret; } // ---------------------------------------------------------------------------- Loading libs/gui/include/gui/ISurfaceComposer.h +14 −5 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <stdint.h> #include <sys/types.h> #include <binder/IBinder.h> #include <binder/IInterface.h> #include <gui/ITransactionCompletedListener.h> Loading @@ -37,6 +38,7 @@ #include <utils/Vector.h> #include <optional> #include <unordered_set> #include <vector> namespace android { Loading Loading @@ -243,6 +245,11 @@ public: sourceCrop, reqWidth, reqHeight, useIdentityTransform, rotation); } template <class AA> struct SpHash { size_t operator()(const sp<AA>& k) const { return std::hash<AA*>()(k.get()); } }; /** * Capture a subtree of the layer hierarchy, potentially ignoring the root node. * Loading @@ -250,9 +257,11 @@ public: * of the buffer. The caller should pick the data space and pixel format * that it can consume. */ virtual status_t captureLayers(const sp<IBinder>& layerHandleBinder, sp<GraphicBuffer>* outBuffer, const ui::Dataspace reqDataspace, const ui::PixelFormat reqPixelFormat, const Rect& sourceCrop, virtual status_t captureLayers( const sp<IBinder>& layerHandleBinder, sp<GraphicBuffer>* outBuffer, const ui::Dataspace reqDataspace, const ui::PixelFormat reqPixelFormat, const Rect& sourceCrop, const std::unordered_set<sp<IBinder>, SpHash<IBinder>>& excludeHandles, float frameScale = 1.0, bool childrenOnly = false) = 0; /** Loading @@ -263,7 +272,7 @@ public: const Rect& sourceCrop, float frameScale = 1.0, bool childrenOnly = false) { return captureLayers(layerHandleBinder, outBuffer, ui::Dataspace::V0_SRGB, ui::PixelFormat::RGBA_8888, sourceCrop, frameScale, childrenOnly); ui::PixelFormat::RGBA_8888, sourceCrop, {}, frameScale, childrenOnly); } /* Clears the frame statistics for animations. Loading libs/gui/include/gui/SurfaceComposerClient.h +7 −4 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ #include <ui/PixelFormat.h> #include <gui/CpuConsumer.h> #include <gui/ISurfaceComposer.h> #include <gui/ITransactionCompletedListener.h> #include <gui/LayerState.h> #include <gui/SurfaceControl.h> Loading Loading @@ -516,9 +517,11 @@ public: static status_t captureLayers(const sp<IBinder>& layerHandle, const ui::Dataspace reqDataSpace, const ui::PixelFormat reqPixelFormat, Rect sourceCrop, float frameScale, sp<GraphicBuffer>* outBuffer); static status_t captureChildLayers(const sp<IBinder>& layerHandle, const ui::Dataspace reqDataSpace, static status_t captureChildLayers( const sp<IBinder>& layerHandle, const ui::Dataspace reqDataSpace, const ui::PixelFormat reqPixelFormat, Rect sourceCrop, const std::unordered_set<sp<IBinder>, ISurfaceComposer::SpHash<IBinder>>& excludeHandles, float frameScale, sp<GraphicBuffer>* outBuffer); }; Loading libs/gui/tests/Surface_test.cpp +7 −6 Original line number Diff line number Diff line Loading @@ -622,12 +622,13 @@ public: bool /*captureSecureLayers*/) override { return NO_ERROR; } virtual status_t captureLayers(const sp<IBinder>& /*parentHandle*/, sp<GraphicBuffer>* /*outBuffer*/, const ui::Dataspace /*reqDataspace*/, const ui::PixelFormat /*reqPixelFormat*/, const Rect& /*sourceCrop*/, float /*frameScale*/, bool /*childrenOnly*/) override { virtual status_t captureLayers( const sp<IBinder>& /*parentHandle*/, sp<GraphicBuffer>* /*outBuffer*/, const ui::Dataspace /*reqDataspace*/, const ui::PixelFormat /*reqPixelFormat*/, const Rect& /*sourceCrop*/, const std::unordered_set<sp<IBinder>, ISurfaceComposer::SpHash<IBinder>>& /*excludeHandles*/, float /*frameScale*/, bool /*childrenOnly*/) override { return NO_ERROR; } status_t clearAnimationFrameStats() override { return NO_ERROR; } Loading Loading
libs/gui/ISurfaceComposer.cpp +21 −6 Original line number Diff line number Diff line Loading @@ -141,16 +141,22 @@ public: return result; } virtual status_t captureLayers(const sp<IBinder>& layerHandleBinder, sp<GraphicBuffer>* outBuffer, const ui::Dataspace reqDataspace, const ui::PixelFormat reqPixelFormat, const Rect& sourceCrop, float frameScale, bool childrenOnly) { virtual status_t captureLayers( const sp<IBinder>& layerHandleBinder, sp<GraphicBuffer>* outBuffer, const ui::Dataspace reqDataspace, const ui::PixelFormat reqPixelFormat, const Rect& sourceCrop, const std::unordered_set<sp<IBinder>, SpHash<IBinder>>& excludeLayers, float frameScale, bool childrenOnly) { Parcel data, reply; data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); data.writeStrongBinder(layerHandleBinder); data.writeInt32(static_cast<int32_t>(reqDataspace)); data.writeInt32(static_cast<int32_t>(reqPixelFormat)); data.write(sourceCrop); data.writeInt32(excludeLayers.size()); for (auto el : excludeLayers) { data.writeStrongBinder(el); } data.writeFloat(frameScale); data.writeBool(childrenOnly); status_t result = remote()->transact(BnSurfaceComposer::CAPTURE_LAYERS, data, &reply); Loading Loading @@ -1038,11 +1044,20 @@ status_t BnSurfaceComposer::onTransact( sp<GraphicBuffer> outBuffer; Rect sourceCrop(Rect::EMPTY_RECT); data.read(sourceCrop); std::unordered_set<sp<IBinder>, SpHash<IBinder>> excludeHandles; int numExcludeHandles = data.readInt32(); excludeHandles.reserve(numExcludeHandles); for (int i = 0; i < numExcludeHandles; i++) { excludeHandles.emplace(data.readStrongBinder()); } float frameScale = data.readFloat(); bool childrenOnly = data.readBool(); status_t res = captureLayers(layerHandleBinder, &outBuffer, reqDataspace, reqPixelFormat, sourceCrop, frameScale, childrenOnly); status_t res = captureLayers(layerHandleBinder, &outBuffer, reqDataspace, reqPixelFormat, sourceCrop, excludeHandles, frameScale, childrenOnly); reply->writeInt32(res); if (res == NO_ERROR) { reply->write(*outBuffer); Loading
libs/gui/SurfaceComposerClient.cpp +9 −7 Original line number Diff line number Diff line Loading @@ -1570,18 +1570,20 @@ status_t ScreenshotClient::captureLayers(const sp<IBinder>& layerHandle, sp<ISurfaceComposer> s(ComposerService::getComposerService()); if (s == nullptr) return NO_INIT; status_t ret = s->captureLayers(layerHandle, outBuffer, reqDataSpace, reqPixelFormat, sourceCrop, frameScale, false /* childrenOnly */); sourceCrop, {}, frameScale, false /* childrenOnly */); return ret; } status_t ScreenshotClient::captureChildLayers(const sp<IBinder>& layerHandle, const ui::Dataspace reqDataSpace, status_t ScreenshotClient::captureChildLayers( const sp<IBinder>& layerHandle, const ui::Dataspace reqDataSpace, const ui::PixelFormat reqPixelFormat, Rect sourceCrop, const std::unordered_set<sp<IBinder>, ISurfaceComposer::SpHash<IBinder>>& excludeHandles, float frameScale, sp<GraphicBuffer>* outBuffer) { sp<ISurfaceComposer> s(ComposerService::getComposerService()); if (s == nullptr) return NO_INIT; status_t ret = s->captureLayers(layerHandle, outBuffer, reqDataSpace, reqPixelFormat, sourceCrop, frameScale, true /* childrenOnly */); status_t ret = s->captureLayers(layerHandle, outBuffer, reqDataSpace, reqPixelFormat, sourceCrop, excludeHandles, frameScale, true /* childrenOnly */); return ret; } // ---------------------------------------------------------------------------- Loading
libs/gui/include/gui/ISurfaceComposer.h +14 −5 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <stdint.h> #include <sys/types.h> #include <binder/IBinder.h> #include <binder/IInterface.h> #include <gui/ITransactionCompletedListener.h> Loading @@ -37,6 +38,7 @@ #include <utils/Vector.h> #include <optional> #include <unordered_set> #include <vector> namespace android { Loading Loading @@ -243,6 +245,11 @@ public: sourceCrop, reqWidth, reqHeight, useIdentityTransform, rotation); } template <class AA> struct SpHash { size_t operator()(const sp<AA>& k) const { return std::hash<AA*>()(k.get()); } }; /** * Capture a subtree of the layer hierarchy, potentially ignoring the root node. * Loading @@ -250,9 +257,11 @@ public: * of the buffer. The caller should pick the data space and pixel format * that it can consume. */ virtual status_t captureLayers(const sp<IBinder>& layerHandleBinder, sp<GraphicBuffer>* outBuffer, const ui::Dataspace reqDataspace, const ui::PixelFormat reqPixelFormat, const Rect& sourceCrop, virtual status_t captureLayers( const sp<IBinder>& layerHandleBinder, sp<GraphicBuffer>* outBuffer, const ui::Dataspace reqDataspace, const ui::PixelFormat reqPixelFormat, const Rect& sourceCrop, const std::unordered_set<sp<IBinder>, SpHash<IBinder>>& excludeHandles, float frameScale = 1.0, bool childrenOnly = false) = 0; /** Loading @@ -263,7 +272,7 @@ public: const Rect& sourceCrop, float frameScale = 1.0, bool childrenOnly = false) { return captureLayers(layerHandleBinder, outBuffer, ui::Dataspace::V0_SRGB, ui::PixelFormat::RGBA_8888, sourceCrop, frameScale, childrenOnly); ui::PixelFormat::RGBA_8888, sourceCrop, {}, frameScale, childrenOnly); } /* Clears the frame statistics for animations. Loading
libs/gui/include/gui/SurfaceComposerClient.h +7 −4 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ #include <ui/PixelFormat.h> #include <gui/CpuConsumer.h> #include <gui/ISurfaceComposer.h> #include <gui/ITransactionCompletedListener.h> #include <gui/LayerState.h> #include <gui/SurfaceControl.h> Loading Loading @@ -516,9 +517,11 @@ public: static status_t captureLayers(const sp<IBinder>& layerHandle, const ui::Dataspace reqDataSpace, const ui::PixelFormat reqPixelFormat, Rect sourceCrop, float frameScale, sp<GraphicBuffer>* outBuffer); static status_t captureChildLayers(const sp<IBinder>& layerHandle, const ui::Dataspace reqDataSpace, static status_t captureChildLayers( const sp<IBinder>& layerHandle, const ui::Dataspace reqDataSpace, const ui::PixelFormat reqPixelFormat, Rect sourceCrop, const std::unordered_set<sp<IBinder>, ISurfaceComposer::SpHash<IBinder>>& excludeHandles, float frameScale, sp<GraphicBuffer>* outBuffer); }; Loading
libs/gui/tests/Surface_test.cpp +7 −6 Original line number Diff line number Diff line Loading @@ -622,12 +622,13 @@ public: bool /*captureSecureLayers*/) override { return NO_ERROR; } virtual status_t captureLayers(const sp<IBinder>& /*parentHandle*/, sp<GraphicBuffer>* /*outBuffer*/, const ui::Dataspace /*reqDataspace*/, const ui::PixelFormat /*reqPixelFormat*/, const Rect& /*sourceCrop*/, float /*frameScale*/, bool /*childrenOnly*/) override { virtual status_t captureLayers( const sp<IBinder>& /*parentHandle*/, sp<GraphicBuffer>* /*outBuffer*/, const ui::Dataspace /*reqDataspace*/, const ui::PixelFormat /*reqPixelFormat*/, const Rect& /*sourceCrop*/, const std::unordered_set<sp<IBinder>, ISurfaceComposer::SpHash<IBinder>>& /*excludeHandles*/, float /*frameScale*/, bool /*childrenOnly*/) override { return NO_ERROR; } status_t clearAnimationFrameStats() override { return NO_ERROR; } Loading