diff --git a/src/loaders/lottie/tvgLottieBuilder.cpp b/src/loaders/lottie/tvgLottieBuilder.cpp index b6a79c3e..ce66a1bb 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 3c87acdf..aa302190 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; }