diff options
Diffstat (limited to 'graphics/java')
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); } |