diff --git a/src/loaders/lottie/tvgLottieBuilder.cpp b/src/loaders/lottie/tvgLottieBuilder.cpp index ae0f8144..7a3ee108 100644 --- a/src/loaders/lottie/tvgLottieBuilder.cpp +++ b/src/loaders/lottie/tvgLottieBuilder.cpp @@ -198,11 +198,18 @@ void LottieBuilder::updateGroup(LottieGroup* parent, LottieObject** child, float if (!group->visible) return; //Prepare render data - group->scene = parent->scene; + if (group->blendMethod == parent->blendMethod) { + group->scene = parent->scene; + } else { + group->scene = tvg::Scene::gen(); + group->scene->blend(group->blendMethod); + parent->scene->push(group->scene); + } + group->reqFragment |= ctx->reqFragment; //generate a merging shape to consolidate partial shapes into a single entity - if (group->mergeable()) _draw(parent, nullptr, ctx); + if (group->mergeable()) _draw(group, nullptr, ctx); Inlist contexts; auto propagator = group->mergeable() ? ctx->propagator : static_cast(PAINT(ctx->propagator)->duplicate(group->pooling())); diff --git a/src/loaders/lottie/tvgLottieModel.h b/src/loaders/lottie/tvgLottieModel.h index 9b8e819a..6b279fe3 100644 --- a/src/loaders/lottie/tvgLottieModel.h +++ b/src/loaders/lottie/tvgLottieModel.h @@ -957,6 +957,7 @@ struct LottieGroup : LottieObject, LottieRenderPooler Scene* scene = nullptr; Array children; + BlendMethod blendMethod = BlendMethod::Normal; bool reqFragment : 1; //requirement to fragment the render context bool buildDone : 1; //completed in building the composition. @@ -1006,7 +1007,6 @@ struct LottieLayer : LottieGroup } cache; MaskMethod matteType = MaskMethod::None; - BlendMethod blendMethod = BlendMethod::Normal; Type type = Null; bool autoOrient = false; bool matteSrc = false; diff --git a/src/loaders/lottie/tvgLottieParser.cpp b/src/loaders/lottie/tvgLottieParser.cpp index 9ef4a3bf..54a3e381 100644 --- a/src/loaders/lottie/tvgLottieParser.cpp +++ b/src/loaders/lottie/tvgLottieParser.cpp @@ -1079,6 +1079,8 @@ LottieObject* LottieParser::parseGroup() else if (KEY_AS("it")) { enterArray(); while (nextArrayValue()) parseObject(group->children); + } else if (KEY_AS("bm")) { + group->blendMethod = (BlendMethod) getInt(); } else skip(); } group->prepare();