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);
}