Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 690db386 authored by chaviw's avatar chaviw
Browse files

Unified display screenshot into one displayCapture function

Cleaned up SurfaceComposerClient display screenshot functions so there
is only function that takes a screenshot based on display token. It
accepts a DisplayCaptureArgs and returns ScreenCaptureResults object.

Test: Display screenshots + secure works
Test: adb shell screencap
Bug: 162367424

Change-Id: I5900f387c7533ae37d4159152bfaf106fb0391d4
parent 426b5c0c
Loading
Loading
Loading
Loading
+6 −40
Original line number Diff line number Diff line
@@ -1922,52 +1922,18 @@ status_t SurfaceComposerClient::setGlobalShadowSettings(const half4& ambientColo

// ----------------------------------------------------------------------------

status_t ScreenshotClient::capture(const sp<IBinder>& display, ui::Dataspace /* reqDataspace */,
                                   ui::PixelFormat reqPixelFormat, const Rect& sourceCrop,
                                   uint32_t reqWidth, uint32_t reqHeight, bool useIdentityTransform,
                                   ui::Rotation rotation, bool captureSecureLayers,
                                   sp<GraphicBuffer>* outBuffer, bool& outCapturedSecureLayers) {
status_t ScreenshotClient::captureDisplay(const DisplayCaptureArgs& captureArgs,
                                          ScreenCaptureResults& captureResults) {
    sp<ISurfaceComposer> s(ComposerService::getComposerService());
    if (s == nullptr) return NO_INIT;

    DisplayCaptureArgs args;
    args.displayToken = display;
    args.pixelFormat = reqPixelFormat;
    args.sourceCrop = sourceCrop;
    args.width = reqWidth;
    args.height = reqHeight;
    args.useIdentityTransform = useIdentityTransform;
    args.rotation = rotation;
    args.captureSecureLayers = captureSecureLayers;

    ScreenCaptureResults captureResults;
    status_t ret = s->captureDisplay(args, captureResults);
    if (ret != NO_ERROR) {
        return ret;
    }
    *outBuffer = captureResults.buffer;
    outCapturedSecureLayers = captureResults.capturedSecureLayers;
    return ret;
}

status_t ScreenshotClient::capture(const sp<IBinder>& display, ui::Dataspace reqDataspace,
                                   ui::PixelFormat reqPixelFormat, const Rect& sourceCrop,
                                   uint32_t reqWidth, uint32_t reqHeight, bool useIdentityTransform,
                                   ui::Rotation rotation, sp<GraphicBuffer>* outBuffer) {
    bool ignored;
    return capture(display, reqDataspace, reqPixelFormat, sourceCrop, reqWidth, reqHeight,
                   useIdentityTransform, rotation, false, outBuffer, ignored);
    return s->captureDisplay(captureArgs, captureResults);
}

status_t ScreenshotClient::capture(uint64_t displayOrLayerStack, ui::Dataspace* outDataspace,
                                   sp<GraphicBuffer>* outBuffer) {
status_t ScreenshotClient::captureDisplay(uint64_t displayOrLayerStack,
                                          ScreenCaptureResults& captureResults) {
    sp<ISurfaceComposer> s(ComposerService::getComposerService());
    if (s == nullptr) return NO_INIT;
    ScreenCaptureResults captureResults;
    status_t ret = s->captureDisplay(displayOrLayerStack, captureResults);
    *outBuffer = captureResults.buffer;
    *outDataspace = captureResults.capturedDataspace;
    return ret;
    return s->captureDisplay(displayOrLayerStack, captureResults);
}

status_t ScreenshotClient::captureLayers(const sp<IBinder>& layerHandle,
+4 −11
Original line number Diff line number Diff line
@@ -597,17 +597,10 @@ class ScreenshotClient {
public:
    // if cropping isn't required, callers may pass in a default Rect, e.g.:
    //   capture(display, producer, Rect(), reqWidth, ...);
    static status_t capture(const sp<IBinder>& display, ui::Dataspace reqDataSpace,
                            ui::PixelFormat reqPixelFormat, const Rect& sourceCrop,
                            uint32_t reqWidth, uint32_t reqHeight, bool useIdentityTransform,
                            ui::Rotation rotation, bool captureSecureLayers,
                            sp<GraphicBuffer>* outBuffer, bool& outCapturedSecureLayers);
    static status_t capture(const sp<IBinder>& display, ui::Dataspace reqDataSpace,
                            ui::PixelFormat reqPixelFormat, const Rect& sourceCrop,
                            uint32_t reqWidth, uint32_t reqHeight, bool useIdentityTransform,
                            ui::Rotation rotation, sp<GraphicBuffer>* outBuffer);
    static status_t capture(uint64_t displayOrLayerStack, ui::Dataspace* outDataspace,
                            sp<GraphicBuffer>* outBuffer);
    static status_t captureDisplay(const DisplayCaptureArgs& captureArgs,
                                   ScreenCaptureResults& captureResults);
    static status_t captureDisplay(uint64_t displayOrLayerStack,
                                   ScreenCaptureResults& captureResults);
    static status_t captureLayers(const sp<IBinder>& layerHandle, ui::Dataspace reqDataSpace,
                                  ui::PixelFormat reqPixelFormat, const Rect& sourceCrop,
                                  float frameScale, sp<GraphicBuffer>* outBuffer);
+4 −3
Original line number Diff line number Diff line
@@ -260,9 +260,10 @@ TEST_F(CredentialsTest, CaptureTest) {
    const auto display = SurfaceComposerClient::getInternalDisplayToken();
    std::function<status_t()> condition = [=]() {
        sp<GraphicBuffer> outBuffer;
        return ScreenshotClient::capture(display, ui::Dataspace::V0_SRGB,
                                         ui::PixelFormat::RGBA_8888, Rect(), 0 /*reqWidth*/,
                                         0 /*reqHeight*/, false, ui::ROTATION_0, &outBuffer);
        DisplayCaptureArgs captureArgs;
        captureArgs.displayToken = display;
        ScreenCaptureResults captureResults;
        return ScreenshotClient::captureDisplay(captureArgs, captureResults);
    };
    ASSERT_NO_FATAL_FAILURE(checkWithPrivileges<status_t>(condition, NO_ERROR, PERMISSION_DENIED));
}