summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Stoza <stoza@google.com>2014-05-28 18:31:39 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2014-05-28 18:31:40 +0000
commit3d5c8a98c1822e5f32f0b7e82a40f14f41769878 (patch)
tree987be3647fa786578a36ee9c02be1aa13e31f189
parent7eb2a1566a5c0a4a8a189df6dffe847e2c8b559c (diff)
parentc18790018be5d7ea7061ccbc81f3044e74adc823 (diff)
downloadframeworks_native-3d5c8a98c1822e5f32f0b7e82a40f14f41769878.zip
frameworks_native-3d5c8a98c1822e5f32f0b7e82a40f14f41769878.tar.gz
frameworks_native-3d5c8a98c1822e5f32f0b7e82a40f14f41769878.tar.bz2
Merge "SurfaceFlinger: Add sourceCrop to screenshot"
-rw-r--r--include/gui/ISurfaceComposer.h4
-rw-r--r--include/gui/SurfaceComposerClient.h15
-rw-r--r--libs/gui/ISurfaceComposer.cpp7
-rw-r--r--libs/gui/SurfaceComposerClient.cpp18
-rw-r--r--libs/gui/tests/Surface_test.cpp5
-rw-r--r--services/surfaceflinger/DisplayDevice.cpp3
-rw-r--r--services/surfaceflinger/RenderEngine/GLES11RenderEngine.cpp20
-rw-r--r--services/surfaceflinger/RenderEngine/GLES11RenderEngine.h3
-rw-r--r--services/surfaceflinger/RenderEngine/GLES20RenderEngine.cpp19
-rw-r--r--services/surfaceflinger/RenderEngine/GLES20RenderEngine.h3
-rw-r--r--services/surfaceflinger/RenderEngine/RenderEngine.h3
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp41
-rw-r--r--services/surfaceflinger/SurfaceFlinger.h6
13 files changed, 104 insertions, 43 deletions
diff --git a/include/gui/ISurfaceComposer.h b/include/gui/ISurfaceComposer.h
index 8042211..1581084 100644
--- a/include/gui/ISurfaceComposer.h
+++ b/include/gui/ISurfaceComposer.h
@@ -41,6 +41,7 @@ class DisplayState;
class DisplayInfo;
class IDisplayEventConnection;
class IMemoryHeap;
+class Rect;
/*
* This class defines the Binder IPC interface for accessing various
@@ -131,11 +132,10 @@ public:
*/
virtual status_t captureScreen(const sp<IBinder>& display,
const sp<IGraphicBufferProducer>& producer,
- uint32_t reqWidth, uint32_t reqHeight,
+ Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
uint32_t minLayerZ, uint32_t maxLayerZ,
bool useIdentityTransform) = 0;
-
/* Clears the frame statistics for animations.
*
* Requires the ACCESS_SURFACE_FLINGER permission.
diff --git a/include/gui/SurfaceComposerClient.h b/include/gui/SurfaceComposerClient.h
index c2192af..e666329 100644
--- a/include/gui/SurfaceComposerClient.h
+++ b/include/gui/SurfaceComposerClient.h
@@ -180,10 +180,12 @@ private:
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,
const sp<IGraphicBufferProducer>& producer,
- uint32_t reqWidth, uint32_t reqHeight,
+ Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
uint32_t minLayerZ, uint32_t maxLayerZ,
bool useIdentityTransform);
@@ -197,13 +199,16 @@ public:
ScreenshotClient();
~ScreenshotClient();
- // frees the previous screenshot and capture a new one
- status_t update(const sp<IBinder>& display, bool useIdentityTransform);
+ // frees the previous screenshot and captures a new one
+ // if cropping isn't required, callers may pass in a default Rect, e.g.:
+ // update(display, Rect(), useIdentityTransform);
status_t update(const sp<IBinder>& display,
- uint32_t reqWidth, uint32_t reqHeight,
+ Rect sourceCrop, bool useIdentityTransform);
+ status_t update(const sp<IBinder>& display,
+ Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
bool useIdentityTransform);
status_t update(const sp<IBinder>& display,
- uint32_t reqWidth, uint32_t reqHeight,
+ Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
uint32_t minLayerZ, uint32_t maxLayerZ,
bool useIdentityTransform);
diff --git a/libs/gui/ISurfaceComposer.cpp b/libs/gui/ISurfaceComposer.cpp
index 58a2ae2..c6c88a9 100644
--- a/libs/gui/ISurfaceComposer.cpp
+++ b/libs/gui/ISurfaceComposer.cpp
@@ -104,7 +104,7 @@ public:
virtual status_t captureScreen(const sp<IBinder>& display,
const sp<IGraphicBufferProducer>& producer,
- uint32_t reqWidth, uint32_t reqHeight,
+ Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
uint32_t minLayerZ, uint32_t maxLayerZ,
bool useIdentityTransform)
{
@@ -112,6 +112,7 @@ public:
data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
data.writeStrongBinder(display);
data.writeStrongBinder(producer->asBinder());
+ data.write(sourceCrop);
data.writeInt32(reqWidth);
data.writeInt32(reqHeight);
data.writeInt32(minLayerZ);
@@ -328,6 +329,8 @@ status_t BnSurfaceComposer::onTransact(
sp<IBinder> display = data.readStrongBinder();
sp<IGraphicBufferProducer> producer =
interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
+ Rect sourceCrop;
+ data.read(sourceCrop);
uint32_t reqWidth = data.readInt32();
uint32_t reqHeight = data.readInt32();
uint32_t minLayerZ = data.readInt32();
@@ -335,7 +338,7 @@ status_t BnSurfaceComposer::onTransact(
bool useIdentityTransform = static_cast<bool>(data.readInt32());
status_t res = captureScreen(display, producer,
- reqWidth, reqHeight, minLayerZ, maxLayerZ,
+ sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
useIdentityTransform);
reply->writeInt32(res);
return NO_ERROR;
diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp
index 1dffdb2..eedeca1 100644
--- a/libs/gui/SurfaceComposerClient.cpp
+++ b/libs/gui/SurfaceComposerClient.cpp
@@ -676,11 +676,11 @@ status_t SurfaceComposerClient::getAnimationFrameStats(FrameStats* outStats) {
status_t ScreenshotClient::capture(
const sp<IBinder>& display,
const sp<IGraphicBufferProducer>& producer,
- uint32_t reqWidth, uint32_t reqHeight,
+ Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
uint32_t minLayerZ, uint32_t maxLayerZ, bool useIdentityTransform) {
sp<ISurfaceComposer> s(ComposerService::getComposerService());
if (s == NULL) return NO_INIT;
- return s->captureScreen(display, producer,
+ return s->captureScreen(display, producer, sourceCrop,
reqWidth, reqHeight, minLayerZ, maxLayerZ, useIdentityTransform);
}
@@ -704,7 +704,7 @@ sp<CpuConsumer> ScreenshotClient::getCpuConsumer() const {
}
status_t ScreenshotClient::update(const sp<IBinder>& display,
- uint32_t reqWidth, uint32_t reqHeight,
+ Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
uint32_t minLayerZ, uint32_t maxLayerZ,
bool useIdentityTransform) {
sp<ISurfaceComposer> s(ComposerService::getComposerService());
@@ -717,7 +717,7 @@ status_t ScreenshotClient::update(const sp<IBinder>& display,
mHaveBuffer = false;
}
- status_t err = s->captureScreen(display, mProducer,
+ status_t err = s->captureScreen(display, mProducer, sourceCrop,
reqWidth, reqHeight, minLayerZ, maxLayerZ, useIdentityTransform);
if (err == NO_ERROR) {
@@ -729,16 +729,16 @@ status_t ScreenshotClient::update(const sp<IBinder>& display,
return err;
}
-status_t ScreenshotClient::update(const sp<IBinder>& display,
+status_t ScreenshotClient::update(const sp<IBinder>& display, Rect sourceCrop,
bool useIdentityTransform) {
- return ScreenshotClient::update(display, 0, 0, 0, -1UL,
+ return ScreenshotClient::update(display, sourceCrop, 0, 0, 0, -1UL,
useIdentityTransform);
}
-status_t ScreenshotClient::update(const sp<IBinder>& display,
+status_t ScreenshotClient::update(const sp<IBinder>& display, Rect sourceCrop,
uint32_t reqWidth, uint32_t reqHeight, bool useIdentityTransform) {
- return ScreenshotClient::update(display, reqWidth, reqHeight, 0, -1UL,
- useIdentityTransform);
+ return ScreenshotClient::update(display, sourceCrop, reqWidth, reqHeight,
+ 0, -1UL, useIdentityTransform);
}
void ScreenshotClient::release() {
diff --git a/libs/gui/tests/Surface_test.cpp b/libs/gui/tests/Surface_test.cpp
index bf87fad..5e6aeef 100644
--- a/libs/gui/tests/Surface_test.cpp
+++ b/libs/gui/tests/Surface_test.cpp
@@ -21,6 +21,7 @@
#include <gui/Surface.h>
#include <gui/SurfaceComposerClient.h>
#include <gui/BufferItemConsumer.h>
+#include <ui/Rect.h>
#include <utils/String8.h>
#include <private/gui/ComposerService.h>
@@ -94,7 +95,7 @@ TEST_F(SurfaceTest, ScreenshotsOfProtectedBuffersSucceed) {
sp<CpuConsumer> cpuConsumer = new CpuConsumer(consumer, 1);
sp<ISurfaceComposer> sf(ComposerService::getComposerService());
sp<IBinder> display(sf->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain));
- ASSERT_EQ(NO_ERROR, sf->captureScreen(display, producer,
+ ASSERT_EQ(NO_ERROR, sf->captureScreen(display, producer, Rect(),
64, 64, 0, 0x7fffffff, false));
// Set the PROTECTED usage bit and verify that the screenshot fails. Note
@@ -123,7 +124,7 @@ TEST_F(SurfaceTest, ScreenshotsOfProtectedBuffersSucceed) {
&buf));
ASSERT_EQ(NO_ERROR, anw->queueBuffer(anw.get(), buf, -1));
}
- ASSERT_EQ(NO_ERROR, sf->captureScreen(display, producer,
+ ASSERT_EQ(NO_ERROR, sf->captureScreen(display, producer, Rect(),
64, 64, 0, 0x7fffffff, false));
}
diff --git a/services/surfaceflinger/DisplayDevice.cpp b/services/surfaceflinger/DisplayDevice.cpp
index 42993b9..4ebe291 100644
--- a/services/surfaceflinger/DisplayDevice.cpp
+++ b/services/surfaceflinger/DisplayDevice.cpp
@@ -283,7 +283,8 @@ EGLBoolean DisplayDevice::makeCurrent(EGLDisplay dpy, EGLContext ctx) const {
void DisplayDevice::setViewportAndProjection() const {
size_t w = mDisplayWidth;
size_t h = mDisplayHeight;
- mFlinger->getRenderEngine().setViewportAndProjection(w, h, w, h, false);
+ Rect sourceCrop(0, 0, w, h);
+ mFlinger->getRenderEngine().setViewportAndProjection(w, h, sourceCrop, h, false);
}
// ----------------------------------------------------------------------------
diff --git a/services/surfaceflinger/RenderEngine/GLES11RenderEngine.cpp b/services/surfaceflinger/RenderEngine/GLES11RenderEngine.cpp
index cbff320..d1e324c 100644
--- a/services/surfaceflinger/RenderEngine/GLES11RenderEngine.cpp
+++ b/services/surfaceflinger/RenderEngine/GLES11RenderEngine.cpp
@@ -17,6 +17,8 @@
#include <GLES/gl.h>
#include <GLES/glext.h>
+#include <ui/Rect.h>
+
#include <utils/String8.h>
#include <cutils/compiler.h>
@@ -72,13 +74,23 @@ size_t GLES11RenderEngine::getMaxViewportDims() const {
}
void GLES11RenderEngine::setViewportAndProjection(
- size_t vpw, size_t vph, size_t w, size_t h, bool yswap) {
+ size_t vpw, size_t vph, Rect sourceCrop, size_t hwh, bool yswap) {
glViewport(0, 0, vpw, vph);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
- // put the origin in the left-bottom corner
- if (yswap) glOrthof(0, w, h, 0, 0, 1);
- else glOrthof(0, w, 0, h, 0, 1);
+
+ size_t l = sourceCrop.left;
+ size_t r = sourceCrop.right;
+
+ // In GL, (0, 0) is the bottom-left corner, so flip y coordinates
+ size_t t = hwh - sourceCrop.top;
+ size_t b = hwh - sourceCrop.bottom;
+
+ if (yswap) {
+ glOrthof(l, r, t, b, 0, 1);
+ } else {
+ glOrthof(l, r, b, t, 0, 1);
+ }
glMatrixMode(GL_MODELVIEW);
}
diff --git a/services/surfaceflinger/RenderEngine/GLES11RenderEngine.h b/services/surfaceflinger/RenderEngine/GLES11RenderEngine.h
index cd53aab..1a94592 100644
--- a/services/surfaceflinger/RenderEngine/GLES11RenderEngine.h
+++ b/services/surfaceflinger/RenderEngine/GLES11RenderEngine.h
@@ -49,7 +49,8 @@ protected:
virtual ~GLES11RenderEngine();
virtual void dump(String8& result);
- virtual void setViewportAndProjection(size_t vpw, size_t vph, size_t w, size_t h, bool yswap);
+ virtual void setViewportAndProjection(size_t vpw, size_t vph,
+ Rect sourceCrop, size_t hwh, bool yswap);
virtual void setupLayerBlending(bool premultipliedAlpha, bool opaque, int alpha);
virtual void setupDimLayerBlending(int alpha);
virtual void setupLayerTexturing(const Texture& texture);
diff --git a/services/surfaceflinger/RenderEngine/GLES20RenderEngine.cpp b/services/surfaceflinger/RenderEngine/GLES20RenderEngine.cpp
index a2a6270..8c1f04e 100644
--- a/services/surfaceflinger/RenderEngine/GLES20RenderEngine.cpp
+++ b/services/surfaceflinger/RenderEngine/GLES20RenderEngine.cpp
@@ -19,6 +19,8 @@
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
+#include <ui/Rect.h>
+
#include <utils/String8.h>
#include <utils/Trace.h>
@@ -78,10 +80,21 @@ size_t GLES20RenderEngine::getMaxViewportDims() const {
}
void GLES20RenderEngine::setViewportAndProjection(
- size_t vpw, size_t vph, size_t w, size_t h, bool yswap) {
+ size_t vpw, size_t vph, Rect sourceCrop, size_t hwh, bool yswap) {
+
+ size_t l = sourceCrop.left;
+ size_t r = sourceCrop.right;
+
+ // In GL, (0, 0) is the bottom-left corner, so flip y coordinates
+ size_t t = hwh - sourceCrop.top;
+ size_t b = hwh - sourceCrop.bottom;
+
mat4 m;
- if (yswap) m = mat4::ortho(0, w, h, 0, 0, 1);
- else m = mat4::ortho(0, w, 0, h, 0, 1);
+ if (yswap) {
+ m = mat4::ortho(l, r, t, b, 0, 1);
+ } else {
+ m = mat4::ortho(l, r, b, t, 0, 1);
+ }
glViewport(0, 0, vpw, vph);
mState.setProjectionMatrix(m);
diff --git a/services/surfaceflinger/RenderEngine/GLES20RenderEngine.h b/services/surfaceflinger/RenderEngine/GLES20RenderEngine.h
index 8b67fcc..b6d32fc 100644
--- a/services/surfaceflinger/RenderEngine/GLES20RenderEngine.h
+++ b/services/surfaceflinger/RenderEngine/GLES20RenderEngine.h
@@ -64,7 +64,8 @@ protected:
virtual ~GLES20RenderEngine();
virtual void dump(String8& result);
- virtual void setViewportAndProjection(size_t vpw, size_t vph, size_t w, size_t h, bool yswap);
+ virtual void setViewportAndProjection(size_t vpw, size_t vph,
+ Rect sourceCrop, size_t hwh, bool yswap);
virtual void setupLayerBlending(bool premultipliedAlpha, bool opaque, int alpha);
virtual void setupDimLayerBlending(int alpha);
virtual void setupLayerTexturing(const Texture& texture);
diff --git a/services/surfaceflinger/RenderEngine/RenderEngine.h b/services/surfaceflinger/RenderEngine/RenderEngine.h
index 577dc0a..a2d8242 100644
--- a/services/surfaceflinger/RenderEngine/RenderEngine.h
+++ b/services/surfaceflinger/RenderEngine/RenderEngine.h
@@ -89,7 +89,8 @@ public:
// set-up
virtual void checkErrors() const;
- virtual void setViewportAndProjection(size_t vpw, size_t vph, size_t w, size_t h, bool yswap) = 0;
+ virtual void setViewportAndProjection(size_t vpw, size_t vph,
+ Rect sourceCrop, size_t hwh, bool yswap) = 0;
virtual void setupLayerBlending(bool premultipliedAlpha, bool opaque, int alpha) = 0;
virtual void setupDimLayerBlending(int alpha) = 0;
virtual void setupLayerTexturing(const Texture& texture) = 0;
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 59afa66..7152f93 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -2790,7 +2790,7 @@ public:
status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
const sp<IGraphicBufferProducer>& producer,
- uint32_t reqWidth, uint32_t reqHeight,
+ Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
uint32_t minLayerZ, uint32_t maxLayerZ,
bool useIdentityTransform) {
@@ -2816,6 +2816,7 @@ status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
SurfaceFlinger* flinger;
sp<IBinder> display;
sp<IGraphicBufferProducer> producer;
+ Rect sourceCrop;
uint32_t reqWidth, reqHeight;
uint32_t minLayerZ,maxLayerZ;
bool useIdentityTransform;
@@ -2824,11 +2825,11 @@ status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
MessageCaptureScreen(SurfaceFlinger* flinger,
const sp<IBinder>& display,
const sp<IGraphicBufferProducer>& producer,
- uint32_t reqWidth, uint32_t reqHeight,
+ Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
uint32_t minLayerZ, uint32_t maxLayerZ,
bool useIdentityTransform)
: flinger(flinger), display(display), producer(producer),
- reqWidth(reqWidth), reqHeight(reqHeight),
+ sourceCrop(sourceCrop), reqWidth(reqWidth), reqHeight(reqHeight),
minLayerZ(minLayerZ), maxLayerZ(maxLayerZ),
useIdentityTransform(useIdentityTransform),
result(PERMISSION_DENIED)
@@ -2841,7 +2842,7 @@ status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
Mutex::Autolock _l(flinger->mStateLock);
sp<const DisplayDevice> hw(flinger->getDisplayDevice(display));
result = flinger->captureScreenImplLocked(hw, producer,
- reqWidth, reqHeight, minLayerZ, maxLayerZ,
+ sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
useIdentityTransform);
static_cast<GraphicProducerWrapper*>(producer->asBinder().get())->exit(result);
return true;
@@ -2864,7 +2865,8 @@ status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
// which does the marshaling work forwards to our "fake remote" above.
sp<MessageBase> msg = new MessageCaptureScreen(this,
display, IGraphicBufferProducer::asInterface( wrapper ),
- reqWidth, reqHeight, minLayerZ, maxLayerZ, useIdentityTransform);
+ sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
+ useIdentityTransform);
status_t res = postMessageAsync(msg);
if (res == NO_ERROR) {
@@ -2876,7 +2878,7 @@ status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
void SurfaceFlinger::renderScreenImplLocked(
const sp<const DisplayDevice>& hw,
- uint32_t reqWidth, uint32_t reqHeight,
+ Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
uint32_t minLayerZ, uint32_t maxLayerZ,
bool yswap, bool useIdentityTransform)
{
@@ -2888,11 +2890,32 @@ void SurfaceFlinger::renderScreenImplLocked(
const uint32_t hw_h = hw->getHeight();
const bool filtering = reqWidth != hw_w || reqWidth != hw_h;
+ // if a default or invalid sourceCrop is passed in, set reasonable values
+ if (sourceCrop.width() == 0 || sourceCrop.height() == 0 ||
+ !sourceCrop.isValid()) {
+ sourceCrop.setLeftTop(Point(0, 0));
+ sourceCrop.setRightBottom(Point(hw_w, hw_h));
+ }
+
+ // ensure that sourceCrop is inside screen
+ if (sourceCrop.left < 0) {
+ ALOGE("Invalid crop rect: l = %d (< 0)", sourceCrop.left);
+ }
+ if (sourceCrop.right >= hw_w) {
+ ALOGE("Invalid crop rect: r = %d (>= %d)", sourceCrop.right, hw_w);
+ }
+ if (sourceCrop.top < 0) {
+ ALOGE("Invalid crop rect: t = %d (< 0)", sourceCrop.top);
+ }
+ if (sourceCrop.bottom >= hw_h) {
+ ALOGE("Invalid crop rect: b = %d (>= %d)", sourceCrop.bottom, hw_h);
+ }
+
// make sure to clear all GL error flags
engine.checkErrors();
// set-up our viewport
- engine.setViewportAndProjection(reqWidth, reqHeight, hw_w, hw_h, yswap);
+ engine.setViewportAndProjection(reqWidth, reqHeight, sourceCrop, hw_h, yswap);
engine.disableTexturing();
// redraw the screen entirely...
@@ -2923,7 +2946,7 @@ void SurfaceFlinger::renderScreenImplLocked(
status_t SurfaceFlinger::captureScreenImplLocked(
const sp<const DisplayDevice>& hw,
const sp<IGraphicBufferProducer>& producer,
- uint32_t reqWidth, uint32_t reqHeight,
+ Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
uint32_t minLayerZ, uint32_t maxLayerZ,
bool useIdentityTransform)
{
@@ -2978,7 +3001,7 @@ status_t SurfaceFlinger::captureScreenImplLocked(
// via an FBO, which means we didn't have to create
// an EGLSurface and therefore we're not
// dependent on the context's EGLConfig.
- renderScreenImplLocked(hw, reqWidth, reqHeight,
+ renderScreenImplLocked(hw, sourceCrop, reqWidth, reqHeight,
minLayerZ, maxLayerZ, true, useIdentityTransform);
// Create a sync point and wait on it, so we know the buffer is
diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h
index 0b868e2..cc01eb3 100644
--- a/services/surfaceflinger/SurfaceFlinger.h
+++ b/services/surfaceflinger/SurfaceFlinger.h
@@ -202,7 +202,7 @@ private:
virtual sp<IDisplayEventConnection> createDisplayEventConnection();
virtual status_t captureScreen(const sp<IBinder>& display,
const sp<IGraphicBufferProducer>& producer,
- uint32_t reqWidth, uint32_t reqHeight,
+ Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
uint32_t minLayerZ, uint32_t maxLayerZ,
bool useIdentityTransform);
// called when screen needs to turn off
@@ -311,14 +311,14 @@ private:
void renderScreenImplLocked(
const sp<const DisplayDevice>& hw,
- uint32_t reqWidth, uint32_t reqHeight,
+ Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
uint32_t minLayerZ, uint32_t maxLayerZ,
bool yswap, bool useIdentityTransform);
status_t captureScreenImplLocked(
const sp<const DisplayDevice>& hw,
const sp<IGraphicBufferProducer>& producer,
- uint32_t reqWidth, uint32_t reqHeight,
+ Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
uint32_t minLayerZ, uint32_t maxLayerZ,
bool useIdentityTransform);