support additional AE blend modes using custom blenders

implements hardmix blend option
https://helpx.adobe.com/photoshop/using/blending-modes.html#:~:text=to%20an%20image.-,Hard%20Mix,-Adds%20the%20red

buganizer id: b/238882799

Change-Id: If12a157e473e6b6477b2ff02215831ff6a2deba6
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/562310
Reviewed-by: Florin Malita <fmalita@google.com>
Commit-Queue: Jorge Betancourt <jmbetancourt@google.com>
diff --git a/modules/skottie/src/BlendModes.cpp b/modules/skottie/src/BlendModes.cpp
index 61c38d6..4982178 100644
--- a/modules/skottie/src/BlendModes.cpp
+++ b/modules/skottie/src/BlendModes.cpp
@@ -15,6 +15,26 @@
 
 namespace {
 
+enum CustomBlenders {
+    HARDMIX = 17,
+};
+
+static sk_sp<SkBlender> hardMix() {
+    static SkRuntimeEffect* hardMixEffect = []{
+        const char hardMix[] = R"(
+            half4 main(half4 src, half4 dst) {
+                src.rgb = unpremul(src).rgb + unpremul(dst).rgb;
+                src.rgb = min(floor(src.rgb), 1) * src.a;
+
+                return src + (1 - src.a)*dst;
+            }
+        )";
+        auto result = SkRuntimeEffect::MakeForBlender(SkString(hardMix));
+        return result.effect.release();
+    }();
+    return hardMixEffect->makeBlender(nullptr);
+}
+
 static sk_sp<SkBlender> get_blender(const skjson::ObjectValue& jobject,
                                     const AnimationBuilder* abuilder) {
     static constexpr SkBlendMode kBlendModeMap[] = {
@@ -51,7 +71,13 @@
     }
 
     // Modes that require custom blenders.
-    // TODO: add custom blenders
+    switch (mode)
+    {
+    case HARDMIX:
+        return hardMix();
+    default:
+        break;
+    }
 
     abuilder->log(Logger::Level::kWarning, &jobject, "Unsupported blend mode %zu\n", mode);
     return nullptr;