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;