Loading include/surfaceflinger/ISurfaceComposer.h +2 −1 Original line number Diff line number Diff line Loading @@ -115,7 +115,8 @@ public: */ virtual status_t captureScreen(DisplayID dpy, sp<IMemoryHeap>* heap, uint32_t* width, uint32_t* height, PixelFormat* format) = 0; uint32_t* width, uint32_t* height, PixelFormat* format, uint32_t reqWidth, uint32_t reqHeight) = 0; /* Signal surfaceflinger that there might be some work to do * This is an ASYNCHRONOUS call. Loading include/surfaceflinger/SurfaceComposerClient.h +30 −0 Original line number Diff line number Diff line Loading @@ -169,6 +169,36 @@ private: sp<ISurfaceComposerClient> mClient; }; // --------------------------------------------------------------------------- class ScreenshotClient { sp<IMemoryHeap> mHeap; uint32_t mWidth; uint32_t mHeight; PixelFormat mFormat; public: ScreenshotClient(); // frees the previous screenshot and capture a new one status_t update(); status_t update(uint32_t reqWidth, uint32_t reqHeight); // release memory occupied by the screenshot void release(); // pixels are valid until this object is freed or // release() or update() is called void const* getPixels() const; uint32_t getWidth() const; uint32_t getHeight() const; PixelFormat getFormat() const; uint32_t getStride() const; // size of allocated memory in bytes size_t getSize() const; }; // --------------------------------------------------------------------------- }; // namespace android Loading libs/surfaceflinger_client/ISurfaceComposer.cpp +8 −2 Original line number Diff line number Diff line Loading @@ -126,11 +126,14 @@ public: virtual status_t captureScreen(DisplayID dpy, sp<IMemoryHeap>* heap, uint32_t* width, uint32_t* height, PixelFormat* format) uint32_t* width, uint32_t* height, PixelFormat* format, uint32_t reqWidth, uint32_t reqHeight) { Parcel data, reply; data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); data.writeInt32(dpy); data.writeInt32(reqWidth); data.writeInt32(reqHeight); remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN, data, &reply); *heap = interface_cast<IMemoryHeap>(reply.readStrongBinder()); *width = reply.readInt32(); Loading Loading @@ -208,10 +211,13 @@ status_t BnSurfaceComposer::onTransact( case CAPTURE_SCREEN: { CHECK_INTERFACE(ISurfaceComposer, data, reply); DisplayID dpy = data.readInt32(); uint32_t reqWidth = data.readInt32(); uint32_t reqHeight = data.readInt32(); sp<IMemoryHeap> heap; uint32_t w, h; PixelFormat f; status_t res = captureScreen(dpy, &heap, &w, &h, &f); status_t res = captureScreen(dpy, &heap, &w, &h, &f, reqWidth, reqHeight); reply->writeStrongBinder(heap->asBinder()); reply->writeInt32(w); reply->writeInt32(h); Loading libs/surfaceflinger_client/SurfaceComposerClient.cpp +50 −0 Original line number Diff line number Diff line Loading @@ -544,6 +544,56 @@ status_t SurfaceComposerClient::setFreezeTint(SurfaceID id, uint32_t tint) return NO_ERROR; } // ---------------------------------------------------------------------------- ScreenshotClient::ScreenshotClient() : mWidth(0), mHeight(0), mFormat(PIXEL_FORMAT_NONE) { } status_t ScreenshotClient::update() { sp<ISurfaceComposer> s(ComposerService::getComposerService()); if (s == NULL) return NO_INIT; mHeap = 0; return s->captureScreen(0, &mHeap, &mWidth, &mHeight, &mFormat, 0, 0); } status_t ScreenshotClient::update(uint32_t reqWidth, uint32_t reqHeight) { sp<ISurfaceComposer> s(ComposerService::getComposerService()); if (s == NULL) return NO_INIT; mHeap = 0; return s->captureScreen(0, &mHeap, &mWidth, &mHeight, &mFormat, reqWidth, reqHeight); } void ScreenshotClient::release() { mHeap = 0; } void const* ScreenshotClient::getPixels() const { return mHeap->getBase(); } uint32_t ScreenshotClient::getWidth() const { return mWidth; } uint32_t ScreenshotClient::getHeight() const { return mHeight; } PixelFormat ScreenshotClient::getFormat() const { return mFormat; } uint32_t ScreenshotClient::getStride() const { return mWidth; } size_t ScreenshotClient::getSize() const { return mHeap->getSize(); } // ---------------------------------------------------------------------------- }; // namespace android services/surfaceflinger/Layer.cpp +11 −0 Original line number Diff line number Diff line Loading @@ -214,6 +214,17 @@ slowpath: } } void Layer::drawForSreenShot() const { bool currentFixedSize = mFixedSize; bool currentBlending = mNeedsBlending; const_cast<Layer*>(this)->mFixedSize = false; const_cast<Layer*>(this)->mFixedSize = true; LayerBase::drawForSreenShot(); const_cast<Layer*>(this)->mFixedSize = currentFixedSize; const_cast<Layer*>(this)->mNeedsBlending = currentBlending; } void Layer::onDraw(const Region& clip) const { Texture tex(mBufferManager.getActiveTexture()); Loading Loading
include/surfaceflinger/ISurfaceComposer.h +2 −1 Original line number Diff line number Diff line Loading @@ -115,7 +115,8 @@ public: */ virtual status_t captureScreen(DisplayID dpy, sp<IMemoryHeap>* heap, uint32_t* width, uint32_t* height, PixelFormat* format) = 0; uint32_t* width, uint32_t* height, PixelFormat* format, uint32_t reqWidth, uint32_t reqHeight) = 0; /* Signal surfaceflinger that there might be some work to do * This is an ASYNCHRONOUS call. Loading
include/surfaceflinger/SurfaceComposerClient.h +30 −0 Original line number Diff line number Diff line Loading @@ -169,6 +169,36 @@ private: sp<ISurfaceComposerClient> mClient; }; // --------------------------------------------------------------------------- class ScreenshotClient { sp<IMemoryHeap> mHeap; uint32_t mWidth; uint32_t mHeight; PixelFormat mFormat; public: ScreenshotClient(); // frees the previous screenshot and capture a new one status_t update(); status_t update(uint32_t reqWidth, uint32_t reqHeight); // release memory occupied by the screenshot void release(); // pixels are valid until this object is freed or // release() or update() is called void const* getPixels() const; uint32_t getWidth() const; uint32_t getHeight() const; PixelFormat getFormat() const; uint32_t getStride() const; // size of allocated memory in bytes size_t getSize() const; }; // --------------------------------------------------------------------------- }; // namespace android Loading
libs/surfaceflinger_client/ISurfaceComposer.cpp +8 −2 Original line number Diff line number Diff line Loading @@ -126,11 +126,14 @@ public: virtual status_t captureScreen(DisplayID dpy, sp<IMemoryHeap>* heap, uint32_t* width, uint32_t* height, PixelFormat* format) uint32_t* width, uint32_t* height, PixelFormat* format, uint32_t reqWidth, uint32_t reqHeight) { Parcel data, reply; data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); data.writeInt32(dpy); data.writeInt32(reqWidth); data.writeInt32(reqHeight); remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN, data, &reply); *heap = interface_cast<IMemoryHeap>(reply.readStrongBinder()); *width = reply.readInt32(); Loading Loading @@ -208,10 +211,13 @@ status_t BnSurfaceComposer::onTransact( case CAPTURE_SCREEN: { CHECK_INTERFACE(ISurfaceComposer, data, reply); DisplayID dpy = data.readInt32(); uint32_t reqWidth = data.readInt32(); uint32_t reqHeight = data.readInt32(); sp<IMemoryHeap> heap; uint32_t w, h; PixelFormat f; status_t res = captureScreen(dpy, &heap, &w, &h, &f); status_t res = captureScreen(dpy, &heap, &w, &h, &f, reqWidth, reqHeight); reply->writeStrongBinder(heap->asBinder()); reply->writeInt32(w); reply->writeInt32(h); Loading
libs/surfaceflinger_client/SurfaceComposerClient.cpp +50 −0 Original line number Diff line number Diff line Loading @@ -544,6 +544,56 @@ status_t SurfaceComposerClient::setFreezeTint(SurfaceID id, uint32_t tint) return NO_ERROR; } // ---------------------------------------------------------------------------- ScreenshotClient::ScreenshotClient() : mWidth(0), mHeight(0), mFormat(PIXEL_FORMAT_NONE) { } status_t ScreenshotClient::update() { sp<ISurfaceComposer> s(ComposerService::getComposerService()); if (s == NULL) return NO_INIT; mHeap = 0; return s->captureScreen(0, &mHeap, &mWidth, &mHeight, &mFormat, 0, 0); } status_t ScreenshotClient::update(uint32_t reqWidth, uint32_t reqHeight) { sp<ISurfaceComposer> s(ComposerService::getComposerService()); if (s == NULL) return NO_INIT; mHeap = 0; return s->captureScreen(0, &mHeap, &mWidth, &mHeight, &mFormat, reqWidth, reqHeight); } void ScreenshotClient::release() { mHeap = 0; } void const* ScreenshotClient::getPixels() const { return mHeap->getBase(); } uint32_t ScreenshotClient::getWidth() const { return mWidth; } uint32_t ScreenshotClient::getHeight() const { return mHeight; } PixelFormat ScreenshotClient::getFormat() const { return mFormat; } uint32_t ScreenshotClient::getStride() const { return mWidth; } size_t ScreenshotClient::getSize() const { return mHeap->getSize(); } // ---------------------------------------------------------------------------- }; // namespace android
services/surfaceflinger/Layer.cpp +11 −0 Original line number Diff line number Diff line Loading @@ -214,6 +214,17 @@ slowpath: } } void Layer::drawForSreenShot() const { bool currentFixedSize = mFixedSize; bool currentBlending = mNeedsBlending; const_cast<Layer*>(this)->mFixedSize = false; const_cast<Layer*>(this)->mFixedSize = true; LayerBase::drawForSreenShot(); const_cast<Layer*>(this)->mFixedSize = currentFixedSize; const_cast<Layer*>(this)->mNeedsBlending = currentBlending; } void Layer::onDraw(const Region& clip) const { Texture tex(mBufferManager.getActiveTexture()); Loading