summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Romain Guy <romainguy@google.com> 2013-06-17 18:23:42 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2013-06-17 18:23:42 +0000
commit65aaec3d3906dcb7b44ba9a0fe830f8af76f203f (patch)
tree5032dd52a8a2c8d0f7ac83695624a41a36cbc1fb
parent2a0451e54a3c3b397861736c42e42125bd938d43 (diff)
parent16c0318474c60bdbed04ded25dc4ffea8991857a (diff)
Merge "Lazily allocate seldom-used data structures"
-rw-r--r--core/java/android/view/GLES20Canvas.java60
-rw-r--r--core/java/android/view/GLES20DisplayList.java27
-rw-r--r--core/java/android/view/GLES20RecordingCanvas.java18
-rw-r--r--core/java/android/view/View.java33
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);