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

Commit c701401f authored by Dan Stoza's avatar Dan Stoza
Browse files

Allow disabling layer rotation during screenshots

Add the ability to ignore layers' transformation matrices during
screenshot capture, which will allow the window manager to capture
unrotated images for recents during the device rotation animation.

Bug: 11805195
Change-Id: I854d87bc84ca06ef9a054a454af1c080ee66fbb8
parent 87c01eda
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -120,7 +120,8 @@ public:
    virtual status_t captureScreen(const sp<IBinder>& display,
    virtual status_t captureScreen(const sp<IBinder>& display,
            const sp<IGraphicBufferProducer>& producer,
            const sp<IGraphicBufferProducer>& producer,
            uint32_t reqWidth, uint32_t reqHeight,
            uint32_t reqWidth, uint32_t reqHeight,
            uint32_t minLayerZ, uint32_t maxLayerZ) = 0;
            uint32_t minLayerZ, uint32_t maxLayerZ,
            bool useIdentityTransform) = 0;
};
};


// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
+7 −4
Original line number Original line Diff line number Diff line
@@ -164,7 +164,8 @@ public:
            const sp<IBinder>& display,
            const sp<IBinder>& display,
            const sp<IGraphicBufferProducer>& producer,
            const sp<IGraphicBufferProducer>& producer,
            uint32_t reqWidth, uint32_t reqHeight,
            uint32_t reqWidth, uint32_t reqHeight,
            uint32_t minLayerZ, uint32_t maxLayerZ);
            uint32_t minLayerZ, uint32_t maxLayerZ,
            bool useIdentityTransform);


private:
private:
    mutable sp<CpuConsumer> mCpuConsumer;
    mutable sp<CpuConsumer> mCpuConsumer;
@@ -177,12 +178,14 @@ public:
    ~ScreenshotClient();
    ~ScreenshotClient();


    // frees the previous screenshot and capture a new one
    // frees the previous screenshot and capture a new one
    status_t update(const sp<IBinder>& display);
    status_t update(const sp<IBinder>& display, bool useIdentityTransform);
    status_t update(const sp<IBinder>& display,
    status_t update(const sp<IBinder>& display,
            uint32_t reqWidth, uint32_t reqHeight);
            uint32_t reqWidth, uint32_t reqHeight,
            bool useIdentityTransform);
    status_t update(const sp<IBinder>& display,
    status_t update(const sp<IBinder>& display,
            uint32_t reqWidth, uint32_t reqHeight,
            uint32_t reqWidth, uint32_t reqHeight,
            uint32_t minLayerZ, uint32_t maxLayerZ);
            uint32_t minLayerZ, uint32_t maxLayerZ,
            bool useIdentityTransform);


    sp<CpuConsumer> getCpuConsumer() const;
    sp<CpuConsumer> getCpuConsumer() const;


+7 −2
Original line number Original line Diff line number Diff line
@@ -105,7 +105,8 @@ public:
    virtual status_t captureScreen(const sp<IBinder>& display,
    virtual status_t captureScreen(const sp<IBinder>& display,
            const sp<IGraphicBufferProducer>& producer,
            const sp<IGraphicBufferProducer>& producer,
            uint32_t reqWidth, uint32_t reqHeight,
            uint32_t reqWidth, uint32_t reqHeight,
            uint32_t minLayerZ, uint32_t maxLayerZ)
            uint32_t minLayerZ, uint32_t maxLayerZ,
            bool useIdentityTransform)
    {
    {
        Parcel data, reply;
        Parcel data, reply;
        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
@@ -115,6 +116,7 @@ public:
        data.writeInt32(reqHeight);
        data.writeInt32(reqHeight);
        data.writeInt32(minLayerZ);
        data.writeInt32(minLayerZ);
        data.writeInt32(maxLayerZ);
        data.writeInt32(maxLayerZ);
        data.writeInt32(static_cast<int32_t>(useIdentityTransform));
        remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN, data, &reply);
        remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN, data, &reply);
        return reply.readInt32();
        return reply.readInt32();
    }
    }
@@ -285,8 +287,11 @@ status_t BnSurfaceComposer::onTransact(
            uint32_t reqHeight = data.readInt32();
            uint32_t reqHeight = data.readInt32();
            uint32_t minLayerZ = data.readInt32();
            uint32_t minLayerZ = data.readInt32();
            uint32_t maxLayerZ = data.readInt32();
            uint32_t maxLayerZ = data.readInt32();
            bool useIdentityTransform = static_cast<bool>(data.readInt32());

            status_t res = captureScreen(display, producer,
            status_t res = captureScreen(display, producer,
                    reqWidth, reqHeight, minLayerZ, maxLayerZ);
                    reqWidth, reqHeight, minLayerZ, maxLayerZ,
                    useIdentityTransform);
            reply->writeInt32(res);
            reply->writeInt32(res);
            return NO_ERROR;
            return NO_ERROR;
        }
        }
+12 −8
Original line number Original line Diff line number Diff line
@@ -628,11 +628,11 @@ status_t ScreenshotClient::capture(
        const sp<IBinder>& display,
        const sp<IBinder>& display,
        const sp<IGraphicBufferProducer>& producer,
        const sp<IGraphicBufferProducer>& producer,
        uint32_t reqWidth, uint32_t reqHeight,
        uint32_t reqWidth, uint32_t reqHeight,
        uint32_t minLayerZ, uint32_t maxLayerZ) {
        uint32_t minLayerZ, uint32_t maxLayerZ, bool useIdentityTransform) {
    sp<ISurfaceComposer> s(ComposerService::getComposerService());
    sp<ISurfaceComposer> s(ComposerService::getComposerService());
    if (s == NULL) return NO_INIT;
    if (s == NULL) return NO_INIT;
    return s->captureScreen(display, producer,
    return s->captureScreen(display, producer,
            reqWidth, reqHeight, minLayerZ, maxLayerZ);
            reqWidth, reqHeight, minLayerZ, maxLayerZ, useIdentityTransform);
}
}


ScreenshotClient::ScreenshotClient()
ScreenshotClient::ScreenshotClient()
@@ -655,7 +655,8 @@ sp<CpuConsumer> ScreenshotClient::getCpuConsumer() const {


status_t ScreenshotClient::update(const sp<IBinder>& display,
status_t ScreenshotClient::update(const sp<IBinder>& display,
        uint32_t reqWidth, uint32_t reqHeight,
        uint32_t reqWidth, uint32_t reqHeight,
        uint32_t minLayerZ, uint32_t maxLayerZ) {
        uint32_t minLayerZ, uint32_t maxLayerZ,
        bool useIdentityTransform) {
    sp<ISurfaceComposer> s(ComposerService::getComposerService());
    sp<ISurfaceComposer> s(ComposerService::getComposerService());
    if (s == NULL) return NO_INIT;
    if (s == NULL) return NO_INIT;
    sp<CpuConsumer> cpuConsumer = getCpuConsumer();
    sp<CpuConsumer> cpuConsumer = getCpuConsumer();
@@ -667,7 +668,7 @@ status_t ScreenshotClient::update(const sp<IBinder>& display,
    }
    }


    status_t err = s->captureScreen(display, mBufferQueue,
    status_t err = s->captureScreen(display, mBufferQueue,
            reqWidth, reqHeight, minLayerZ, maxLayerZ);
            reqWidth, reqHeight, minLayerZ, maxLayerZ, useIdentityTransform);


    if (err == NO_ERROR) {
    if (err == NO_ERROR) {
        err = mCpuConsumer->lockNextBuffer(&mBuffer);
        err = mCpuConsumer->lockNextBuffer(&mBuffer);
@@ -678,13 +679,16 @@ status_t ScreenshotClient::update(const sp<IBinder>& display,
    return err;
    return err;
}
}


status_t ScreenshotClient::update(const sp<IBinder>& display) {
status_t ScreenshotClient::update(const sp<IBinder>& display,
    return ScreenshotClient::update(display, 0, 0, 0, -1UL);
        bool useIdentityTransform) {
    return ScreenshotClient::update(display, 0, 0, 0, -1UL,
            useIdentityTransform);
}
}


status_t ScreenshotClient::update(const sp<IBinder>& display,
status_t ScreenshotClient::update(const sp<IBinder>& display,
        uint32_t reqWidth, uint32_t reqHeight) {
        uint32_t reqWidth, uint32_t reqHeight, bool useIdentityTransform) {
    return ScreenshotClient::update(display, reqWidth, reqHeight, 0, -1UL);
    return ScreenshotClient::update(display, reqWidth, reqHeight, 0, -1UL,
            useIdentityTransform);
}
}


void ScreenshotClient::release() {
void ScreenshotClient::release() {
+2 −0
Original line number Original line Diff line number Diff line
@@ -194,6 +194,8 @@ void DisplayDevice::flip(const Region& dirty) const
        eglSetSwapRectangleANDROID(dpy, surface,
        eglSetSwapRectangleANDROID(dpy, surface,
                b.left, b.top, b.width(), b.height());
                b.left, b.top, b.width(), b.height());
    }
    }
#else
    (void) dirty; // Eliminate unused parameter warning
#endif
#endif


    mPageFlipCount++;
    mPageFlipCount++;
Loading