Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 91a6826d authored by Jamie Gennis's avatar Jamie Gennis
Browse files

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
parent 172a62a2
Loading
Loading
Loading
Loading
+10 −22
Original line number Original line Diff line number Diff line
@@ -542,28 +542,16 @@ void SurfaceTexture::computeCurrentTransformMatrix() {
        // decoder, camera, etc.) would simply not use a crop rectangle (or at
        // 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
        // least not tell the framework about it) so that the GPU can do the
        // correct edge behavior.
        // correct edge behavior.
        int xshrink = 0, yshrink = 0;
        const float shrinkAmount = 1.0f; // the amount that each edge is shrunk
        if (mCurrentCrop.left > 0) {

            tx = float(mCurrentCrop.left + 1) / float(buf->getWidth());
        tx = (float(mCurrentCrop.left) + shrinkAmount) /
            xshrink++;
                float(buf->getWidth());
        } else {
        ty = (float(buf->getHeight() - mCurrentCrop.bottom) +
            tx = 0.0f;
                shrinkAmount) / float(buf->getHeight());
        }
        sx = (float(mCurrentCrop.width()) - (2.0f * shrinkAmount)) /
        if (mCurrentCrop.right < int32_t(buf->getWidth())) {
                float(buf->getWidth());
            xshrink++;
        sy = (float(mCurrentCrop.height()) - (2.0f * shrinkAmount)) /
        }
        if (mCurrentCrop.bottom < int32_t(buf->getHeight())) {
            ty = (float(buf->getHeight() - mCurrentCrop.bottom) + 1.0f) /
                float(buf->getHeight());
                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());
    } else {
    } else {
        tx = 0.0f;
        tx = 0.0f;
        ty = 0.0f;
        ty = 0.0f;
+3 −3
Original line number Original line Diff line number Diff line
@@ -580,13 +580,13 @@ TEST_F(SurfaceTextureClientTest, GetTransformMatrixSucceedsAfterFreeingBuffersWi


    // This accounts for the 1 texel shrink for each edge that's included in the
    // This accounts for the 1 texel shrink for each edge that's included in the
    // transform matrix to avoid texturing outside the crop region.
    // 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[1]);
    EXPECT_EQ(0.f, mtx[2]);
    EXPECT_EQ(0.f, mtx[2]);
    EXPECT_EQ(0.f, mtx[3]);
    EXPECT_EQ(0.f, mtx[3]);


    EXPECT_EQ(0.f, mtx[4]);
    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[6]);
    EXPECT_EQ(0.f, mtx[7]);
    EXPECT_EQ(0.f, mtx[7]);


@@ -595,7 +595,7 @@ TEST_F(SurfaceTextureClientTest, GetTransformMatrixSucceedsAfterFreeingBuffersWi
    EXPECT_EQ(1.f, mtx[10]);
    EXPECT_EQ(1.f, mtx[10]);
    EXPECT_EQ(0.f, mtx[11]);
    EXPECT_EQ(0.f, mtx[11]);


    EXPECT_EQ(0.f, mtx[12]);
    EXPECT_EQ(.125f, mtx[12]);
    EXPECT_EQ(.5f, mtx[13]);
    EXPECT_EQ(.5f, mtx[13]);
    EXPECT_EQ(0.f, mtx[14]);
    EXPECT_EQ(0.f, mtx[14]);
    EXPECT_EQ(1.f, mtx[15]);
    EXPECT_EQ(1.f, mtx[15]);