From 5262726b04d08a775475216b020e533aaccd7630 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 9 Jun 2025 18:42:56 +0900 Subject: [PATCH] lottie: fixed a repeater opacity logic preserve the target opacity by multiplying, do not overwrite it. --- src/loaders/lottie/tvgLottieBuilder.cpp | 9 +++------ src/loaders/lottie/tvgLottieBuilder.h | 1 - 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/loaders/lottie/tvgLottieBuilder.cpp b/src/loaders/lottie/tvgLottieBuilder.cpp index 6df50b60..eef38814 100644 --- a/src/loaders/lottie/tvgLottieBuilder.cpp +++ b/src/loaders/lottie/tvgLottieBuilder.cpp @@ -354,9 +354,8 @@ static void _repeat(LottieGroup* parent, Shape* path, RenderContext* ctx) for (auto propagator = propagators.begin(); propagator < propagators.end(); ++propagator) { auto shape = static_cast((*propagator)->duplicate()); P(shape)->rs.path = P(path)->rs.path; - - auto opacity = repeater->interpOpacity ? lerp(repeater->startOpacity, repeater->endOpacity, static_cast(i + 1) / repeater->cnt) : repeater->startOpacity; - shape->opacity(opacity); + auto opacity = tvg::lerp(repeater->startOpacity, repeater->endOpacity, static_cast(i + 1) / repeater->cnt); + shape->opacity(MULTIPLY(shape->opacity(), opacity)); Matrix m; identity(&m); @@ -364,11 +363,10 @@ static void _repeat(LottieGroup* parent, Shape* path, RenderContext* ctx) scale(&m, powf(repeater->scale.x * 0.01f, multiplier), powf(repeater->scale.y * 0.01f, multiplier)); rotate(&m, repeater->rotation * multiplier); translateR(&m, -repeater->anchor.x, -repeater->anchor.y); - m = repeater->transform * m; Matrix inv; inverse(&repeater->transform, &inv); - shape->transform(m * (inv * PP(shape)->transform())); + shape->transform((repeater->transform * m) * (inv * PP(shape)->transform())); shapes.push(shape); } } @@ -856,7 +854,6 @@ void LottieBuilder::updateRepeater(TVG_UNUSED LottieGroup* parent, LottieObject* r.startOpacity = repeater->startOpacity(frameNo, exps); r.endOpacity = repeater->endOpacity(frameNo, exps); r.inorder = repeater->inorder; - r.interpOpacity = (r.startOpacity == r.endOpacity) ? false : true; ctx->repeaters.push(r); ctx->merging = nullptr; diff --git a/src/loaders/lottie/tvgLottieBuilder.h b/src/loaders/lottie/tvgLottieBuilder.h index 0a30f79a..4d9a4266 100644 --- a/src/loaders/lottie/tvgLottieBuilder.h +++ b/src/loaders/lottie/tvgLottieBuilder.h @@ -43,7 +43,6 @@ struct RenderRepeater float rotation; uint8_t startOpacity; uint8_t endOpacity; - bool interpOpacity; bool inorder; };