summaryrefslogtreecommitdiffstats
path: root/graphics/java
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/java')
-rw-r--r--graphics/java/android/graphics/PorterDuff.java34
-rw-r--r--graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java2
-rw-r--r--graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java2
-rw-r--r--graphics/java/android/graphics/drawable/BitmapDrawable.java5
-rw-r--r--graphics/java/android/graphics/drawable/Drawable.java18
-rw-r--r--graphics/java/android/graphics/drawable/DrawableContainer.java10
-rw-r--r--graphics/java/android/graphics/drawable/GradientDrawable.java5
-rw-r--r--graphics/java/android/graphics/drawable/Icon.java93
-rw-r--r--graphics/java/android/graphics/drawable/LayerDrawable.java24
-rw-r--r--graphics/java/android/graphics/drawable/NinePatchDrawable.java5
-rw-r--r--graphics/java/android/graphics/drawable/RippleDrawable.java2
-rw-r--r--graphics/java/android/graphics/drawable/ShapeDrawable.java5
-rw-r--r--graphics/java/android/graphics/drawable/StateListDrawable.java25
-rw-r--r--graphics/java/android/graphics/drawable/VectorDrawable.java86
14 files changed, 230 insertions, 86 deletions
diff --git a/graphics/java/android/graphics/PorterDuff.java b/graphics/java/android/graphics/PorterDuff.java
index dcccf35..2bbbff3 100644
--- a/graphics/java/android/graphics/PorterDuff.java
+++ b/graphics/java/android/graphics/PorterDuff.java
@@ -67,4 +67,38 @@ public class PorterDuff {
*/
public final int nativeInt;
}
+
+ /**
+ * @hide
+ */
+ public static final int modeToInt(Mode mode) {
+ return mode.nativeInt;
+ }
+
+ /**
+ * @hide
+ */
+ public static final Mode intToMode(int val) {
+ switch (val) {
+ default:
+ case 0: return Mode.CLEAR;
+ case 1: return Mode.SRC;
+ case 2: return Mode.DST;
+ case 3: return Mode.SRC_OVER;
+ case 4: return Mode.DST_OVER;
+ case 5: return Mode.SRC_IN;
+ case 6: return Mode.DST_IN;
+ case 7: return Mode.SRC_OUT;
+ case 8: return Mode.DST_OUT;
+ case 9: return Mode.SRC_ATOP;
+ case 10: return Mode.DST_ATOP;
+ case 11: return Mode.XOR;
+ case 16: return Mode.DARKEN;
+ case 17: return Mode.LIGHTEN;
+ case 13: return Mode.MULTIPLY;
+ case 14: return Mode.SCREEN;
+ case 12: return Mode.ADD;
+ case 15: return Mode.OVERLAY;
+ }
+ }
}
diff --git a/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java b/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java
index 2c603e2..e235a99 100644
--- a/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java
+++ b/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java
@@ -575,7 +575,7 @@ public class AnimatedStateListDrawable extends StateListDrawable {
}
}
- private void mutate() {
+ void mutate() {
mTransitions = mTransitions.clone();
mStateIds = mStateIds.clone();
}
diff --git a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java
index 1ae10d3..1857345 100644
--- a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java
+++ b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java
@@ -170,7 +170,7 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable2 {
public Drawable mutate() {
if (!mMutated && super.mutate() == this) {
mAnimatedVectorState = new AnimatedVectorDrawableState(
- mAnimatedVectorState, mCallback, null);
+ mAnimatedVectorState, mCallback, mRes);
mMutated = true;
}
return this;
diff --git a/graphics/java/android/graphics/drawable/BitmapDrawable.java b/graphics/java/android/graphics/drawable/BitmapDrawable.java
index f059727..fcd7f63 100644
--- a/graphics/java/android/graphics/drawable/BitmapDrawable.java
+++ b/graphics/java/android/graphics/drawable/BitmapDrawable.java
@@ -362,11 +362,6 @@ public class BitmapDrawable extends Drawable {
invalidateSelf();
}
- @Override
- public boolean isDither() {
- return mBitmapState.mPaint.isDither();
- }
-
/**
* Indicates the repeat behavior of this drawable on the X axis.
*
diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java
index 7af78a7..32af59a 100644
--- a/graphics/java/android/graphics/drawable/Drawable.java
+++ b/graphics/java/android/graphics/drawable/Drawable.java
@@ -269,26 +269,16 @@ public abstract class Drawable {
}
/**
- * Set to true to have the drawable dither its colors when drawn to a device
- * with fewer than 8-bits per color component.
+ * Set to true to have the drawable dither its colors when drawn to a
+ * device with fewer than 8-bits per color component.
*
- * <p>This can improve the look on those devices, but can also slow down
- * the drawing a little.</p>
- *
- * @see #isDither()
* @see android.graphics.Paint#setDither(boolean);
+ * @deprecated This property is ignored.
*/
+ @Deprecated
public void setDither(boolean dither) {}
/**
- * @return whether this drawable dithers its colors
- * @see #setDither(boolean)
- */
- public boolean isDither() {
- return false;
- }
-
- /**
* Set to true to have the drawable filter its bitmaps with bilinear
* sampling when they are scaled or rotated.
*
diff --git a/graphics/java/android/graphics/drawable/DrawableContainer.java b/graphics/java/android/graphics/drawable/DrawableContainer.java
index 1759f53..1915dd7 100644
--- a/graphics/java/android/graphics/drawable/DrawableContainer.java
+++ b/graphics/java/android/graphics/drawable/DrawableContainer.java
@@ -167,11 +167,6 @@ public class DrawableContainer extends Drawable implements Drawable.Callback {
}
@Override
- public boolean isDither() {
- return mDrawableContainerState.mDither;
- }
-
- @Override
public void setColorFilter(ColorFilter colorFilter) {
mDrawableContainerState.mHasColorFilter = true;
@@ -735,7 +730,7 @@ public class DrawableContainer extends Drawable implements Drawable.Callback {
if (origDf != null) {
mDrawableFutures = origDf.clone();
} else {
- mDrawableFutures = new SparseArray<ConstantStateFuture>(mNumChildren);
+ mDrawableFutures = new SparseArray<>(mNumChildren);
}
// Create futures for drawables with constant states. If a
@@ -828,6 +823,9 @@ public class DrawableContainer extends Drawable implements Drawable.Callback {
final Drawable prepared = mDrawableFutures.valueAt(keyIndex).get(this);
mDrawables[index] = prepared;
mDrawableFutures.removeAt(keyIndex);
+ if (mDrawableFutures.size() == 0) {
+ mDrawableFutures = null;
+ }
return prepared;
}
}
diff --git a/graphics/java/android/graphics/drawable/GradientDrawable.java b/graphics/java/android/graphics/drawable/GradientDrawable.java
index 626991d..a11b2cd 100644
--- a/graphics/java/android/graphics/drawable/GradientDrawable.java
+++ b/graphics/java/android/graphics/drawable/GradientDrawable.java
@@ -826,11 +826,6 @@ public class GradientDrawable extends Drawable {
}
@Override
- public boolean isDither() {
- return mGradientState.mDither;
- }
-
- @Override
public ColorFilter getColorFilter() {
return mColorFilter;
}
diff --git a/graphics/java/android/graphics/drawable/Icon.java b/graphics/java/android/graphics/drawable/Icon.java
index 85db6a1..7c9b30b 100644
--- a/graphics/java/android/graphics/drawable/Icon.java
+++ b/graphics/java/android/graphics/drawable/Icon.java
@@ -16,13 +16,16 @@
package android.graphics.drawable;
+import android.annotation.ColorInt;
import android.annotation.DrawableRes;
+import android.content.res.ColorStateList;
import android.content.ContentResolver;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
+import android.graphics.PorterDuff;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Handler;
@@ -67,6 +70,10 @@ public final class Icon implements Parcelable {
private final int mType;
+ private ColorStateList mTintList;
+ static final PorterDuff.Mode DEFAULT_TINT_MODE = Drawable.DEFAULT_TINT_MODE; // SRC_IN
+ private PorterDuff.Mode mTintMode = DEFAULT_TINT_MODE;
+
// To avoid adding unnecessary overhead, we have a few basic objects that get repurposed
// based on the value of mType.
@@ -109,6 +116,10 @@ public final class Icon implements Parcelable {
return (Bitmap) mObj1;
}
+ private void setBitmap(Bitmap b) {
+ mObj1 = b;
+ }
+
/**
* @return The length of the compressed bitmap byte array held by this {@link #TYPE_DATA} Icon.
* @hide
@@ -254,6 +265,19 @@ public final class Icon implements Parcelable {
* @return A fresh instance of a drawable for this image, yours to keep.
*/
public Drawable loadDrawable(Context context) {
+ final Drawable result = loadDrawableInner(context);
+ if (result != null && (mTintList != null || mTintMode != DEFAULT_TINT_MODE)) {
+ result.mutate();
+ result.setTintList(mTintList);
+ result.setTintMode(mTintMode);
+ }
+ return result;
+ }
+
+ /**
+ * Do the heavy lifting of loading the drawable, but stop short of applying any tint.
+ */
+ private Drawable loadDrawableInner(Context context) {
switch (mType) {
case TYPE_BITMAP:
return new BitmapDrawable(context.getResources(), getBitmap());
@@ -347,6 +371,16 @@ public final class Icon implements Parcelable {
}
/**
+ * Puts the memory used by this instance into Ashmem memory, if possible.
+ * @hide
+ */
+ public void convertToAshmem() {
+ if (mType == TYPE_BITMAP && getBitmap().isMutable()) {
+ setBitmap(getBitmap().createAshmemBitmap());
+ }
+ }
+
+ /**
* Writes a serialized version of an Icon to the specified stream.
*
* @param stream The stream on which to serialize the Icon.
@@ -466,7 +500,7 @@ public final class Icon implements Parcelable {
throw new IllegalArgumentException("Bitmap must not be null.");
}
final Icon rep = new Icon(TYPE_BITMAP);
- rep.mObj1 = bits;
+ rep.setBitmap(bits);
return rep;
}
@@ -518,6 +552,38 @@ public final class Icon implements Parcelable {
}
/**
+ * Store a color to use whenever this Icon is drawn.
+ *
+ * @param tint a color, as in {@link Drawable#setTint(int)}
+ * @return this same object, for use in chained construction
+ */
+ public Icon setTint(@ColorInt int tint) {
+ return setTintList(ColorStateList.valueOf(tint));
+ }
+
+ /**
+ * Store a color to use whenever this Icon is drawn.
+ *
+ * @param tintList as in {@link Drawable#setTintList(ColorStateList)}, null to remove tint
+ * @return this same object, for use in chained construction
+ */
+ public Icon setTintList(ColorStateList tintList) {
+ mTintList = tintList;
+ return this;
+ }
+
+ /**
+ * Store a blending mode to use whenever this Icon is drawn.
+ *
+ * @param mode a blending mode, as in {@link Drawable#setTintMode(PorterDuff.Mode)}, may be null
+ * @return this same object, for use in chained construction
+ */
+ public Icon setTintMode(PorterDuff.Mode mode) {
+ mTintMode = mode;
+ return this;
+ }
+
+ /**
* Create an Icon pointing to an image file specified by path.
*
* @param path A path to a file that contains compressed bitmap data of
@@ -558,6 +624,15 @@ public final class Icon implements Parcelable {
sb.append(" uri=").append(getUriString());
break;
}
+ if (mTintList != null) {
+ sb.append(" tint=");
+ String sep = "";
+ for (int c : mTintList.getColors()) {
+ sb.append(String.format("%s0x%08x", sep, c));
+ sep = "|";
+ }
+ }
+ if (mTintMode != DEFAULT_TINT_MODE) sb.append(" mode=").append(mTintMode);
sb.append(")");
return sb.toString();
}
@@ -603,31 +678,39 @@ public final class Icon implements Parcelable {
throw new RuntimeException("invalid "
+ this.getClass().getSimpleName() + " type in parcel: " + mType);
}
+ if (in.readInt() == 1) {
+ mTintList = ColorStateList.CREATOR.createFromParcel(in);
+ }
+ mTintMode = PorterDuff.intToMode(in.readInt());
}
@Override
public void writeToParcel(Parcel dest, int flags) {
+ dest.writeInt(mType);
switch (mType) {
case TYPE_BITMAP:
final Bitmap bits = getBitmap();
- dest.writeInt(TYPE_BITMAP);
getBitmap().writeToParcel(dest, flags);
break;
case TYPE_RESOURCE:
- dest.writeInt(TYPE_RESOURCE);
dest.writeString(getResPackage());
dest.writeInt(getResId());
break;
case TYPE_DATA:
- dest.writeInt(TYPE_DATA);
dest.writeInt(getDataLength());
dest.writeBlob(getDataBytes(), getDataOffset(), getDataLength());
break;
case TYPE_URI:
- dest.writeInt(TYPE_URI);
dest.writeString(getUriString());
break;
}
+ if (mTintList == null) {
+ dest.writeInt(0);
+ } else {
+ dest.writeInt(1);
+ mTintList.writeToParcel(dest, flags);
+ }
+ dest.writeInt(PorterDuff.modeToInt(mTintMode));
}
public static final Parcelable.Creator<Icon> CREATOR
diff --git a/graphics/java/android/graphics/drawable/LayerDrawable.java b/graphics/java/android/graphics/drawable/LayerDrawable.java
index 90891f6..d9469d4 100644
--- a/graphics/java/android/graphics/drawable/LayerDrawable.java
+++ b/graphics/java/android/graphics/drawable/LayerDrawable.java
@@ -133,6 +133,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
mLayerState.mChildren = r;
ensurePadding();
+ refreshPadding();
}
LayerDrawable() {
@@ -143,6 +144,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
mLayerState = createConstantState(state, res);
if (mLayerState.mNum > 0) {
ensurePadding();
+ refreshPadding();
}
}
@@ -162,6 +164,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
inflateLayers(r, parser, attrs, theme);
ensurePadding();
+ refreshPadding();
}
/**
@@ -431,6 +434,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
final ChildDrawable layer = createLayer(dr);
final int index = addLayer(layer);
ensurePadding();
+ refreshChildPadding(index, layer);
return index;
}
@@ -568,6 +572,8 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
childDrawable.mDrawable = drawable;
mLayerState.invalidateCache();
+
+ refreshChildPadding(index, childDrawable);
}
/**
@@ -1248,16 +1254,6 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
}
@Override
- public boolean isDither() {
- final Drawable dr = getFirstNonNullDrawable();
- if (dr != null) {
- return dr.isDither();
- } else {
- return super.isDither();
- }
- }
-
- @Override
public void setAlpha(int alpha) {
final ChildDrawable[] array = mLayerState.mChildren;
final int N = mLayerState.mNum;
@@ -1633,6 +1629,14 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
mPaddingB = new int[N];
}
+ void refreshPadding() {
+ final int N = mLayerState.mNum;
+ final ChildDrawable[] array = mLayerState.mChildren;
+ for (int i = 0; i < N; i++) {
+ refreshChildPadding(i, array[i]);
+ }
+ }
+
@Override
public ConstantState getConstantState() {
if (mLayerState.canConstantState()) {
diff --git a/graphics/java/android/graphics/drawable/NinePatchDrawable.java b/graphics/java/android/graphics/drawable/NinePatchDrawable.java
index adf53e3..152fe6a 100644
--- a/graphics/java/android/graphics/drawable/NinePatchDrawable.java
+++ b/graphics/java/android/graphics/drawable/NinePatchDrawable.java
@@ -374,11 +374,6 @@ public class NinePatchDrawable extends Drawable {
}
@Override
- public boolean isDither() {
- return mPaint == null ? DEFAULT_DITHER : mPaint.isDither();
- }
-
- @Override
public void setAutoMirrored(boolean mirrored) {
mNinePatchState.mAutoMirrored = mirrored;
}
diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java
index 6369833..bf069d3 100644
--- a/graphics/java/android/graphics/drawable/RippleDrawable.java
+++ b/graphics/java/android/graphics/drawable/RippleDrawable.java
@@ -198,6 +198,7 @@ public class RippleDrawable extends LayerDrawable {
setColor(color);
ensurePadding();
+ refreshPadding();
updateLocalState();
}
@@ -1013,6 +1014,7 @@ public class RippleDrawable extends LayerDrawable {
if (mState.mNum > 0) {
ensurePadding();
+ refreshPadding();
}
if (res != null) {
diff --git a/graphics/java/android/graphics/drawable/ShapeDrawable.java b/graphics/java/android/graphics/drawable/ShapeDrawable.java
index a669d3c..30b588e 100644
--- a/graphics/java/android/graphics/drawable/ShapeDrawable.java
+++ b/graphics/java/android/graphics/drawable/ShapeDrawable.java
@@ -328,11 +328,6 @@ public class ShapeDrawable extends Drawable {
}
@Override
- public boolean isDither() {
- return mShapeState.mPaint.isDither();
- }
-
- @Override
protected void onBoundsChange(Rect bounds) {
super.onBoundsChange(bounds);
updateShape();
diff --git a/graphics/java/android/graphics/drawable/StateListDrawable.java b/graphics/java/android/graphics/drawable/StateListDrawable.java
index c83af11..758410a 100644
--- a/graphics/java/android/graphics/drawable/StateListDrawable.java
+++ b/graphics/java/android/graphics/drawable/StateListDrawable.java
@@ -59,22 +59,10 @@ import android.util.StateSet;
* @attr ref android.R.styleable#DrawableStates_state_pressed
*/
public class StateListDrawable extends DrawableContainer {
- private static final String TAG = StateListDrawable.class.getSimpleName();
+ private static final String TAG = "StateListDrawable";
private static final boolean DEBUG = false;
- /**
- * To be proper, we should have a getter for dither (and alpha, etc.)
- * so that proxy classes like this can save/restore their delegates'
- * values, but we don't have getters. Since we do have setters
- * (e.g. setDither), which this proxy forwards on, we have to have some
- * default/initial setting.
- *
- * The initial setting for dither is now true, since it almost always seems
- * to improve the quality at negligible cost.
- */
- private static final boolean DEFAULT_DITHER = true;
-
private StateListState mStateListState;
private boolean mMutated;
@@ -104,16 +92,16 @@ public class StateListDrawable extends DrawableContainer {
@Override
protected boolean onStateChange(int[] stateSet) {
+ final boolean changed = super.onStateChange(stateSet);
+
int idx = mStateListState.indexOfStateSet(stateSet);
if (DEBUG) android.util.Log.i(TAG, "onStateChange " + this + " states "
+ Arrays.toString(stateSet) + " found " + idx);
if (idx < 0) {
idx = mStateListState.indexOfStateSet(StateSet.WILD_CARD);
}
- if (selectDrawable(idx)) {
- return true;
- }
- return super.onStateChange(stateSet);
+
+ return selectDrawable(idx) || changed;
}
@Override
@@ -326,13 +314,14 @@ public class StateListDrawable extends DrawableContainer {
}
}
- private void mutate() {
+ void mutate() {
mThemeAttrs = mThemeAttrs != null ? mThemeAttrs.clone() : null;
final int[][] stateSets = new int[mStateSets.length][];
for (int i = mStateSets.length - 1; i >= 0; i--) {
stateSets[i] = mStateSets[i] != null ? mStateSets[i].clone() : null;
}
+ mStateSets = stateSets;
}
int addStateSet(int[] stateSet, Drawable drawable) {
diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java
index 5e205bd..24cb055 100644
--- a/graphics/java/android/graphics/drawable/VectorDrawable.java
+++ b/graphics/java/android/graphics/drawable/VectorDrawable.java
@@ -15,6 +15,7 @@
package android.graphics.drawable;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.content.res.Resources.Theme;
@@ -31,10 +32,10 @@ import android.graphics.PathMeasure;
import android.graphics.PixelFormat;
import android.graphics.PorterDuffColorFilter;
import android.graphics.Rect;
-import android.graphics.Region;
import android.graphics.PorterDuff.Mode;
import android.util.ArrayMap;
import android.util.AttributeSet;
+import android.util.DisplayMetrics;
import android.util.LayoutDirection;
import android.util.Log;
import android.util.MathUtils;
@@ -212,13 +213,24 @@ public class VectorDrawable extends Drawable {
// caching the bitmap by default is allowed.
private boolean mAllowCaching = true;
+ // Given the virtual display setup, the dpi can be different than the inflation's dpi.
+ // Therefore, we need to scale the values we got from the getDimension*().
+ private int mDpiScaledWidth = 0;
+ private int mDpiScaledHeight = 0;
+ private Insets mDpiScaleInsets = Insets.NONE;
+
public VectorDrawable() {
- mVectorState = new VectorDrawableState();
+ this(null, null);
}
- private VectorDrawable(@NonNull VectorDrawableState state) {
- mVectorState = state;
- mTintFilter = updateTintFilter(mTintFilter, state.mTint, state.mTintMode);
+ private VectorDrawable(@NonNull VectorDrawableState state, @Nullable Resources res) {
+ if (state == null) {
+ mVectorState = new VectorDrawableState();
+ } else {
+ mVectorState = state;
+ mTintFilter = updateTintFilter(mTintFilter, state.mTint, state.mTintMode);
+ }
+ updateDimensionInfo(res, false);
}
@Override
@@ -359,18 +371,66 @@ public class VectorDrawable extends Drawable {
@Override
public int getIntrinsicWidth() {
- return (int) mVectorState.mVPathRenderer.mBaseWidth;
+ return mDpiScaledWidth;
}
@Override
public int getIntrinsicHeight() {
- return (int) mVectorState.mVPathRenderer.mBaseHeight;
+ return mDpiScaledHeight;
}
/** @hide */
@Override
public Insets getOpticalInsets() {
- return mVectorState.mVPathRenderer.mOpticalInsets;
+ return mDpiScaleInsets;
+ }
+
+ /*
+ * Update the VectorDrawable dimension since the res can be in different Dpi now.
+ * Basically, when a new instance is created or getDimension() is called, we should update
+ * the current VectorDrawable's dimension information.
+ * Only after updateStateFromTypedArray() is called, we should called this and update the
+ * constant state's dpi info, i.e. updateConstantStateDensity == true.
+ */
+ void updateDimensionInfo(@Nullable Resources res, boolean updateConstantStateDensity) {
+ if (res != null) {
+ final int densityDpi = res.getDisplayMetrics().densityDpi;
+ final int targetDensity = densityDpi == 0 ? DisplayMetrics.DENSITY_DEFAULT : densityDpi;
+
+ if (updateConstantStateDensity) {
+ mVectorState.mVPathRenderer.mTargetDensity = targetDensity;
+ } else {
+ final int constantStateDensity = mVectorState.mVPathRenderer.mTargetDensity;
+ if (targetDensity != constantStateDensity && constantStateDensity != 0) {
+ mDpiScaledWidth = Bitmap.scaleFromDensity(
+ (int) mVectorState.mVPathRenderer.mBaseWidth, constantStateDensity,
+ targetDensity);
+ mDpiScaledHeight = Bitmap.scaleFromDensity(
+ (int) mVectorState.mVPathRenderer.mBaseHeight,constantStateDensity,
+ targetDensity);
+ final int left = Bitmap.scaleFromDensity(
+ mVectorState.mVPathRenderer.mOpticalInsets.left, constantStateDensity,
+ targetDensity);
+ final int right = Bitmap.scaleFromDensity(
+ mVectorState.mVPathRenderer.mOpticalInsets.right, constantStateDensity,
+ targetDensity);
+ final int top = Bitmap.scaleFromDensity(
+ mVectorState.mVPathRenderer.mOpticalInsets.top, constantStateDensity,
+ targetDensity);
+ final int bottom = Bitmap.scaleFromDensity(
+ mVectorState.mVPathRenderer.mOpticalInsets.bottom, constantStateDensity,
+ targetDensity);
+ mDpiScaleInsets = Insets.of(left, top, right, bottom);
+ return;
+ }
+ }
+ }
+ // For all the other cases, like either res is null, constant state is not initialized or
+ // target density is the same as the constant state, we will just use the constant state
+ // dimensions.
+ mDpiScaledWidth = (int) mVectorState.mVPathRenderer.mBaseWidth;
+ mDpiScaledHeight = (int) mVectorState.mVPathRenderer.mBaseHeight;
+ mDpiScaleInsets = mVectorState.mVPathRenderer.mOpticalInsets;
}
@Override
@@ -393,6 +453,7 @@ public class VectorDrawable extends Drawable {
try {
state.mCacheDirty = true;
updateStateFromTypedArray(a);
+ updateDimensionInfo(t.getResources(), true /* update constant state */);
} catch (XmlPullParserException e) {
throw new RuntimeException(e);
} finally {
@@ -485,6 +546,7 @@ public class VectorDrawable extends Drawable {
inflateInternal(res, parser, attrs, theme);
mTintFilter = updateTintFilter(mTintFilter, state.mTint, state.mTintMode);
+ updateDimensionInfo(res, true /* update constant state */);
}
private void updateStateFromTypedArray(TypedArray a) throws XmlPullParserException {
@@ -687,7 +749,6 @@ public class VectorDrawable extends Drawable {
int mCachedRootAlpha;
boolean mCachedAutoMirrored;
boolean mCacheDirty;
-
/** Temporary paint object used to draw cached bitmaps. */
Paint mTempPaint;
@@ -797,12 +858,12 @@ public class VectorDrawable extends Drawable {
@Override
public Drawable newDrawable() {
- return new VectorDrawable(this);
+ return new VectorDrawable(this, null);
}
@Override
public Drawable newDrawable(Resources res) {
- return new VectorDrawable(this);
+ return new VectorDrawable(this, res);
}
@Override
@@ -847,6 +908,8 @@ public class VectorDrawable extends Drawable {
int mRootAlpha = 0xFF;
String mRootName = null;
+ int mTargetDensity = DisplayMetrics.DENSITY_DEFAULT;
+
final ArrayMap<String, Object> mVGTargetsMap = new ArrayMap<String, Object>();
public VPathRenderer() {
@@ -886,6 +949,7 @@ public class VectorDrawable extends Drawable {
mChangingConfigurations = copy.mChangingConfigurations;
mRootAlpha = copy.mRootAlpha;
mRootName = copy.mRootName;
+ mTargetDensity = copy.mTargetDensity;
if (copy.mRootName != null) {
mVGTargetsMap.put(copy.mRootName, this);
}