Loading libs/gui/ISurfaceComposer.cpp +35 −0 Original line number Diff line number Diff line Loading @@ -142,6 +142,28 @@ public: return result; } virtual status_t captureScreen(uint64_t displayOrLayerStack, ui::Dataspace* outDataspace, sp<GraphicBuffer>* outBuffer) { Parcel data, reply; data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); data.writeUint64(displayOrLayerStack); status_t result = remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN_BY_ID, data, &reply); if (result != NO_ERROR) { ALOGE("captureScreen failed to transact: %d", result); return result; } result = reply.readInt32(); if (result != NO_ERROR) { ALOGE("captureScreen failed to readInt32: %d", result); return result; } *outDataspace = static_cast<ui::Dataspace>(reply.readInt32()); *outBuffer = new GraphicBuffer(); reply.read(**outBuffer); return result; } virtual status_t captureLayers( const sp<IBinder>& layerHandleBinder, sp<GraphicBuffer>* outBuffer, const ui::Dataspace reqDataspace, const ui::PixelFormat reqPixelFormat, Loading Loading @@ -1042,6 +1064,19 @@ status_t BnSurfaceComposer::onTransact( } return NO_ERROR; } case CAPTURE_SCREEN_BY_ID: { CHECK_INTERFACE(ISurfaceComposer, data, reply); uint64_t displayOrLayerStack = data.readUint64(); ui::Dataspace outDataspace = ui::Dataspace::V0_SRGB; sp<GraphicBuffer> outBuffer; status_t res = captureScreen(displayOrLayerStack, &outDataspace, &outBuffer); reply->writeInt32(res); if (res == NO_ERROR) { reply->writeInt32(static_cast<int32_t>(outDataspace)); reply->write(*outBuffer); } return NO_ERROR; } case CAPTURE_LAYERS: { CHECK_INTERFACE(ISurfaceComposer, data, reply); sp<IBinder> layerHandleBinder = data.readStrongBinder(); Loading libs/gui/SurfaceComposerClient.cpp +7 −0 Original line number Diff line number Diff line Loading @@ -1572,6 +1572,13 @@ status_t ScreenshotClient::capture(const sp<IBinder>& display, const ui::Dataspa useIdentityTransform, rotation, false, outBuffer, ignored); } status_t ScreenshotClient::capture(uint64_t displayOrLayerStack, ui::Dataspace* outDataspace, sp<GraphicBuffer>* outBuffer) { sp<ISurfaceComposer> s(ComposerService::getComposerService()); if (s == nullptr) return NO_INIT; return s->captureScreen(displayOrLayerStack, outDataspace, outBuffer); } status_t ScreenshotClient::captureLayers(const sp<IBinder>& layerHandle, const ui::Dataspace reqDataSpace, const ui::PixelFormat reqPixelFormat, Rect sourceCrop, Loading libs/gui/include/gui/ISurfaceComposer.h +4 −0 Original line number Diff line number Diff line Loading @@ -247,6 +247,9 @@ public: useIdentityTransform, rotation); } virtual status_t captureScreen(uint64_t displayOrLayerStack, ui::Dataspace* outDataspace, sp<GraphicBuffer>* outBuffer) = 0; template <class AA> struct SpHash { size_t operator()(const sp<AA>& k) const { return std::hash<AA*>()(k.get()); } Loading Loading @@ -473,6 +476,7 @@ public: GET_ALLOWED_DISPLAY_CONFIGS, GET_DISPLAY_BRIGHTNESS_SUPPORT, SET_DISPLAY_BRIGHTNESS, CAPTURE_SCREEN_BY_ID, // Always append new enum to the end. }; Loading libs/gui/include/gui/SurfaceComposerClient.h +2 −0 Original line number Diff line number Diff line Loading @@ -515,6 +515,8 @@ public: const ui::PixelFormat reqPixelFormat, Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight, bool useIdentityTransform, uint32_t rotation, sp<GraphicBuffer>* outBuffer); static status_t capture(uint64_t displayOrLayerStack, ui::Dataspace* outDataspace, sp<GraphicBuffer>* outBuffer); static status_t captureLayers(const sp<IBinder>& layerHandle, const ui::Dataspace reqDataSpace, const ui::PixelFormat reqPixelFormat, Rect sourceCrop, float frameScale, sp<GraphicBuffer>* outBuffer); Loading libs/gui/tests/Surface_test.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -623,6 +623,10 @@ public: bool /*captureSecureLayers*/) override { return NO_ERROR; } status_t captureScreen(uint64_t /*displayOrLayerStack*/, ui::Dataspace* /*outDataspace*/, sp<GraphicBuffer>* /*outBuffer*/) override { return NO_ERROR; } virtual status_t captureLayers( const sp<IBinder>& /*parentHandle*/, sp<GraphicBuffer>* /*outBuffer*/, const ui::Dataspace /*reqDataspace*/, const ui::PixelFormat /*reqPixelFormat*/, Loading Loading
libs/gui/ISurfaceComposer.cpp +35 −0 Original line number Diff line number Diff line Loading @@ -142,6 +142,28 @@ public: return result; } virtual status_t captureScreen(uint64_t displayOrLayerStack, ui::Dataspace* outDataspace, sp<GraphicBuffer>* outBuffer) { Parcel data, reply; data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); data.writeUint64(displayOrLayerStack); status_t result = remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN_BY_ID, data, &reply); if (result != NO_ERROR) { ALOGE("captureScreen failed to transact: %d", result); return result; } result = reply.readInt32(); if (result != NO_ERROR) { ALOGE("captureScreen failed to readInt32: %d", result); return result; } *outDataspace = static_cast<ui::Dataspace>(reply.readInt32()); *outBuffer = new GraphicBuffer(); reply.read(**outBuffer); return result; } virtual status_t captureLayers( const sp<IBinder>& layerHandleBinder, sp<GraphicBuffer>* outBuffer, const ui::Dataspace reqDataspace, const ui::PixelFormat reqPixelFormat, Loading Loading @@ -1042,6 +1064,19 @@ status_t BnSurfaceComposer::onTransact( } return NO_ERROR; } case CAPTURE_SCREEN_BY_ID: { CHECK_INTERFACE(ISurfaceComposer, data, reply); uint64_t displayOrLayerStack = data.readUint64(); ui::Dataspace outDataspace = ui::Dataspace::V0_SRGB; sp<GraphicBuffer> outBuffer; status_t res = captureScreen(displayOrLayerStack, &outDataspace, &outBuffer); reply->writeInt32(res); if (res == NO_ERROR) { reply->writeInt32(static_cast<int32_t>(outDataspace)); reply->write(*outBuffer); } return NO_ERROR; } case CAPTURE_LAYERS: { CHECK_INTERFACE(ISurfaceComposer, data, reply); sp<IBinder> layerHandleBinder = data.readStrongBinder(); Loading
libs/gui/SurfaceComposerClient.cpp +7 −0 Original line number Diff line number Diff line Loading @@ -1572,6 +1572,13 @@ status_t ScreenshotClient::capture(const sp<IBinder>& display, const ui::Dataspa useIdentityTransform, rotation, false, outBuffer, ignored); } status_t ScreenshotClient::capture(uint64_t displayOrLayerStack, ui::Dataspace* outDataspace, sp<GraphicBuffer>* outBuffer) { sp<ISurfaceComposer> s(ComposerService::getComposerService()); if (s == nullptr) return NO_INIT; return s->captureScreen(displayOrLayerStack, outDataspace, outBuffer); } status_t ScreenshotClient::captureLayers(const sp<IBinder>& layerHandle, const ui::Dataspace reqDataSpace, const ui::PixelFormat reqPixelFormat, Rect sourceCrop, Loading
libs/gui/include/gui/ISurfaceComposer.h +4 −0 Original line number Diff line number Diff line Loading @@ -247,6 +247,9 @@ public: useIdentityTransform, rotation); } virtual status_t captureScreen(uint64_t displayOrLayerStack, ui::Dataspace* outDataspace, sp<GraphicBuffer>* outBuffer) = 0; template <class AA> struct SpHash { size_t operator()(const sp<AA>& k) const { return std::hash<AA*>()(k.get()); } Loading Loading @@ -473,6 +476,7 @@ public: GET_ALLOWED_DISPLAY_CONFIGS, GET_DISPLAY_BRIGHTNESS_SUPPORT, SET_DISPLAY_BRIGHTNESS, CAPTURE_SCREEN_BY_ID, // Always append new enum to the end. }; Loading
libs/gui/include/gui/SurfaceComposerClient.h +2 −0 Original line number Diff line number Diff line Loading @@ -515,6 +515,8 @@ public: const ui::PixelFormat reqPixelFormat, Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight, bool useIdentityTransform, uint32_t rotation, sp<GraphicBuffer>* outBuffer); static status_t capture(uint64_t displayOrLayerStack, ui::Dataspace* outDataspace, sp<GraphicBuffer>* outBuffer); static status_t captureLayers(const sp<IBinder>& layerHandle, const ui::Dataspace reqDataSpace, const ui::PixelFormat reqPixelFormat, Rect sourceCrop, float frameScale, sp<GraphicBuffer>* outBuffer); Loading
libs/gui/tests/Surface_test.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -623,6 +623,10 @@ public: bool /*captureSecureLayers*/) override { return NO_ERROR; } status_t captureScreen(uint64_t /*displayOrLayerStack*/, ui::Dataspace* /*outDataspace*/, sp<GraphicBuffer>* /*outBuffer*/) override { return NO_ERROR; } virtual status_t captureLayers( const sp<IBinder>& /*parentHandle*/, sp<GraphicBuffer>* /*outBuffer*/, const ui::Dataspace /*reqDataspace*/, const ui::PixelFormat /*reqPixelFormat*/, Loading