From f5af7b13a581a355ae11787eb7279efa64d127ab Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 17 Oct 2024 15:42:28 +0900 Subject: [PATCH] lottie: multiply opacity to the fill alpha value, opacity of a shape may bring a composition when it has both stroke and fill --- src/loaders/lottie/tvgLottieBuilder.cpp | 1 - src/loaders/lottie/tvgLottieModel.cpp | 12 ++++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/loaders/lottie/tvgLottieBuilder.cpp b/src/loaders/lottie/tvgLottieBuilder.cpp index 9ef58224..cb986ecc 100644 --- a/src/loaders/lottie/tvgLottieBuilder.cpp +++ b/src/loaders/lottie/tvgLottieBuilder.cpp @@ -304,7 +304,6 @@ void LottieBuilder::updateGradientFill(LottieGroup* parent, LottieObject** child //TODO: reuse the fill instance? ctx->propagator->fill(unique_ptr(fill->fill(frameNo, exps))); ctx->propagator->fill(fill->rule); - ctx->propagator->opacity(MULTIPLY(fill->opacity(frameNo), PP(ctx->propagator)->opacity)); if (ctx->propagator->strokeWidth() > 0) ctx->propagator->order(true); } diff --git a/src/loaders/lottie/tvgLottieModel.cpp b/src/loaders/lottie/tvgLottieModel.cpp index ff02f51f..782a0314 100644 --- a/src/loaders/lottie/tvgLottieModel.cpp +++ b/src/loaders/lottie/tvgLottieModel.cpp @@ -272,6 +272,9 @@ uint32_t LottieGradient::populate(ColorStop& color, size_t count) Fill* LottieGradient::fill(float frameNo, LottieExpressions* exps) { + auto opacity = this->opacity(frameNo); + if (opacity == 0) return nullptr; + Fill* fill = nullptr; auto s = start(frameNo, exps); auto e = end(frameNo, exps); @@ -307,6 +310,15 @@ Fill* LottieGradient::fill(float frameNo, LottieExpressions* exps) colorStops(frameNo, fill, exps); + //multiply the current opacity with the fill + if (opacity < 255) { + const Fill::ColorStop* colorStops; + auto cnt = fill->colorStops(&colorStops); + for (uint32_t i = 0; i < cnt; ++i) { + const_cast(&colorStops[i])->a = MULTIPLY(colorStops[i].a, opacity); + } + } + return fill; }