From 8918190a198f5a0c602dd5d126e5fab8e537fda0 Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Tue, 10 Aug 2010 21:55:44 -0700 Subject: Support non-PorterDuff xfermodes with Xfermode. Change-Id: Icef17b72da2d047a24aaac1ddf5cdae77b40d5b4 --- graphics/java/android/graphics/ComposeShader.java | 15 +++++++++++++-- graphics/java/android/graphics/PorterDuffXfermode.java | 6 ++++++ graphics/java/android/graphics/Xfermode.java | 6 +++++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/graphics/java/android/graphics/ComposeShader.java b/graphics/java/android/graphics/ComposeShader.java index ac1f277..e88211a 100644 --- a/graphics/java/android/graphics/ComposeShader.java +++ b/graphics/java/android/graphics/ComposeShader.java @@ -20,7 +20,12 @@ package android.graphics; an {@link android.graphics.Xfermode} subclass. */ public class ComposeShader extends Shader { + /** + * Hold onto the shaders to avoid GC. + */ + @SuppressWarnings({"UnusedDeclaration"}) private final Shader mShaderA; + @SuppressWarnings({"UnusedDeclaration"}) private final Shader mShaderB; /** Create a new compose shader, given shaders A, B, and a combining mode. @@ -36,8 +41,14 @@ public class ComposeShader extends Shader { mShaderB = shaderB; native_instance = nativeCreate1(shaderA.native_instance, shaderB.native_instance, (mode != null) ? mode.native_instance : 0); - native_shader = nativePostCreate1(native_instance, shaderA.native_shader, - shaderB.native_shader, (mode != null) ? mode.native_instance : 0); + if (mode instanceof PorterDuffXfermode) { + PorterDuff.Mode pdMode = ((PorterDuffXfermode) mode).mode; + native_shader = nativePostCreate1(native_instance, shaderA.native_shader, + shaderB.native_shader, pdMode != null ? pdMode.nativeInt : 0); + } else { + native_shader = nativePostCreate1(native_instance, shaderA.native_shader, + shaderB.native_shader, mode != null ? mode.native_instance : 0); + } } /** Create a new compose shader, given shaders A, B, and a combining PorterDuff mode. diff --git a/graphics/java/android/graphics/PorterDuffXfermode.java b/graphics/java/android/graphics/PorterDuffXfermode.java index cb127fd..6ba064c 100644 --- a/graphics/java/android/graphics/PorterDuffXfermode.java +++ b/graphics/java/android/graphics/PorterDuffXfermode.java @@ -18,11 +18,17 @@ package android.graphics; public class PorterDuffXfermode extends Xfermode { /** + * @hide + */ + public final PorterDuff.Mode mode; + + /** * Create an xfermode that uses the specified porter-duff mode. * * @param mode The porter-duff mode that is applied */ public PorterDuffXfermode(PorterDuff.Mode mode) { + this.mode = mode; native_instance = nativeCreateXfermode(mode.nativeInt); } diff --git a/graphics/java/android/graphics/Xfermode.java b/graphics/java/android/graphics/Xfermode.java index 42c410e..2467bdc 100644 --- a/graphics/java/android/graphics/Xfermode.java +++ b/graphics/java/android/graphics/Xfermode.java @@ -31,7 +31,11 @@ package android.graphics; public class Xfermode { protected void finalize() throws Throwable { - finalizer(native_instance); + try { + finalizer(native_instance); + } finally { + super.finalize(); + } } private static native void finalizer(int native_instance); -- cgit v1.1