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

Commit 2660a3ec authored by Romain Guy's avatar Romain Guy
Browse files

Move the drawable state to the correct class.

Bug #4170455

The state tracking whether the Paint's shader should be rebuilt was kept in the
wrong class. This lead to the Drawable keeping track of the dirty status of the
Paint stored in the ConstantState. This of course does not work properly when
several drawables are inflated form the same ConstantState. This change fixes
the issue by moving the dirty Paint state to the ConstantState class. This is
allowed to work because of the single-thread rule enforced by the UI toolkit.

Change-Id: I9bb31d8e7335d6bb418470b59ae25d9085d7bd23
parent 60355780
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -67,7 +67,6 @@ public class BitmapDrawable extends Drawable {
    private final Rect mDstRect = new Rect();   // Gravity.apply() sets this

    private boolean mApplyGravity;
    private boolean mRebuildShader;
    private boolean mMutated;
    
     // These are scaled to match the target density.
@@ -348,7 +347,7 @@ public class BitmapDrawable extends Drawable {
        if (state.mTileModeX != xmode || state.mTileModeY != ymode) {
            state.mTileModeX = xmode;
            state.mTileModeY = ymode;
            mRebuildShader = true;
            state.mRebuildShader = true;
            invalidateSelf();
        }
    }
@@ -369,7 +368,7 @@ public class BitmapDrawable extends Drawable {
        Bitmap bitmap = mBitmap;
        if (bitmap != null) {
            final BitmapState state = mBitmapState;
            if (mRebuildShader) {
            if (state.mRebuildShader) {
                Shader.TileMode tmx = state.mTileModeX;
                Shader.TileMode tmy = state.mTileModeY;

@@ -380,7 +379,7 @@ public class BitmapDrawable extends Drawable {
                            tmx == null ? Shader.TileMode.CLAMP : tmx,
                            tmy == null ? Shader.TileMode.CLAMP : tmy));
                }
                mRebuildShader = false;
                state.mRebuildShader = false;
                copyBounds(mDstRect);
            }

@@ -424,7 +423,6 @@ public class BitmapDrawable extends Drawable {
    public Drawable mutate() {
        if (!mMutated && super.mutate() == this) {
            mBitmapState = new BitmapState(mBitmapState);
            mRebuildShader = true;
            mMutated = true;
        }
        return this;
@@ -511,6 +509,7 @@ public class BitmapDrawable extends Drawable {
        Shader.TileMode mTileModeX = null;
        Shader.TileMode mTileModeY = null;
        int mTargetDensity = DisplayMetrics.DENSITY_DEFAULT;
        boolean mRebuildShader;

        BitmapState(Bitmap bitmap) {
            mBitmap = bitmap;
@@ -524,6 +523,7 @@ public class BitmapDrawable extends Drawable {
            mTileModeY = bitmapState.mTileModeY;
            mTargetDensity = bitmapState.mTargetDensity;
            mPaint = new Paint(bitmapState.mPaint);
            mRebuildShader = bitmapState.mRebuildShader;
        }

        @Override