Introduce more RenderEffect APIs

Add support for the following RenderEffects:
--RenderEffect.createColorFilterEffect
--RenderEffect.createBitmapEffect
--RenderEffect.createComposeEffect
--RenderEffect.createCombineEffect

Bug: 143468037
Test: Added new CTS tests to RenderNodeTests
Change-Id: I0c1398986d93c17020a4cf770f9782cdc10253bc
diff --git a/libs/hwui/jni/RenderEffect.cpp b/libs/hwui/jni/RenderEffect.cpp
index 0ebd0ca..97c40d6 100644
--- a/libs/hwui/jni/RenderEffect.cpp
+++ b/libs/hwui/jni/RenderEffect.cpp
@@ -48,6 +48,73 @@
     return reinterpret_cast<jlong>(blurFilter.release());
 }
 
+static jlong createBitmapEffect(
+    JNIEnv* env,
+    jobject,
+    jlong bitmapHandle,
+    jfloat srcLeft,
+    jfloat srcTop,
+    jfloat srcRight,
+    jfloat srcBottom,
+    jfloat dstLeft,
+    jfloat dstTop,
+    jfloat dstRight,
+    jfloat dstBottom
+) {
+    sk_sp<SkImage> image = android::bitmap::toBitmap(bitmapHandle).makeImage();
+    SkRect srcRect = SkRect::MakeLTRB(srcLeft, srcTop, srcRight, srcBottom);
+    SkRect dstRect = SkRect::MakeLTRB(dstLeft, dstTop, dstRight, dstBottom);
+    sk_sp<SkImageFilter> bitmapFilter =
+        SkImageFilters::Image(image, srcRect, dstRect, kLow_SkFilterQuality);
+    return reinterpret_cast<jlong>(bitmapFilter.release());
+}
+
+static jlong createColorFilterEffect(
+    JNIEnv* env,
+    jobject,
+    jlong colorFilterHandle,
+    jlong inputFilterHandle
+) {
+    auto* colorFilter = reinterpret_cast<const SkColorFilter*>(colorFilterHandle);
+    auto* inputFilter = reinterpret_cast<const SkImageFilter*>(inputFilterHandle);
+    sk_sp<SkImageFilter> colorFilterImageFilter = SkImageFilters::ColorFilter(
+            sk_ref_sp(colorFilter), sk_ref_sp(inputFilter), nullptr);
+   return reinterpret_cast<jlong>(colorFilterImageFilter.release());
+}
+
+static jlong createBlendModeEffect(
+    JNIEnv* env,
+    jobject,
+    jlong backgroundImageFilterHandle,
+    jlong foregroundImageFilterHandle,
+    jint blendmodeHandle
+) {
+    auto* backgroundFilter = reinterpret_cast<const SkImageFilter*>(backgroundImageFilterHandle);
+    auto* foregroundFilter = reinterpret_cast<const SkImageFilter*>(foregroundImageFilterHandle);
+    SkBlendMode blendMode = static_cast<SkBlendMode>(blendmodeHandle);
+    sk_sp<SkImageFilter> xfermodeFilter = SkImageFilters::Blend(
+            blendMode,
+            sk_ref_sp(backgroundFilter),
+            sk_ref_sp(foregroundFilter)
+    );
+    return reinterpret_cast<jlong>(xfermodeFilter.release());
+}
+
+static jlong createChainEffect(
+    JNIEnv* env,
+    jobject,
+    jlong outerFilterHandle,
+    jlong innerFilterHandle
+) {
+    auto* outerImageFilter = reinterpret_cast<const SkImageFilter*>(outerFilterHandle);
+    auto* innerImageFilter = reinterpret_cast<const SkImageFilter*>(innerFilterHandle);
+    sk_sp<SkImageFilter> composeFilter = SkImageFilters::Compose(
+        sk_ref_sp(outerImageFilter),
+        sk_ref_sp(innerImageFilter)
+    );
+    return reinterpret_cast<jlong>(composeFilter.release());
+}
+
 static void RenderEffect_safeUnref(SkImageFilter* filter) {
     SkSafeUnref(filter);
 }
@@ -59,7 +126,11 @@
 static const JNINativeMethod gRenderEffectMethods[] = {
     {"nativeGetFinalizer", "()J", (void*)getRenderEffectFinalizer},
     {"nativeCreateOffsetEffect", "(FFJ)J", (void*)createOffsetEffect},
-    {"nativeCreateBlurEffect", "(FFJI)J", (void*)createBlurEffect}
+    {"nativeCreateBlurEffect", "(FFJI)J", (void*)createBlurEffect},
+    {"nativeCreateBitmapEffect", "(JFFFFFFFF)J", (void*)createBitmapEffect},
+    {"nativeCreateColorFilterEffect", "(JJ)J", (void*)createColorFilterEffect},
+    {"nativeCreateBlendModeEffect", "(JJI)J", (void*)createBlendModeEffect},
+    {"nativeCreateChainEffect", "(JJ)J", (void*)createChainEffect}
 };
 
 int register_android_graphics_RenderEffect(JNIEnv* env) {