diff options
| author | 2012-04-16 13:41:05 -0700 | |
|---|---|---|
| committer | 2012-04-16 20:33:54 -0700 | |
| commit | 91a6826d6794c19cdedfa58c42f8820c5cf5fe2b (patch) | |
| tree | 519a4a2e88447a271201b2a98af62e76a5856856 | |
| parent | 172a62a224967beee9e35e02a5b2fb2705dd2cc0 (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.cpp | 32 | ||||
| -rw-r--r-- | libs/gui/tests/SurfaceTextureClient_test.cpp | 6 |
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]); |