diff options
| author | 2013-06-17 18:23:42 +0000 | |
|---|---|---|
| committer | 2013-06-17 18:23:42 +0000 | |
| commit | 65aaec3d3906dcb7b44ba9a0fe830f8af76f203f (patch) | |
| tree | 5032dd52a8a2c8d0f7ac83695624a41a36cbc1fb | |
| parent | 2a0451e54a3c3b397861736c42e42125bd938d43 (diff) | |
| parent | 16c0318474c60bdbed04ded25dc4ffea8991857a (diff) | |
Merge "Lazily allocate seldom-used data structures"
| -rw-r--r-- | core/java/android/view/GLES20Canvas.java | 60 | ||||
| -rw-r--r-- | core/java/android/view/GLES20DisplayList.java | 27 | ||||
| -rw-r--r-- | core/java/android/view/GLES20RecordingCanvas.java | 18 | ||||
| -rw-r--r-- | core/java/android/view/View.java | 33 |
4 files changed, 89 insertions, 49 deletions
diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/GLES20Canvas.java index e5a626350d87..831b91487bab 100644 --- a/core/java/android/view/GLES20Canvas.java +++ b/core/java/android/view/GLES20Canvas.java @@ -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; @@ -443,6 +443,31 @@ class GLES20Canvas extends HardwareCanvas { 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 diff --git a/core/java/android/view/GLES20DisplayList.java b/core/java/android/view/GLES20DisplayList.java index d36726734f97..9c5b33d35e30 100644 --- a/core/java/android/view/GLES20DisplayList.java +++ b/core/java/android/view/GLES20DisplayList.java @@ -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 diff --git a/core/java/android/view/GLES20RecordingCanvas.java b/core/java/android/view/GLES20RecordingCanvas.java index ec059d5895af..273947fbc452 100644 --- a/core/java/android/view/GLES20RecordingCanvas.java +++ b/core/java/android/view/GLES20RecordingCanvas.java @@ -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; } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 192492bb12c6..c246cd4200ae 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -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; @@ -3055,18 +3054,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); |