diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/java/android/animation/TimeInterpolator.java | 2 | ||||
-rwxr-xr-x | core/java/android/animation/ValueAnimator.java | 2 | ||||
-rw-r--r-- | core/java/android/view/DisplayList.java | 6 | ||||
-rw-r--r-- | core/java/android/view/GLES20Canvas.java | 34 | ||||
-rw-r--r-- | core/java/android/view/GLES20DisplayList.java | 43 | ||||
-rw-r--r-- | core/java/android/view/HardwareCanvas.java | 8 | ||||
-rw-r--r-- | core/java/android/view/HardwareRenderer.java | 1 | ||||
-rw-r--r-- | core/java/android/view/View.java | 8 | ||||
-rw-r--r-- | core/java/android/view/ViewGroup.java | 16 | ||||
-rw-r--r-- | core/jni/android/graphics/Bitmap.cpp | 11 | ||||
-rw-r--r-- | core/jni/android/graphics/Matrix.cpp | 13 | ||||
-rw-r--r-- | core/jni/android/graphics/Paint.cpp | 12 | ||||
-rw-r--r-- | core/jni/android/graphics/Shader.cpp | 6 | ||||
-rw-r--r-- | core/jni/android_view_GLES20Canvas.cpp | 4 |
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; } |