diff options
Diffstat (limited to 'services/surfaceflinger/RenderEngine')
5 files changed, 38 insertions, 10 deletions
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; |