diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java index c3ef45088f8ec..ceac3253e178e 100644 --- a/graphics/java/android/graphics/drawable/VectorDrawable.java +++ b/graphics/java/android/graphics/drawable/VectorDrawable.java @@ -31,6 +31,7 @@ import android.graphics.PorterDuff.Mode; import android.graphics.PorterDuffColorFilter; import android.graphics.Rect; import android.graphics.Shader; +import android.os.Trace; import android.util.ArrayMap; import android.util.AttributeSet; import android.util.DisplayMetrics; @@ -605,38 +606,44 @@ public class VectorDrawable extends Drawable { public void inflate(@NonNull Resources r, @NonNull XmlPullParser parser, @NonNull AttributeSet attrs, @Nullable Theme theme) throws XmlPullParserException, IOException { - if (mVectorState.mRootGroup != null || mVectorState.mNativeTree != null) { - // This VD has been used to display other VD resource content, clean up. - if (mVectorState.mRootGroup != null) { - // Subtract the native allocation for all the nodes. - VMRuntime.getRuntime().registerNativeFree(mVectorState.mRootGroup.getNativeSize()); - // Remove child nodes' reference to tree - mVectorState.mRootGroup.setTree(null); + try { + Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, "VectorDrawable#inflate"); + if (mVectorState.mRootGroup != null || mVectorState.mNativeTree != null) { + // This VD has been used to display other VD resource content, clean up. + if (mVectorState.mRootGroup != null) { + // Subtract the native allocation for all the nodes. + VMRuntime.getRuntime().registerNativeFree( + mVectorState.mRootGroup.getNativeSize()); + // Remove child nodes' reference to tree + mVectorState.mRootGroup.setTree(null); + } + mVectorState.mRootGroup = new VGroup(); + if (mVectorState.mNativeTree != null) { + // Subtract the native allocation for the tree wrapper, which contains root node + // as well as rendering related data. + VMRuntime.getRuntime().registerNativeFree(mVectorState.NATIVE_ALLOCATION_SIZE); + mVectorState.mNativeTree.release(); + } + mVectorState.createNativeTree(mVectorState.mRootGroup); } - mVectorState.mRootGroup = new VGroup(); - if (mVectorState.mNativeTree != null) { - // Subtract the native allocation for the tree wrapper, which contains root node - // as well as rendering related data. - VMRuntime.getRuntime().registerNativeFree(mVectorState.NATIVE_ALLOCATION_SIZE); - mVectorState.mNativeTree.release(); - } - mVectorState.createNativeTree(mVectorState.mRootGroup); + final VectorDrawableState state = mVectorState; + state.setDensity(Drawable.resolveDensity(r, 0)); + + final TypedArray a = obtainAttributes(r, theme, attrs, R.styleable.VectorDrawable); + updateStateFromTypedArray(a); + a.recycle(); + + mDpiScaledDirty = true; + + state.mCacheDirty = true; + inflateChildElements(r, parser, attrs, theme); + + state.onTreeConstructionFinished(); + // Update local properties. + updateLocalState(r); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_RESOURCES); } - final VectorDrawableState state = mVectorState; - state.setDensity(Drawable.resolveDensity(r, 0)); - - final TypedArray a = obtainAttributes(r, theme, attrs, R.styleable.VectorDrawable); - updateStateFromTypedArray(a); - a.recycle(); - - mDpiScaledDirty = true; - - state.mCacheDirty = true; - inflateChildElements(r, parser, attrs, theme); - - state.onTreeConstructionFinished(); - // Update local properties. - updateLocalState(r); } private void updateStateFromTypedArray(TypedArray a) throws XmlPullParserException { diff --git a/libs/hwui/VectorDrawable.cpp b/libs/hwui/VectorDrawable.cpp index 8a1de02e6a0c6..ca179c9a25d25 100644 --- a/libs/hwui/VectorDrawable.cpp +++ b/libs/hwui/VectorDrawable.cpp @@ -22,6 +22,7 @@ #include "SkShader.h" #include #include "utils/Macros.h" +#include "utils/TraceUtils.h" #include "utils/VectorDrawableUtils.h" #include @@ -593,14 +594,17 @@ void Tree::draw(SkCanvas* canvas) { void Tree::updateBitmapCache(Bitmap& bitmap, bool useStagingData) { SkBitmap outCache; bitmap.getSkBitmap(&outCache); + int cacheWidth = outCache.width(); + int cacheHeight = outCache.height(); + ATRACE_FORMAT("VectorDrawable repaint %dx%d", cacheWidth, cacheHeight); outCache.eraseColor(SK_ColorTRANSPARENT); SkCanvas outCanvas(outCache); float viewportWidth = useStagingData ? mStagingProperties.getViewportWidth() : mProperties.getViewportWidth(); float viewportHeight = useStagingData ? mStagingProperties.getViewportHeight() : mProperties.getViewportHeight(); - float scaleX = outCache.width() / viewportWidth; - float scaleY = outCache.height() / viewportHeight; + float scaleX = cacheWidth / viewportWidth; + float scaleY = cacheHeight / viewportHeight; outCanvas.scale(scaleX, scaleY); mRootNode->draw(&outCanvas, useStagingData); }