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
This commit is contained in:
parent
172a62a224
commit
91a6826d67
@ -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;
|
||||
|
@ -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]);
|
||||
|
Loading…
Reference in New Issue
Block a user