summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/java/android/animation/TimeInterpolator.java2
-rwxr-xr-xcore/java/android/animation/ValueAnimator.java2
-rw-r--r--core/java/android/view/DisplayList.java6
-rw-r--r--core/java/android/view/GLES20Canvas.java34
-rw-r--r--core/java/android/view/GLES20DisplayList.java43
-rw-r--r--core/java/android/view/HardwareCanvas.java8
-rw-r--r--core/java/android/view/HardwareRenderer.java1
-rw-r--r--core/java/android/view/View.java8
-rw-r--r--core/java/android/view/ViewGroup.java16
-rw-r--r--core/jni/android/graphics/Bitmap.cpp11
-rw-r--r--core/jni/android/graphics/Matrix.cpp13
-rw-r--r--core/jni/android/graphics/Paint.cpp12
-rw-r--r--core/jni/android/graphics/Shader.cpp6
-rw-r--r--core/jni/android_view_GLES20Canvas.cpp4
14 files changed, 91 insertions, 75 deletions
diff --git a/core/java/android/animation/TimeInterpolator.java b/core/java/android/animation/TimeInterpolator.java
index 8d795a8..0f5d8bf 100644
--- a/core/java/android/animation/TimeInterpolator.java
+++ b/core/java/android/animation/TimeInterpolator.java
@@ -23,7 +23,7 @@ package android.animation;
public interface TimeInterpolator {
/**
- * Maps a value representing the elapsed fraciton of an animation to a value that represents
+ * Maps a value representing the elapsed fraction of an animation to a value that represents
* the interpolated fraction. This interpolated value is then multiplied by the change in
* value of an animation to derive the animated value at the current elapsed animation time.
*
diff --git a/core/java/android/animation/ValueAnimator.java b/core/java/android/animation/ValueAnimator.java
index 79754b8..d60a598 100755
--- a/core/java/android/animation/ValueAnimator.java
+++ b/core/java/android/animation/ValueAnimator.java
@@ -523,7 +523,6 @@ public class ValueAnimator extends Animator {
for (int i = 0; i < numValues; ++i) {
mValues[i].init();
}
- mCurrentIteration = 0;
mInitialized = true;
}
}
@@ -933,6 +932,7 @@ public class ValueAnimator extends Animator {
// This sets the initial value of the animation, prior to actually starting it running
setCurrentPlayTime(getCurrentPlayTime());
}
+ mCurrentIteration = 0;
mPlayingState = STOPPED;
mStartedDelay = false;
sPendingAnimations.add(this);
diff --git a/core/java/android/view/DisplayList.java b/core/java/android/view/DisplayList.java
index b1160f0..e7c2231 100644
--- a/core/java/android/view/DisplayList.java
+++ b/core/java/android/view/DisplayList.java
@@ -39,12 +39,6 @@ abstract class DisplayList {
abstract void end();
/**
- * Frees resources taken by this display list. This method must be called
- * before releasing all references.
- */
- abstract void destroy();
-
- /**
* Indicates whether this display list can be replayed or not.
*
* @return True if the display list can be replayed, false otherwise.
diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/GLES20Canvas.java
index d78c68a..5d9bd1e 100644
--- a/core/java/android/view/GLES20Canvas.java
+++ b/core/java/android/view/GLES20Canvas.java
@@ -34,6 +34,11 @@ import android.text.GraphicsOperations;
import android.text.SpannableString;
import android.text.SpannedString;
import android.text.TextUtils;
+import android.util.Finalizers;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
/**
* An implementation of Canvas on top of OpenGL ES 2.0.
@@ -84,22 +89,35 @@ class GLES20Canvas extends HardwareCanvas {
if (mRenderer == 0) {
throw new IllegalStateException("Could not create GLES20Canvas renderer");
+ } else {
+ new CanvasFinalizer(this);
}
}
private native int nCreateRenderer();
private native int nCreateDisplayListRenderer();
- @Override
- public synchronized void destroy() {
- if (mRenderer != 0) {
+ private static native void nDestroyRenderer(int renderer);
+
+ private static class CanvasFinalizer extends Finalizers.ReclaimableReference<GLES20Canvas> {
+ private static final Set<CanvasFinalizer> sFinalizers = Collections.synchronizedSet(
+ new HashSet<CanvasFinalizer>());
+
+ private int mRenderer;
+
+ CanvasFinalizer(GLES20Canvas canvas) {
+ super(canvas, Finalizers.getQueue());
+ mRenderer = canvas.mRenderer;
+ sFinalizers.add(this);
+ }
+
+ @Override
+ public void reclaim() {
nDestroyRenderer(mRenderer);
- mRenderer = 0;
+ sFinalizers.remove(this);
}
}
- private native void nDestroyRenderer(int renderer);
-
///////////////////////////////////////////////////////////////////////////
// Canvas management
///////////////////////////////////////////////////////////////////////////
@@ -178,11 +196,11 @@ class GLES20Canvas extends HardwareCanvas {
private native int nCreateDisplayList(int renderer);
- void destroyDisplayList(int displayList) {
+ static void destroyDisplayList(int displayList) {
nDestroyDisplayList(displayList);
}
- private native void nDestroyDisplayList(int displayList);
+ private static native void nDestroyDisplayList(int displayList);
@Override
public void drawDisplayList(DisplayList displayList) {
diff --git a/core/java/android/view/GLES20DisplayList.java b/core/java/android/view/GLES20DisplayList.java
index 2886bf3..11e6d30 100644
--- a/core/java/android/view/GLES20DisplayList.java
+++ b/core/java/android/view/GLES20DisplayList.java
@@ -16,6 +16,12 @@
package android.view;
+import android.util.Finalizers;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
/**
* An implementation of display list for OpenGL ES 2.0.
*/
@@ -33,8 +39,6 @@ class GLES20DisplayList extends DisplayList {
throw new IllegalStateException("Recording has already started");
}
- destroyCanvas();
-
mCanvas = new GLES20Canvas(true, true);
mStarted = true;
mRecorded = false;
@@ -42,16 +46,6 @@ class GLES20DisplayList extends DisplayList {
return mCanvas;
}
- private void destroyCanvas() {
- if (mCanvas != null) {
- mCanvas.destroyDisplayList(mNativeDisplayList);
- mCanvas.destroy();
-
- mCanvas = null;
- mNativeDisplayList = 0;
- }
- }
-
@Override
void end() {
if (mCanvas != null) {
@@ -59,16 +53,31 @@ class GLES20DisplayList extends DisplayList {
mRecorded = true;
mNativeDisplayList = mCanvas.getDisplayList();
+ new DisplayListFinalizer(this);
}
}
@Override
- void destroy() {
- destroyCanvas();
- }
-
- @Override
boolean isReady() {
return !mStarted && mRecorded;
}
+
+ private static class DisplayListFinalizer extends Finalizers.ReclaimableReference<DisplayList> {
+ private static final Set<DisplayListFinalizer> sFinalizers = Collections.synchronizedSet(
+ new HashSet<DisplayListFinalizer>());
+
+ private int mNativeDisplayList;
+
+ DisplayListFinalizer(GLES20DisplayList displayList) {
+ super(displayList, Finalizers.getQueue());
+ mNativeDisplayList = displayList.mNativeDisplayList;
+ sFinalizers.add(this);
+ }
+
+ @Override
+ public void reclaim() {
+ GLES20Canvas.destroyDisplayList(mNativeDisplayList);
+ sFinalizers.remove(this);
+ }
+ }
}
diff --git a/core/java/android/view/HardwareCanvas.java b/core/java/android/view/HardwareCanvas.java
index 22d2fe6..8b8d15e 100644
--- a/core/java/android/view/HardwareCanvas.java
+++ b/core/java/android/view/HardwareCanvas.java
@@ -34,14 +34,6 @@ abstract class HardwareCanvas extends Canvas {
}
/**
- * This method <strong>must</strong> be called before releasing a
- * reference to a hardware canvas. This method is responsible for
- * freeing native resources associated with the hardware. Not
- * invoking this method properly can result in memory leaks.
- */
- public abstract void destroy();
-
- /**
* Invoked before any drawing operation is performed in this canvas.
*/
abstract void onPreDraw();
diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java
index 0247f6a..6f4abef 100644
--- a/core/java/android/view/HardwareRenderer.java
+++ b/core/java/android/view/HardwareRenderer.java
@@ -414,7 +414,6 @@ public abstract class HardwareRenderer {
@Override
void destroy(boolean full) {
if (full && mCanvas != null) {
- mCanvas.destroy();
mCanvas = null;
}
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index baa749a..0456463 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -7417,7 +7417,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility
if ((mViewFlags & WILL_NOT_CACHE_DRAWING) == WILL_NOT_CACHE_DRAWING) {
return null;
}
-
if (mAttachInfo == null || mAttachInfo.mHardwareRenderer == null) {
return null;
}
@@ -7425,10 +7424,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility
if ((mViewFlags & DRAWING_CACHE_ENABLED) == DRAWING_CACHE_ENABLED &&
((mPrivateFlags & DRAWING_CACHE_VALID) == 0 || mDisplayList == null)) {
- if (mDisplayList != null) {
- mDisplayList.destroy();
- }
-
mDisplayList = mAttachInfo.mHardwareRenderer.createDisplayList();
final HardwareCanvas canvas = mDisplayList.start();
@@ -7456,8 +7451,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility
canvas.onPostDraw();
mDisplayList.end();
-
- canvas.destroy();
}
}
@@ -7532,7 +7525,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility
mUnscaledDrawingCache = null;
}
if (mDisplayList != null) {
- mDisplayList.destroy();
mDisplayList = null;
}
}
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index f34fd63..7b2703b 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -1700,10 +1700,10 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
}
return false;
}
-
+
/**
* {@inheritDoc}
- *
+ *
* @hide
*/
@Override
@@ -1715,10 +1715,10 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
children[i].dispatchStartTemporaryDetach();
}
}
-
+
/**
* {@inheritDoc}
- *
+ *
* @hide
*/
@Override
@@ -1915,7 +1915,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
if (skipChildren) {
for (int i = 0; i < count; i++) {
getChildAt(i).setVisibility(visibilities[i]);
- }
+ }
}
return b;
@@ -2045,7 +2045,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
*
* @param i The current iteration.
* @return The index of the child to draw this iteration.
- *
+ *
* @see #setChildrenDrawingOrderEnabled(boolean)
* @see #isChildrenDrawingOrderEnabled()
*/
@@ -2186,7 +2186,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
(child.mPrivateFlags & DRAW_ANIMATION) == 0) {
return more;
}
-
+
float alpha = child.getAlpha();
// Bail out early if the view does not need to be drawn
if (alpha <= ViewConfiguration.ALPHA_THRESHOLD && (child.mPrivateFlags & ALPHA_SET) == 0 &&
@@ -2360,7 +2360,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
final View[] children = mChildren;
final int count = mChildrenCount;
for (int i = 0; i < count; i++) {
-
+
children[i].setSelected(selected);
}
}
diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp
index 880fb6e..f8a80b0 100644
--- a/core/jni/android/graphics/Bitmap.cpp
+++ b/core/jni/android/graphics/Bitmap.cpp
@@ -255,14 +255,21 @@ static jobject Bitmap_copy(JNIEnv* env, jobject, const SkBitmap* src,
static void Bitmap_destructor(JNIEnv* env, jobject, SkBitmap* bitmap) {
#ifdef USE_OPENGL_RENDERER
if (android::uirenderer::Caches::hasInstance()) {
- android::uirenderer::Caches::getInstance().textureCache.remove(bitmap);
+ android::uirenderer::Caches::getInstance().resourceCache.destructor(bitmap);
}
-#endif
+#else // !USE_OPENGL_RENDERER
delete bitmap;
+#endif
}
static void Bitmap_recycle(JNIEnv* env, jobject, SkBitmap* bitmap) {
+#ifdef USE_OPENGL_RENDERER
+ if (android::uirenderer::Caches::hasInstance()) {
+ android::uirenderer::Caches::getInstance().resourceCache.recycle(bitmap);
+ }
+#else // !USE_OPENGL_RENDERER
bitmap->setPixels(NULL, NULL);
+#endif // USE_OPENGL_RENDERER
}
// These must match the int values in Bitmap.java
diff --git a/core/jni/android/graphics/Matrix.cpp b/core/jni/android/graphics/Matrix.cpp
index cafceab..6667756 100644
--- a/core/jni/android/graphics/Matrix.cpp
+++ b/core/jni/android/graphics/Matrix.cpp
@@ -15,11 +15,6 @@
** limitations under the License.
*/
-// This file was generated from the C++ include file: SkMatrix.h
-// Any changes made to this file will be discarded by the build.
-// To change this file, either edit the include, or device/tools/gluemaker/main.cpp,
-// or one of the auxilary file specifications in device/tools/gluemaker.
-
#include "jni.h"
#include "GraphicsJNI.h"
#include <android_runtime/AndroidRuntime.h>
@@ -29,13 +24,21 @@
#include "Matrix.h"
+#include <Caches.h>
+
namespace android {
class SkMatrixGlue {
public:
static void finalizer(JNIEnv* env, jobject clazz, SkMatrix* obj) {
+#ifdef USE_OPENGL_RENDERER
+ if (android::uirenderer::Caches::hasInstance()) {
+ android::uirenderer::Caches::getInstance().resourceCache.destructor(obj);
+ }
+#else // !USE_OPENGL_RENDERER
delete obj;
+#endif
}
static SkMatrix* create(JNIEnv* env, jobject clazz, const SkMatrix* src) {
diff --git a/core/jni/android/graphics/Paint.cpp b/core/jni/android/graphics/Paint.cpp
index ca9f371..339c1a4 100644
--- a/core/jni/android/graphics/Paint.cpp
+++ b/core/jni/android/graphics/Paint.cpp
@@ -15,11 +15,6 @@
** limitations under the License.
*/
-// This file was generated from the C++ include file: SkPaint.h
-// Any changes made to this file will be discarded by the build.
-// To change this file, either edit the include, or device/tools/gluemaker/main.cpp,
-// or one of the auxilary file specifications in device/tools/gluemaker.
-
#include "jni.h"
#include "GraphicsJNI.h"
#include <android_runtime/AndroidRuntime.h>
@@ -35,6 +30,7 @@
#include "TextLayout.h"
// temporary for debugging
+#include <Caches.h>
#include <utils/Log.h>
namespace android {
@@ -67,7 +63,13 @@ public:
};
static void finalizer(JNIEnv* env, jobject clazz, SkPaint* obj) {
+#ifdef USE_OPENGL_RENDERER
+ if (android::uirenderer::Caches::hasInstance()) {
+ android::uirenderer::Caches::getInstance().resourceCache.destructor(obj);
+ }
+#else // !USE_OPENGL_RENDERER
delete obj;
+#endif
}
static SkPaint* init(JNIEnv* env, jobject clazz) {
diff --git a/core/jni/android/graphics/Shader.cpp b/core/jni/android/graphics/Shader.cpp
index ee44747..79051c2 100644
--- a/core/jni/android/graphics/Shader.cpp
+++ b/core/jni/android/graphics/Shader.cpp
@@ -53,13 +53,13 @@ static int Color_HSVToColor(JNIEnv* env, jobject, int alpha, jfloatArray hsvArra
static void Shader_destructor(JNIEnv* env, jobject o, SkShader* shader, SkiaShader* skiaShader)
{
+ shader->safeUnref();
+ // skiaShader == NULL when not !USE_OPENGL_RENDERER, so no need to delete it outside the ifdef
#ifdef USE_OPENGL_RENDERER
if (android::uirenderer::Caches::hasInstance()) {
- android::uirenderer::Caches::getInstance().gradientCache.remove(shader);
+ android::uirenderer::Caches::getInstance().resourceCache.destructor(skiaShader);
}
#endif
- delete skiaShader;
- shader->safeUnref();
}
static bool Shader_getLocalMatrix(JNIEnv* env, jobject, const SkShader* shader, SkMatrix* matrix)
diff --git a/core/jni/android_view_GLES20Canvas.cpp b/core/jni/android_view_GLES20Canvas.cpp
index cfa9a27..6d848a4 100644
--- a/core/jni/android_view_GLES20Canvas.cpp
+++ b/core/jni/android_view_GLES20Canvas.cpp
@@ -87,7 +87,7 @@ static OpenGLRenderer* android_view_GLES20Canvas_createRenderer(JNIEnv* env, job
#endif
}
-static void android_view_GLES20Canvas_destroyRenderer(JNIEnv* env, jobject canvas,
+static void android_view_GLES20Canvas_destroyRenderer(JNIEnv* env, jobject clazz,
OpenGLRenderer* renderer) {
RENDERER_LOGD("Destroy OpenGLRenderer");
delete renderer;
@@ -415,7 +415,7 @@ static DisplayList* android_view_GLES20Canvas_createDisplayList(JNIEnv* env,
}
static void android_view_GLES20Canvas_destroyDisplayList(JNIEnv* env,
- jobject canvas, DisplayList* displayList) {
+ jobject clazz, DisplayList* displayList) {
delete displayList;
}