Merge "Use NativeAllocationRegistry for ColorFilter" into oc-dr1-dev
diff --git a/core/jni/android/graphics/ColorFilter.cpp b/core/jni/android/graphics/ColorFilter.cpp
index 5553a3e..4b6578b 100644
--- a/core/jni/android/graphics/ColorFilter.cpp
+++ b/core/jni/android/graphics/ColorFilter.cpp
@@ -30,9 +30,12 @@
class SkColorFilterGlue {
public:
- static void SafeUnref(JNIEnv* env, jobject clazz, jlong skFilterHandle) {
- SkColorFilter* filter = reinterpret_cast<SkColorFilter *>(skFilterHandle);
- SkSafeUnref(filter);
+ static void SafeUnref(SkShader* shader) {
+ SkSafeUnref(shader);
+ }
+
+ static jlong GetNativeFinalizer(JNIEnv*, jobject) {
+ return static_cast<jlong>(reinterpret_cast<uintptr_t>(&SafeUnref));
}
static jlong CreatePorterDuffFilter(JNIEnv* env, jobject, jint srcColor, jint modeHandle) {
@@ -57,7 +60,7 @@
};
static const JNINativeMethod colorfilter_methods[] = {
- {"nSafeUnref", "(J)V", (void*) SkColorFilterGlue::SafeUnref}
+ {"nativeGetFinalizer", "()J", (void*) SkColorFilterGlue::GetNativeFinalizer }
};
static const JNINativeMethod porterduff_methods[] = {
diff --git a/graphics/java/android/graphics/ColorFilter.java b/graphics/java/android/graphics/ColorFilter.java
index 0ca3729..b24b988 100644
--- a/graphics/java/android/graphics/ColorFilter.java
+++ b/graphics/java/android/graphics/ColorFilter.java
@@ -14,19 +14,22 @@
* limitations under the License.
*/
-// This file was generated from the C++ include file: SkColorFilter.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.
-
package android.graphics;
+import libcore.util.NativeAllocationRegistry;
+
/**
* A color filter can be used with a {@link Paint} to modify the color of
* each pixel drawn with that paint. This is an abstract class that should
* never be used directly.
*/
public class ColorFilter {
+
+ private static class NoImagePreloadHolder {
+ public static final NativeAllocationRegistry sRegistry = new NativeAllocationRegistry(
+ ColorFilter.class.getClassLoader(), nativeGetFinalizer(), 50);
+ }
+
/**
* @deprecated Use subclass constructors directly instead.
*/
@@ -34,9 +37,11 @@
public ColorFilter() {}
/**
- * Holds the pointer to the native SkColorFilter instance.
+ * Current native SkColorFilter instance.
*/
private long mNativeInstance;
+ // Runnable to do immediate destruction
+ private Runnable mCleaner;
long createNativeInstance() {
return 0;
@@ -44,35 +49,28 @@
void discardNativeInstance() {
if (mNativeInstance != 0) {
- nSafeUnref(mNativeInstance);
+ mCleaner.run();
+ mCleaner = null;
mNativeInstance = 0;
}
}
- @Override
- protected void finalize() throws Throwable {
- try {
- if (mNativeInstance != 0) {
- nSafeUnref(mNativeInstance);
- }
- mNativeInstance = -1;
- } finally {
- super.finalize();
- }
- }
-
/** @hide */
public long getNativeInstance() {
- if (mNativeInstance == -1) {
- throw new IllegalStateException("attempting to use a finalized ColorFilter");
- }
-
if (mNativeInstance == 0) {
mNativeInstance = createNativeInstance();
+
+ if (mNativeInstance != 0) {
+ // Note: we must check for null here, since it's possible for createNativeInstance()
+ // to return nullptr if the native SkColorFilter would be a no-op at draw time.
+ // See native implementations of subclass create methods for more info.
+ mCleaner = NoImagePreloadHolder.sRegistry.registerNativeAllocation(
+ this, mNativeInstance);
+ }
}
return mNativeInstance;
}
- static native void nSafeUnref(long native_instance);
+ private static native long nativeGetFinalizer();
}