summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jamie Gennis <jgennis@google.com> 2012-04-16 13:41:05 -0700
committer Jamie Gennis <jgennis@google.com> 2012-04-16 20:33:54 -0700
commit91a6826d6794c19cdedfa58c42f8820c5cf5fe2b (patch)
tree519a4a2e88447a271201b2a98af62e76a5856856
parent172a62a224967beee9e35e02a5b2fb2705dd2cc0 (diff)
SurfaceTexture: shrink all sides when cropping
This change makes SurfaceTexture include an offset for all sides of the crop region when cropping. This keeps the image centered, to minimize the visual changes when switching between the texture transform matrix-based cropping and something that does proper cropping (e.g. HWComposer). Change-Id: I541d3046fd92e49221b488444df36d490924d1c5
-rw-r--r--libs/gui/SurfaceTexture.cpp32
-rw-r--r--libs/gui/tests/SurfaceTextureClient_test.cpp6
2 files changed, 13 insertions, 25 deletions
diff --git a/libs/gui/SurfaceTexture.cpp b/libs/gui/SurfaceTexture.cpp
index 0fa9ca1ed7..ed1ea4ec54 100644
--- a/libs/gui/SurfaceTexture.cpp
+++ b/libs/gui/SurfaceTexture.cpp
@@ -542,28 +542,16 @@ void SurfaceTexture::computeCurrentTransformMatrix() {
// decoder, camera, etc.) would simply not use a crop rectangle (or at
// least not tell the framework about it) so that the GPU can do the
// correct edge behavior.
- int xshrink = 0, yshrink = 0;
- if (mCurrentCrop.left > 0) {
- tx = float(mCurrentCrop.left + 1) / float(buf->getWidth());
- xshrink++;
- } else {
- tx = 0.0f;
- }
- if (mCurrentCrop.right < int32_t(buf->getWidth())) {
- xshrink++;
- }
- if (mCurrentCrop.bottom < int32_t(buf->getHeight())) {
- ty = (float(buf->getHeight() - mCurrentCrop.bottom) + 1.0f) /
- float(buf->getHeight());
- yshrink++;
- } else {
- ty = 0.0f;
- }
- if (mCurrentCrop.top > 0) {
- yshrink++;
- }
- sx = float(mCurrentCrop.width() - xshrink) / float(buf->getWidth());
- sy = float(mCurrentCrop.height() - yshrink) / float(buf->getHeight());
+ const float shrinkAmount = 1.0f; // the amount that each edge is shrunk
+
+ tx = (float(mCurrentCrop.left) + shrinkAmount) /
+ float(buf->getWidth());
+ ty = (float(buf->getHeight() - mCurrentCrop.bottom) +
+ shrinkAmount) / float(buf->getHeight());
+ sx = (float(mCurrentCrop.width()) - (2.0f * shrinkAmount)) /
+ float(buf->getWidth());
+ sy = (float(mCurrentCrop.height()) - (2.0f * shrinkAmount)) /
+ float(buf->getHeight());
} else {
tx = 0.0f;
ty = 0.0f;
diff --git a/libs/gui/tests/SurfaceTextureClient_test.cpp b/libs/gui/tests/SurfaceTextureClient_test.cpp
index aa1f94e659..b576ca573b 100644
--- a/libs/gui/tests/SurfaceTextureClient_test.cpp
+++ b/libs/gui/tests/SurfaceTextureClient_test.cpp
@@ -580,13 +580,13 @@ TEST_F(SurfaceTextureClientTest, GetTransformMatrixSucceedsAfterFreeingBuffersWi
// This accounts for the 1 texel shrink for each edge that's included in the
// transform matrix to avoid texturing outside the crop region.
- EXPECT_EQ(.5f, mtx[0]);
+ EXPECT_EQ(.375f, mtx[0]);
EXPECT_EQ(0.f, mtx[1]);
EXPECT_EQ(0.f, mtx[2]);
EXPECT_EQ(0.f, mtx[3]);
EXPECT_EQ(0.f, mtx[4]);
- EXPECT_EQ(-.5f, mtx[5]);
+ EXPECT_EQ(-.375f, mtx[5]);
EXPECT_EQ(0.f, mtx[6]);
EXPECT_EQ(0.f, mtx[7]);
@@ -595,7 +595,7 @@ TEST_F(SurfaceTextureClientTest, GetTransformMatrixSucceedsAfterFreeingBuffersWi
EXPECT_EQ(1.f, mtx[10]);
EXPECT_EQ(0.f, mtx[11]);
- EXPECT_EQ(0.f, mtx[12]);
+ EXPECT_EQ(.125f, mtx[12]);
EXPECT_EQ(.5f, mtx[13]);
EXPECT_EQ(0.f, mtx[14]);
EXPECT_EQ(1.f, mtx[15]);