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

Commit 3d30ca1d authored by ztenghui's avatar ztenghui Committed by Tenghui Zhu
Browse files

Add systrace for VectorDrawable inflation and draw

We didn't trace the draw from cache.
Here we add trace for draw into bitmap, which is normally heavy.

fix: 65060698
Bug: 65060698
Test: run test app and get systrace and check

Change-Id: Ia81127c4aa285b3277e9c9edbdf356d85cb28b5e
(cherry picked from commit cf0c41db)
parent e8041834
Loading
Loading
Loading
Loading
+34 −27
Original line number Original line Diff line number Diff line
@@ -31,6 +31,7 @@ import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffColorFilter;
import android.graphics.PorterDuffColorFilter;
import android.graphics.Rect;
import android.graphics.Rect;
import android.graphics.Shader;
import android.graphics.Shader;
import android.os.Trace;
import android.util.ArrayMap;
import android.util.ArrayMap;
import android.util.AttributeSet;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.DisplayMetrics;
@@ -605,11 +606,14 @@ public class VectorDrawable extends Drawable {
    public void inflate(@NonNull Resources r, @NonNull XmlPullParser parser,
    public void inflate(@NonNull Resources r, @NonNull XmlPullParser parser,
            @NonNull AttributeSet attrs, @Nullable Theme theme)
            @NonNull AttributeSet attrs, @Nullable Theme theme)
            throws XmlPullParserException, IOException {
            throws XmlPullParserException, IOException {
        try {
            Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, "VectorDrawable#inflate");
            if (mVectorState.mRootGroup != null || mVectorState.mNativeTree != null) {
            if (mVectorState.mRootGroup != null || mVectorState.mNativeTree != null) {
                // This VD has been used to display other VD resource content, clean up.
                // This VD has been used to display other VD resource content, clean up.
                if (mVectorState.mRootGroup != null) {
                if (mVectorState.mRootGroup != null) {
                    // Subtract the native allocation for all the nodes.
                    // Subtract the native allocation for all the nodes.
                VMRuntime.getRuntime().registerNativeFree(mVectorState.mRootGroup.getNativeSize());
                    VMRuntime.getRuntime().registerNativeFree(
                            mVectorState.mRootGroup.getNativeSize());
                    // Remove child nodes' reference to tree
                    // Remove child nodes' reference to tree
                    mVectorState.mRootGroup.setTree(null);
                    mVectorState.mRootGroup.setTree(null);
                }
                }
@@ -637,6 +641,9 @@ public class VectorDrawable extends Drawable {
            state.onTreeConstructionFinished();
            state.onTreeConstructionFinished();
            // Update local properties.
            // Update local properties.
            updateLocalState(r);
            updateLocalState(r);
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_RESOURCES);
        }
    }
    }


    private void updateStateFromTypedArray(TypedArray a) throws XmlPullParserException {
    private void updateStateFromTypedArray(TypedArray a) throws XmlPullParserException {
+6 −2
Original line number Original line Diff line number Diff line
@@ -22,6 +22,7 @@
#include "SkShader.h"
#include "SkShader.h"
#include <utils/Log.h>
#include <utils/Log.h>
#include "utils/Macros.h"
#include "utils/Macros.h"
#include "utils/TraceUtils.h"
#include "utils/VectorDrawableUtils.h"
#include "utils/VectorDrawableUtils.h"


#include <math.h>
#include <math.h>
@@ -593,14 +594,17 @@ void Tree::draw(SkCanvas* canvas) {
void Tree::updateBitmapCache(Bitmap& bitmap, bool useStagingData) {
void Tree::updateBitmapCache(Bitmap& bitmap, bool useStagingData) {
    SkBitmap outCache;
    SkBitmap outCache;
    bitmap.getSkBitmap(&outCache);
    bitmap.getSkBitmap(&outCache);
    int cacheWidth = outCache.width();
    int cacheHeight = outCache.height();
    ATRACE_FORMAT("VectorDrawable repaint %dx%d", cacheWidth, cacheHeight);
    outCache.eraseColor(SK_ColorTRANSPARENT);
    outCache.eraseColor(SK_ColorTRANSPARENT);
    SkCanvas outCanvas(outCache);
    SkCanvas outCanvas(outCache);
    float viewportWidth = useStagingData ?
    float viewportWidth = useStagingData ?
            mStagingProperties.getViewportWidth() : mProperties.getViewportWidth();
            mStagingProperties.getViewportWidth() : mProperties.getViewportWidth();
    float viewportHeight = useStagingData ?
    float viewportHeight = useStagingData ?
            mStagingProperties.getViewportHeight() : mProperties.getViewportHeight();
            mStagingProperties.getViewportHeight() : mProperties.getViewportHeight();
    float scaleX = outCache.width() / viewportWidth;
    float scaleX = cacheWidth / viewportWidth;
    float scaleY = outCache.height() / viewportHeight;
    float scaleY = cacheHeight / viewportHeight;
    outCanvas.scale(scaleX, scaleY);
    outCanvas.scale(scaleX, scaleY);
    mRootNode->draw(&outCanvas, useStagingData);
    mRootNode->draw(&outCanvas, useStagingData);
}
}