SurfaceFlinger: Add sourceCrop to screenshot
Adds a sourceCrop Rect parameter to screenshot commands, which allows
clients to capture only a portion of the screen instead of the whole
screen.
Bug: 15137922
Change-Id: I629447573cd34ffb96334cde7ba02490b9ea06d8
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 @@
}
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 @@
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 @@
}
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 @@
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 @@
// 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;