From d8fa8f364c9a33acde10f5af33e77ac868d41a94 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Sat, 9 Nov 2024 15:17:50 +0900 Subject: [PATCH] lottie: improve slots to properly override solid fill opacity --- src/loaders/lottie/tvgLottieModel.cpp | 19 ++++++++++++------- src/loaders/lottie/tvgLottieModel.h | 3 ++- src/loaders/lottie/tvgLottieParser.cpp | 18 ++++++++++++------ 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/loaders/lottie/tvgLottieModel.cpp b/src/loaders/lottie/tvgLottieModel.cpp index 87e4b283..a53de378 100644 --- a/src/loaders/lottie/tvgLottieModel.cpp +++ b/src/loaders/lottie/tvgLottieModel.cpp @@ -76,13 +76,12 @@ void LottieSlot::assign(LottieObject* target) for (auto pair = pairs.begin(); pair < pairs.end(); ++pair) { //backup the original properties before overwriting switch (type) { - case LottieProperty::Type::ColorStop: { + case LottieProperty::Type::Opacity: { if (!overridden) { - pair->prop = new LottieColorStop; - *static_cast(pair->prop) = static_cast(pair->obj)->colorStops; + pair->prop = new LottieOpacity; + *static_cast(pair->prop) = static_cast(pair->obj)->opacity; } - - pair->obj->override(&static_cast(target)->colorStops); + pair->obj->override(&static_cast(target)->opacity); break; } case LottieProperty::Type::Color: { @@ -90,16 +89,22 @@ void LottieSlot::assign(LottieObject* target) pair->prop = new LottieColor; *static_cast(pair->prop) = static_cast(pair->obj)->color; } - pair->obj->override(&static_cast(target)->color); break; } + case LottieProperty::Type::ColorStop: { + if (!overridden) { + pair->prop = new LottieColorStop; + *static_cast(pair->prop) = static_cast(pair->obj)->colorStops; + } + pair->obj->override(&static_cast(target)->colorStops); + break; + } case LottieProperty::Type::TextDoc: { if (!overridden) { pair->prop = new LottieTextDoc; *static_cast(pair->prop) = static_cast(pair->obj)->doc; } - pair->obj->override(&static_cast(target)->doc); break; } diff --git a/src/loaders/lottie/tvgLottieModel.h b/src/loaders/lottie/tvgLottieModel.h index fa1f2351..a22cf196 100644 --- a/src/loaders/lottie/tvgLottieModel.h +++ b/src/loaders/lottie/tvgLottieModel.h @@ -566,7 +566,8 @@ struct LottieSolidFill : LottieSolid void override(LottieProperty* prop) override { - this->color = *static_cast(prop); + if (prop->type == LottieProperty::Type::Opacity) this->opacity = *static_cast(prop); + else if (prop->type == LottieProperty::Type::Color) this->color = *static_cast(prop); this->prepare(); } diff --git a/src/loaders/lottie/tvgLottieParser.cpp b/src/loaders/lottie/tvgLottieParser.cpp index 5bcbfc76..d17da511 100644 --- a/src/loaders/lottie/tvgLottieParser.cpp +++ b/src/loaders/lottie/tvgLottieParser.cpp @@ -1482,6 +1482,18 @@ bool LottieParser::apply(LottieSlot* slot) LottieObject* obj = nullptr; //slot object switch (slot->type) { + case LottieProperty::Type::Opacity: { + obj = new LottieSolid; + context.parent = obj; + parseSlotProperty(static_cast(obj)->opacity); + break; + } + case LottieProperty::Type::Color: { + obj = new LottieSolid; + context.parent = obj; + parseSlotProperty(static_cast(obj)->color); + break; + } case LottieProperty::Type::ColorStop: { obj = new LottieGradient; context.parent = obj; @@ -1491,12 +1503,6 @@ bool LottieParser::apply(LottieSlot* slot) } break; } - case LottieProperty::Type::Color: { - obj = new LottieSolid; - context.parent = obj; - parseSlotProperty(static_cast(obj)->color); - break; - } case LottieProperty::Type::TextDoc: { obj = new LottieText; context.parent = obj;