diff options
| author | 2019-05-09 17:21:57 +0000 | |
|---|---|---|
| committer | 2019-05-09 17:21:57 +0000 | |
| commit | afab4f0519c8344bb44d0e31ce1a3847c53a0c90 (patch) | |
| tree | 4e6b51f7cc6974277b93247caaf5c86dbf9c65da /libs/gui/ISurfaceComposer.cpp | |
| parent | 7c28c970f3c3b0bea96c7daee269771c94c63d36 (diff) | |
| parent | 93df2ea991d6f9c5c64280ac9947e44653d61fbf (diff) | |
Merge "Added captureScreen function for displayId or layerStack" into qt-dev
Diffstat (limited to 'libs/gui/ISurfaceComposer.cpp')
| -rw-r--r-- | libs/gui/ISurfaceComposer.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/libs/gui/ISurfaceComposer.cpp b/libs/gui/ISurfaceComposer.cpp index a8b1a4c7af..4372e16a1f 100644 --- a/libs/gui/ISurfaceComposer.cpp +++ b/libs/gui/ISurfaceComposer.cpp @@ -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, @@ -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(); |