diff options
-rw-r--r-- | graphics/java/android/graphics/RuntimeColorFilter.java | 6 | ||||
-rw-r--r-- | graphics/java/android/graphics/RuntimeShader.java | 11 | ||||
-rw-r--r-- | graphics/java/android/graphics/RuntimeXfermode.java | 4 | ||||
-rw-r--r-- | libs/hwui/jni/ColorFilter.cpp | 18 | ||||
-rw-r--r-- | libs/hwui/jni/RuntimeXfermode.cpp | 16 | ||||
-rw-r--r-- | libs/hwui/jni/Shader.cpp | 12 |
6 files changed, 62 insertions, 5 deletions
diff --git a/graphics/java/android/graphics/RuntimeColorFilter.java b/graphics/java/android/graphics/RuntimeColorFilter.java index d112f7153fca..a64acfe767a9 100644 --- a/graphics/java/android/graphics/RuntimeColorFilter.java +++ b/graphics/java/android/graphics/RuntimeColorFilter.java @@ -280,7 +280,8 @@ public class RuntimeColorFilter extends ColorFilter { if (colorFilter == null) { throw new NullPointerException("The colorFilter parameter must not be null"); } - nativeUpdateChild(getNativeInstance(), filterName, colorFilter.getNativeInstance()); + nativeUpdateInputColorFilter(getNativeInstance(), filterName, + colorFilter.getNativeInstance()); } /** @@ -318,5 +319,6 @@ public class RuntimeColorFilter extends ColorFilter { long colorFilter, String uniformName, int value1, int value2, int value3, int value4, int count); private static native void nativeUpdateChild(long colorFilter, String childName, long child); - + private static native void nativeUpdateInputColorFilter(long colorFilter, String childName, + long inputFilter); } diff --git a/graphics/java/android/graphics/RuntimeShader.java b/graphics/java/android/graphics/RuntimeShader.java index 6316c1fb8b47..3543e991924e 100644 --- a/graphics/java/android/graphics/RuntimeShader.java +++ b/graphics/java/android/graphics/RuntimeShader.java @@ -264,6 +264,9 @@ public class RuntimeShader extends Shader { * enable better heap tracking & tooling support */ private ArrayMap<String, Shader> mShaderUniforms = new ArrayMap<>(); + private ArrayMap<String, ColorFilter> mColorFilterUniforms = new ArrayMap<>(); + private ArrayMap<String, RuntimeXfermode> mXfermodeUniforms = new ArrayMap<>(); + /** * Creates a new RuntimeShader. @@ -544,8 +547,10 @@ public class RuntimeShader extends Shader { if (colorFilter == null) { throw new NullPointerException("The colorFilter parameter must not be null"); } - nativeUpdateChild(mNativeInstanceRuntimeShaderBuilder, filterName, + mColorFilterUniforms.put(filterName, colorFilter); + nativeUpdateColorFilter(mNativeInstanceRuntimeShaderBuilder, filterName, colorFilter.getNativeInstance()); + discardNativeInstance(); } /** @@ -563,8 +568,10 @@ public class RuntimeShader extends Shader { if (xfermode == null) { throw new NullPointerException("The xfermode parameter must not be null"); } + mXfermodeUniforms.put(xfermodeName, xfermode); nativeUpdateChild(mNativeInstanceRuntimeShaderBuilder, xfermodeName, xfermode.createNativeInstance()); + discardNativeInstance(); } @@ -594,6 +601,8 @@ public class RuntimeShader extends Shader { int value4, int count); private static native void nativeUpdateShader( long shaderBuilder, String shaderName, long shader); + private static native void nativeUpdateColorFilter( + long shaderBuilder, String colorFilterName, long colorFilter); private static native void nativeUpdateChild( long shaderBuilder, String childName, long child); } diff --git a/graphics/java/android/graphics/RuntimeXfermode.java b/graphics/java/android/graphics/RuntimeXfermode.java index 51d97a4b7487..c8a0b1a11339 100644 --- a/graphics/java/android/graphics/RuntimeXfermode.java +++ b/graphics/java/android/graphics/RuntimeXfermode.java @@ -285,7 +285,8 @@ public class RuntimeXfermode extends Xfermode { if (colorFilter == null) { throw new NullPointerException("The colorFilter parameter must not be null"); } - nativeUpdateChild(mBuilderNativeInstance, filterName, colorFilter.getNativeInstance()); + nativeUpdateColorFilter(mBuilderNativeInstance, filterName, + colorFilter.getNativeInstance()); } /** @@ -325,5 +326,6 @@ public class RuntimeXfermode extends Xfermode { long builder, String uniformName, int value1, int value2, int value3, int value4, int count); private static native void nativeUpdateChild(long builder, String childName, long child); + private static native void nativeUpdateColorFilter(long builder, String childName, long filter); } diff --git a/libs/hwui/jni/ColorFilter.cpp b/libs/hwui/jni/ColorFilter.cpp index 20301d2c76ec..1c6d886f18b7 100644 --- a/libs/hwui/jni/ColorFilter.cpp +++ b/libs/hwui/jni/ColorFilter.cpp @@ -163,6 +163,20 @@ public: filter->updateChild(env, name.c_str(), child); } } + + static void RuntimeColorFilter_updateInputColorFilter(JNIEnv* env, jobject, + jlong colorFilterPtr, jstring childName, + jlong childFilterPtr) { + auto* filter = reinterpret_cast<RuntimeColorFilter*>(colorFilterPtr); + ScopedUtfChars name(env, childName); + auto* child = reinterpret_cast<ColorFilter*>(childFilterPtr); + if (filter && child) { + auto childInput = child->getInstance(); + if (childInput) { + filter->updateChild(env, name.c_str(), childInput.release()); + } + } + } }; static const JNINativeMethod colorfilter_methods[] = { @@ -193,7 +207,9 @@ static const JNINativeMethod runtime_color_filter_methods[] = { {"nativeUpdateUniforms", "(JLjava/lang/String;IIIII)V", (void*)ColorFilterGlue::RuntimeColorFilter_updateUniformsInts}, {"nativeUpdateChild", "(JLjava/lang/String;J)V", - (void*)ColorFilterGlue::RuntimeColorFilter_updateChild}}; + (void*)ColorFilterGlue::RuntimeColorFilter_updateChild}, + {"nativeUpdateInputColorFilter", "(JLjava/lang/String;J)V", + (void*)ColorFilterGlue::RuntimeColorFilter_updateInputColorFilter}}; int register_android_graphics_ColorFilter(JNIEnv* env) { android::RegisterMethodsOrDie(env, "android/graphics/ColorFilter", colorfilter_methods, diff --git a/libs/hwui/jni/RuntimeXfermode.cpp b/libs/hwui/jni/RuntimeXfermode.cpp index c1c8964bf5eb..17bee8fb8b15 100644 --- a/libs/hwui/jni/RuntimeXfermode.cpp +++ b/libs/hwui/jni/RuntimeXfermode.cpp @@ -14,6 +14,7 @@ * limitations under the License. */ +#include "ColorFilter.h" #include "GraphicsJNI.h" #include "RuntimeEffectUtils.h" #include "SkBlender.h" @@ -93,6 +94,19 @@ static void RuntimeXfermode_updateChild(JNIEnv* env, jobject, jlong builderPtr, } } +static void RuntimeXfermode_updateColorFilter(JNIEnv* env, jobject, jlong builderPtr, + jstring childName, jlong colorFilterPtr) { + auto* builder = reinterpret_cast<SkRuntimeEffectBuilder*>(builderPtr); + ScopedUtfChars name(env, childName); + auto* child = reinterpret_cast<ColorFilter*>(colorFilterPtr); + if (child) { + auto childInput = child->getInstance(); + if (childInput) { + UpdateChild(env, builder, name.c_str(), childInput.release()); + } + } +} + static const JNINativeMethod gRuntimeXfermodeMethods[] = { {"nativeGetFinalizer", "()J", (void*)RuntimeXfermode_getNativeFinalizer}, {"nativeCreateBlenderBuilder", "(Ljava/lang/String;)J", @@ -107,6 +121,8 @@ static const JNINativeMethod gRuntimeXfermodeMethods[] = { {"nativeUpdateUniforms", "(JLjava/lang/String;IIIII)V", (void*)RuntimeXfermode_updateIntUniforms}, {"nativeUpdateChild", "(JLjava/lang/String;J)V", (void*)RuntimeXfermode_updateChild}, + {"nativeUpdateColorFilter", "(JLjava/lang/String;J)V", + (void*)RuntimeXfermode_updateColorFilter}, }; int register_android_graphics_RuntimeXfermode(JNIEnv* env) { diff --git a/libs/hwui/jni/Shader.cpp b/libs/hwui/jni/Shader.cpp index 018c2b1374d0..eadb9dea566f 100644 --- a/libs/hwui/jni/Shader.cpp +++ b/libs/hwui/jni/Shader.cpp @@ -1,5 +1,6 @@ #include <vector> +#include "ColorFilter.h" #include "Gainmap.h" #include "GraphicsJNI.h" #include "RuntimeEffectUtils.h" @@ -331,6 +332,15 @@ static void RuntimeShader_updateShader(JNIEnv* env, jobject, jlong shaderBuilder builder->child(name.c_str()) = sk_ref_sp(shader); } +static void RuntimeShader_updateColorFilter(JNIEnv* env, jobject, jlong shaderBuilder, + jstring jUniformName, jlong colorFilterHandle) { + SkRuntimeShaderBuilder* builder = reinterpret_cast<SkRuntimeShaderBuilder*>(shaderBuilder); + ScopedUtfChars name(env, jUniformName); + auto* childEffect = reinterpret_cast<ColorFilter*>(colorFilterHandle); + + UpdateChild(env, builder, name.c_str(), childEffect->getInstance().release()); +} + static void RuntimeShader_updateChild(JNIEnv* env, jobject, jlong shaderBuilder, jstring jUniformName, jlong childHandle) { SkRuntimeShaderBuilder* builder = reinterpret_cast<SkRuntimeShaderBuilder*>(shaderBuilder); @@ -380,6 +390,8 @@ static const JNINativeMethod gRuntimeShaderMethods[] = { {"nativeUpdateUniforms", "(JLjava/lang/String;IIIII)V", (void*)RuntimeShader_updateIntUniforms}, {"nativeUpdateShader", "(JLjava/lang/String;J)V", (void*)RuntimeShader_updateShader}, + {"nativeUpdateColorFilter", "(JLjava/lang/String;J)V", + (void*)RuntimeShader_updateColorFilter}, {"nativeUpdateChild", "(JLjava/lang/String;J)V", (void*)RuntimeShader_updateChild}, }; |