Loading core/jni/android/graphics/Shader.cpp +6 −3 Original line number Diff line number Diff line Loading @@ -50,11 +50,14 @@ static jint Color_HSVToColor(JNIEnv* env, jobject, jint alpha, jfloatArray hsvAr /////////////////////////////////////////////////////////////////////////////////////////////// static void Shader_safeUnref(JNIEnv* env, jobject o, jlong shaderHandle) { SkShader* shader = reinterpret_cast<SkShader*>(shaderHandle); static void Shader_safeUnref(SkShader* shader) { SkSafeUnref(shader); } static jlong Shader_getNativeFinalizer(JNIEnv*, jobject) { return static_cast<jlong>(reinterpret_cast<uintptr_t>(&Shader_safeUnref)); } /////////////////////////////////////////////////////////////////////////////////////////////// static jlong BitmapShader_constructor(JNIEnv* env, jobject o, jlong matrixPtr, jobject jbitmap, Loading Loading @@ -284,7 +287,7 @@ static const JNINativeMethod gColorMethods[] = { }; static const JNINativeMethod gShaderMethods[] = { { "nativeSafeUnref", "(J)V", (void*)Shader_safeUnref }, { "nativeGetFinalizer", "()J", (void*)Shader_getNativeFinalizer }, }; static const JNINativeMethod gBitmapShaderMethods[] = { Loading graphics/java/android/graphics/ComposeShader.java +2 −1 Original line number Diff line number Diff line Loading @@ -76,8 +76,9 @@ public class ComposeShader extends Shader { mShaderA.getNativeInstance(), mShaderB.getNativeInstance(), mPorterDuffMode); } /** @hide */ @Override void verifyNativeInstance() { protected void verifyNativeInstance() { if (mShaderA.getNativeInstance() != mNativeInstanceShaderA || mShaderB.getNativeInstance() != mNativeInstanceShaderB) { // Child shader native instance has been updated, Loading graphics/java/android/graphics/Shader.java +22 −21 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package android.graphics; import android.annotation.NonNull; import android.annotation.Nullable; import libcore.util.NativeAllocationRegistry; /** * Shader is the based class for objects that return horizontal spans of colors * during drawing. A subclass of Shader is installed in a Paint calling Loading @@ -26,6 +28,12 @@ import android.annotation.Nullable; * drawn with that paint will get its color(s) from the shader. */ public class Shader { private static class NoImagePreloadHolder { public static final NativeAllocationRegistry sRegistry = new NativeAllocationRegistry( Shader.class.getClassLoader(), nativeGetFinalizer(), 50); } /** * @deprecated Use subclass constructors directly instead. */ Loading @@ -37,6 +45,8 @@ public class Shader { * is called - otherwise may be out of date with java setters/properties. */ private long mNativeInstance; // Runnable to do immediate destruction private Runnable mCleaner; /** * Current matrix - always set to null if local matrix is identity. Loading Loading @@ -105,9 +115,11 @@ public class Shader { return 0; } void discardNativeInstance() { /** @hide */ protected final void discardNativeInstance() { if (mNativeInstance != 0) { nativeSafeUnref(mNativeInstance); mCleaner.run(); mCleaner = null; mNativeInstance = 0; } } Loading @@ -115,20 +127,9 @@ public class Shader { /** * Callback for subclasses to call {@link #discardNativeInstance()} if the most recently * constructed native instance is no longer valid. * @hide */ void verifyNativeInstance() { } @Override protected void finalize() throws Throwable { try { if (mNativeInstance != 0) { nativeSafeUnref(mNativeInstance); } mNativeInstance = -1; } finally { super.finalize(); } protected void verifyNativeInstance() { } /** Loading @@ -150,20 +151,20 @@ public class Shader { /** * @hide */ public long getNativeInstance() { if (mNativeInstance == -1) { throw new IllegalStateException("attempting to use a finalized Shader"); } public final long getNativeInstance() { // verify mNativeInstance is valid verifyNativeInstance(); if (mNativeInstance == 0) { mNativeInstance = createNativeInstance(mLocalMatrix == null ? 0 : mLocalMatrix.native_instance); mCleaner = NoImagePreloadHolder.sRegistry.registerNativeAllocation( this, mNativeInstance); } return mNativeInstance; } private static native void nativeSafeUnref(long nativeInstance); private static native long nativeGetFinalizer(); } Loading
core/jni/android/graphics/Shader.cpp +6 −3 Original line number Diff line number Diff line Loading @@ -50,11 +50,14 @@ static jint Color_HSVToColor(JNIEnv* env, jobject, jint alpha, jfloatArray hsvAr /////////////////////////////////////////////////////////////////////////////////////////////// static void Shader_safeUnref(JNIEnv* env, jobject o, jlong shaderHandle) { SkShader* shader = reinterpret_cast<SkShader*>(shaderHandle); static void Shader_safeUnref(SkShader* shader) { SkSafeUnref(shader); } static jlong Shader_getNativeFinalizer(JNIEnv*, jobject) { return static_cast<jlong>(reinterpret_cast<uintptr_t>(&Shader_safeUnref)); } /////////////////////////////////////////////////////////////////////////////////////////////// static jlong BitmapShader_constructor(JNIEnv* env, jobject o, jlong matrixPtr, jobject jbitmap, Loading Loading @@ -284,7 +287,7 @@ static const JNINativeMethod gColorMethods[] = { }; static const JNINativeMethod gShaderMethods[] = { { "nativeSafeUnref", "(J)V", (void*)Shader_safeUnref }, { "nativeGetFinalizer", "()J", (void*)Shader_getNativeFinalizer }, }; static const JNINativeMethod gBitmapShaderMethods[] = { Loading
graphics/java/android/graphics/ComposeShader.java +2 −1 Original line number Diff line number Diff line Loading @@ -76,8 +76,9 @@ public class ComposeShader extends Shader { mShaderA.getNativeInstance(), mShaderB.getNativeInstance(), mPorterDuffMode); } /** @hide */ @Override void verifyNativeInstance() { protected void verifyNativeInstance() { if (mShaderA.getNativeInstance() != mNativeInstanceShaderA || mShaderB.getNativeInstance() != mNativeInstanceShaderB) { // Child shader native instance has been updated, Loading
graphics/java/android/graphics/Shader.java +22 −21 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package android.graphics; import android.annotation.NonNull; import android.annotation.Nullable; import libcore.util.NativeAllocationRegistry; /** * Shader is the based class for objects that return horizontal spans of colors * during drawing. A subclass of Shader is installed in a Paint calling Loading @@ -26,6 +28,12 @@ import android.annotation.Nullable; * drawn with that paint will get its color(s) from the shader. */ public class Shader { private static class NoImagePreloadHolder { public static final NativeAllocationRegistry sRegistry = new NativeAllocationRegistry( Shader.class.getClassLoader(), nativeGetFinalizer(), 50); } /** * @deprecated Use subclass constructors directly instead. */ Loading @@ -37,6 +45,8 @@ public class Shader { * is called - otherwise may be out of date with java setters/properties. */ private long mNativeInstance; // Runnable to do immediate destruction private Runnable mCleaner; /** * Current matrix - always set to null if local matrix is identity. Loading Loading @@ -105,9 +115,11 @@ public class Shader { return 0; } void discardNativeInstance() { /** @hide */ protected final void discardNativeInstance() { if (mNativeInstance != 0) { nativeSafeUnref(mNativeInstance); mCleaner.run(); mCleaner = null; mNativeInstance = 0; } } Loading @@ -115,20 +127,9 @@ public class Shader { /** * Callback for subclasses to call {@link #discardNativeInstance()} if the most recently * constructed native instance is no longer valid. * @hide */ void verifyNativeInstance() { } @Override protected void finalize() throws Throwable { try { if (mNativeInstance != 0) { nativeSafeUnref(mNativeInstance); } mNativeInstance = -1; } finally { super.finalize(); } protected void verifyNativeInstance() { } /** Loading @@ -150,20 +151,20 @@ public class Shader { /** * @hide */ public long getNativeInstance() { if (mNativeInstance == -1) { throw new IllegalStateException("attempting to use a finalized Shader"); } public final long getNativeInstance() { // verify mNativeInstance is valid verifyNativeInstance(); if (mNativeInstance == 0) { mNativeInstance = createNativeInstance(mLocalMatrix == null ? 0 : mLocalMatrix.native_instance); mCleaner = NoImagePreloadHolder.sRegistry.registerNativeAllocation( this, mNativeInstance); } return mNativeInstance; } private static native void nativeSafeUnref(long nativeInstance); private static native long nativeGetFinalizer(); }