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

Commit 6410c0aa authored by Romain Guy's avatar Romain Guy
Browse files

Lazily allocate seldom-used data structures

Change-Id: I8d6b9d2d821168329206c01ed6539a1466af272f
parent 5216c3b0
Loading
Loading
Loading
Loading
+44 −16
Original line number Diff line number Diff line
@@ -59,11 +59,11 @@ class GLES20Canvas extends HardwareCanvas {
    private int mWidth;
    private int mHeight;
    
    private final float[] mPoint = new float[2];
    private final float[] mLine = new float[4];
    private float[] mPoint;
    private float[] mLine;
    
    private final Rect mClipBounds = new Rect();
    private final RectF mPathBounds = new RectF();
    private Rect mClipBounds;
    private RectF mPathBounds;

    private DrawFilter mFilter;

@@ -442,6 +442,31 @@ class GLES20Canvas extends HardwareCanvas {
    private static native void nInterrupt(int renderer);
    private static native void nResume(int renderer);

    ///////////////////////////////////////////////////////////////////////////
    // Support
    ///////////////////////////////////////////////////////////////////////////

    private Rect getInternalClipBounds() {
        if (mClipBounds == null) mClipBounds = new Rect();
        return mClipBounds;
    }


    private RectF getPathBounds() {
        if (mPathBounds == null) mPathBounds = new RectF();
        return mPathBounds;
    }

    private float[] getPointStorage() {
        if (mPoint == null) mPoint = new float[2];
        return mPoint;
    }

    private float[] getLineStorage() {
        if (mLine == null) mLine = new float[4];
        return mLine;
    }

    ///////////////////////////////////////////////////////////////////////////
    // Clipping
    ///////////////////////////////////////////////////////////////////////////
@@ -530,9 +555,10 @@ class GLES20Canvas extends HardwareCanvas {

    @Override
    public boolean quickReject(Path path, EdgeType type) {
        path.computeBounds(mPathBounds, true);
        return nQuickReject(mRenderer, mPathBounds.left, mPathBounds.top,
                mPathBounds.right, mPathBounds.bottom);
        RectF pathBounds = getPathBounds();
        path.computeBounds(pathBounds, true);
        return nQuickReject(mRenderer, pathBounds.left, pathBounds.top,
                pathBounds.right, pathBounds.bottom);
    }

    @Override
@@ -967,11 +993,12 @@ class GLES20Canvas extends HardwareCanvas {

    @Override
    public void drawLine(float startX, float startY, float stopX, float stopY, Paint paint) {
        mLine[0] = startX;
        mLine[1] = startY;
        mLine[2] = stopX;
        mLine[3] = stopY;
        drawLines(mLine, 0, 4, paint);
        float[] line = getLineStorage();
        line[0] = startX;
        line[1] = startY;
        line[2] = stopX;
        line[3] = stopY;
        drawLines(line, 0, 4, paint);
    }

    @Override
@@ -1012,7 +1039,7 @@ class GLES20Canvas extends HardwareCanvas {

    @Override
    public void drawPaint(Paint paint) {
        final Rect r = mClipBounds;
        final Rect r = getInternalClipBounds();
        nGetClipBounds(mRenderer, r);
        drawRect(r.left, r.top, r.right, r.bottom, paint);
    }
@@ -1089,9 +1116,10 @@ class GLES20Canvas extends HardwareCanvas {

    @Override
    public void drawPoint(float x, float y, Paint paint) {
        mPoint[0] = x;
        mPoint[1] = y;
        drawPoints(mPoint, 0, 2, paint);
        float[] point = getPointStorage();
        point[0] = x;
        point[1] = y;
        drawPoints(point, 0, 2, paint);
    }

    @Override
+21 −6
Original line number Diff line number Diff line
@@ -30,9 +30,9 @@ class GLES20DisplayList extends DisplayList {
    // alive as long as the DisplayList is alive.  The Bitmap and DisplayList lists
    // are populated by the GLES20RecordingCanvas during appropriate drawing calls and are
    // cleared at the start of a new drawing frame or when the view is detached from the window.
    final ArrayList<Bitmap> mBitmaps = new ArrayList<Bitmap>(10);
    final ArrayList<NinePatch> mNinePatches = new ArrayList<NinePatch>(10);
    final ArrayList<DisplayList> mChildDisplayLists = new ArrayList<DisplayList>();
    private ArrayList<Bitmap> mBitmaps;
    private ArrayList<NinePatch> mNinePatches;
    private ArrayList<DisplayList> mChildDisplayLists;

    private GLES20RecordingCanvas mCanvas;
    private boolean mValid;
@@ -89,9 +89,24 @@ class GLES20DisplayList extends DisplayList {
    }

    void clearReferences() {
        mBitmaps.clear();
        mNinePatches.clear();
        mChildDisplayLists.clear();
        if (mBitmaps != null) mBitmaps.clear();
        if (mNinePatches != null) mNinePatches.clear();
        if (mChildDisplayLists != null) mChildDisplayLists.clear();
    }

    ArrayList<Bitmap> getBitmaps() {
        if (mBitmaps == null) mBitmaps = new ArrayList<Bitmap>(5);
        return mBitmaps;
    }

    ArrayList<NinePatch> getNinePatches() {
        if (mNinePatches == null) mNinePatches = new ArrayList<NinePatch>(5);
        return mNinePatches;
    }

    ArrayList<DisplayList> getChildDisplayLists() {
        if (mChildDisplayLists == null) mChildDisplayLists = new ArrayList<DisplayList>();
        return mChildDisplayLists;
    }

    @Override
+9 −9
Original line number Diff line number Diff line
@@ -74,7 +74,7 @@ class GLES20RecordingCanvas extends GLES20Canvas {
        if (paint != null) {
            final Shader shader = paint.getShader();
            if (shader instanceof BitmapShader) {
                mDisplayList.mBitmaps.add(((BitmapShader) shader).mBitmap);
                mDisplayList.getBitmaps().add(((BitmapShader) shader).mBitmap);
            }
        }
    }
@@ -82,36 +82,36 @@ class GLES20RecordingCanvas extends GLES20Canvas {
    @Override
    public void drawPatch(NinePatch patch, RectF dst, Paint paint) {
        super.drawPatch(patch, dst, paint);
        mDisplayList.mBitmaps.add(patch.getBitmap());
        mDisplayList.mNinePatches.add(patch);
        mDisplayList.getBitmaps().add(patch.getBitmap());
        mDisplayList.getNinePatches().add(patch);
        // Shaders in the Paint are ignored when drawing a Bitmap
    }

    @Override
    public void drawBitmap(Bitmap bitmap, float left, float top, Paint paint) {
        super.drawBitmap(bitmap, left, top, paint);
        mDisplayList.mBitmaps.add(bitmap);
        mDisplayList.getBitmaps().add(bitmap);
        // Shaders in the Paint are ignored when drawing a Bitmap
    }

    @Override
    public void drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint) {
        super.drawBitmap(bitmap, matrix, paint);
        mDisplayList.mBitmaps.add(bitmap);
        mDisplayList.getBitmaps().add(bitmap);
        // Shaders in the Paint are ignored when drawing a Bitmap
    }

    @Override
    public void drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint) {
        super.drawBitmap(bitmap, src, dst, paint);
        mDisplayList.mBitmaps.add(bitmap);
        mDisplayList.getBitmaps().add(bitmap);
        // Shaders in the Paint are ignored when drawing a Bitmap
    }

    @Override
    public void drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint) {
        super.drawBitmap(bitmap, src, dst, paint);
        mDisplayList.mBitmaps.add(bitmap);
        mDisplayList.getBitmaps().add(bitmap);
        // Shaders in the Paint are ignored when drawing a Bitmap
    }

@@ -134,7 +134,7 @@ class GLES20RecordingCanvas extends GLES20Canvas {
            int vertOffset, int[] colors, int colorOffset, Paint paint) {
        super.drawBitmapMesh(bitmap, meshWidth, meshHeight, verts, vertOffset,
                colors, colorOffset, paint);
        mDisplayList.mBitmaps.add(bitmap);
        mDisplayList.getBitmaps().add(bitmap);
        // Shaders in the Paint are ignored when drawing a Bitmap
    }

@@ -147,7 +147,7 @@ class GLES20RecordingCanvas extends GLES20Canvas {
    @Override
    public int drawDisplayList(DisplayList displayList, Rect dirty, int flags) {
        int status = super.drawDisplayList(displayList, dirty, flags);
        mDisplayList.mChildDisplayLists.add(displayList);
        mDisplayList.getChildDisplayLists().add(displayList);
        return status;
    }

+15 −18
Original line number Diff line number Diff line
@@ -40,7 +40,6 @@ import android.graphics.Shader;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.hardware.display.DisplayManagerGlobal;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
@@ -3054,18 +3053,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
    private int[] mDrawableState = null;
    /**
     * Set to true when drawing cache is enabled and cannot be created.
     *
     * @hide
     */
    public boolean mCachingFailed;
    private Bitmap mDrawingCache;
    private Bitmap mUnscaledDrawingCache;
    private HardwareLayer mHardwareLayer;
    DisplayList mDisplayList;
    /**
     * When this view has focus and the next focus is {@link #FOCUS_LEFT},
     * the user may specify which view to go to next.
@@ -3258,6 +3245,18 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
    int mLayerType = LAYER_TYPE_NONE;
    Paint mLayerPaint;
    Rect mLocalDirtyRect;
    private HardwareLayer mHardwareLayer;
    /**
     * Set to true when drawing cache is enabled and cannot be created.
     *
     * @hide
     */
    public boolean mCachingFailed;
    private Bitmap mDrawingCache;
    private Bitmap mUnscaledDrawingCache;
    DisplayList mDisplayList;
    /**
     * Set to true when the view is sending hover accessibility events because it
@@ -3309,8 +3308,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
        mUserPaddingStart = UNDEFINED_PADDING;
        mUserPaddingEnd = UNDEFINED_PADDING;
        if (!sUseBrokenMakeMeasureSpec && context.getApplicationInfo().targetSdkVersion <=
                Build.VERSION_CODES.JELLY_BEAN_MR1 ) {
        if (!sUseBrokenMakeMeasureSpec && context != null &&
                context.getApplicationInfo().targetSdkVersion <= JELLY_BEAN_MR1) {
            // Older apps may need this compatibility hack for measurement.
            sUseBrokenMakeMeasureSpec = true;
        }
@@ -4872,7 +4871,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
     * Note: Called from the default {@link AccessibilityDelegate}.
     */
    void onPopulateAccessibilityEventInternal(AccessibilityEvent event) {
    }
    /**
@@ -8598,8 +8596,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
    void setFlags(int flags, int mask) {
        final boolean accessibilityEnabled =
                AccessibilityManager.getInstance(mContext).isEnabled();
        final boolean oldIncludeForAccessibility = accessibilityEnabled
                ? includeForAccessibility() : false;
        final boolean oldIncludeForAccessibility = accessibilityEnabled && includeForAccessibility();
        int old = mViewFlags;
        mViewFlags = (mViewFlags & ~mask) | (flags & mask);
+20 −12
Original line number Diff line number Diff line
@@ -152,7 +152,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
    private boolean mChildAcceptsDrag;

    // Used during drag dispatch
    private final PointF mLocalPoint = new PointF();
    private PointF mLocalPoint;

    // Layout animation
    private LayoutAnimationController mLayoutAnimationController;
@@ -1129,6 +1129,11 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
        }
    }

    private PointF getLocalPoint() {
        if (mLocalPoint == null) mLocalPoint = new PointF();
        return mLocalPoint;
    }

    /**
     * {@inheritDoc}
     */
@@ -1142,6 +1147,8 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
        ViewRootImpl root = getViewRootImpl();

        // Dispatch down the view hierarchy
        final PointF localPoint = getLocalPoint();

        switch (event.mAction) {
        case DragEvent.ACTION_DRAG_STARTED: {
            // clear state to recalculate which views we drag over
@@ -1202,7 +1209,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager

        case DragEvent.ACTION_DRAG_LOCATION: {
            // Find the [possibly new] drag target
            final View target = findFrontmostDroppableChildAt(event.mX, event.mY, mLocalPoint);
            final View target = findFrontmostDroppableChildAt(event.mX, event.mY, localPoint);

            // If we've changed apparent drag target, tell the view root which view
            // we're over now [for purposes of the eventual drag-recipient-changed
@@ -1236,8 +1243,8 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager

            // Dispatch the actual drag location notice, localized into its coordinates
            if (target != null) {
                event.mX = mLocalPoint.x;
                event.mY = mLocalPoint.y;
                event.mX = localPoint.x;
                event.mY = localPoint.y;

                retval = target.dispatchDragEvent(event);

@@ -1271,11 +1278,11 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager

        case DragEvent.ACTION_DROP: {
            if (ViewDebug.DEBUG_DRAG) Log.d(View.VIEW_LOG_TAG, "Drop event: " + event);
            View target = findFrontmostDroppableChildAt(event.mX, event.mY, mLocalPoint);
            View target = findFrontmostDroppableChildAt(event.mX, event.mY, localPoint);
            if (target != null) {
                if (ViewDebug.DEBUG_DRAG) Log.d(View.VIEW_LOG_TAG, "   dispatch drop to " + target);
                event.mX = mLocalPoint.x;
                event.mY = mLocalPoint.y;
                event.mX = localPoint.x;
                event.mY = localPoint.y;
                retval = target.dispatchDragEvent(event);
                event.mX = tx;
                event.mY = ty;
@@ -2776,7 +2783,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
        return (int) (dips * scale + 0.5f);
    }

    private void drawRectCorners(Canvas canvas, int x1, int y1, int x2, int y2, Paint paint,
    private static void drawRectCorners(Canvas canvas, int x1, int y1, int x2, int y2, Paint paint,
            int lineLength, int lineWidth) {
        drawCorner(canvas, paint, x1, y1, lineLength, lineLength, lineWidth);
        drawCorner(canvas, paint, x1, y2, lineLength, -lineLength, lineWidth);
@@ -6422,7 +6429,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
     */
    private static final class TouchTarget {
        private static final int MAX_RECYCLED = 32;
        private static final Object sRecycleLock = new Object();
        private static final Object sRecycleLock = new Object[0];
        private static TouchTarget sRecycleBin;
        private static int sRecycledCount;

@@ -6474,7 +6481,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
    /* Describes a hovered view. */
    private static final class HoverTarget {
        private static final int MAX_RECYCLED = 32;
        private static final Object sRecycleLock = new Object();
        private static final Object sRecycleLock = new Object[0];
        private static HoverTarget sRecycleBin;
        private static int sRecycledCount;

@@ -6693,8 +6700,9 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
        return sDebugPaint;
    }

    private void drawRect(Canvas canvas, Paint paint, int x1, int y1, int x2, int y2) {
    private static void drawRect(Canvas canvas, Paint paint, int x1, int y1, int x2, int y2) {
        if (sDebugLines== null) {
            // TODO: This won't work with multiple UI threads in a single process
            sDebugLines = new float[16];
        }