lottie: improve slots to properly override solid fill opacity

This commit is contained in:
Hermet Park 2024-11-09 15:17:50 +09:00
parent f84b2331da
commit d8fa8f364c
3 changed files with 26 additions and 14 deletions

View file

@ -76,13 +76,12 @@ void LottieSlot::assign(LottieObject* target)
for (auto pair = pairs.begin(); pair < pairs.end(); ++pair) { for (auto pair = pairs.begin(); pair < pairs.end(); ++pair) {
//backup the original properties before overwriting //backup the original properties before overwriting
switch (type) { switch (type) {
case LottieProperty::Type::ColorStop: { case LottieProperty::Type::Opacity: {
if (!overridden) { if (!overridden) {
pair->prop = new LottieColorStop; pair->prop = new LottieOpacity;
*static_cast<LottieColorStop*>(pair->prop) = static_cast<LottieGradient*>(pair->obj)->colorStops; *static_cast<LottieOpacity*>(pair->prop) = static_cast<LottieSolid*>(pair->obj)->opacity;
} }
pair->obj->override(&static_cast<LottieSolid*>(target)->opacity);
pair->obj->override(&static_cast<LottieGradient*>(target)->colorStops);
break; break;
} }
case LottieProperty::Type::Color: { case LottieProperty::Type::Color: {
@ -90,16 +89,22 @@ void LottieSlot::assign(LottieObject* target)
pair->prop = new LottieColor; pair->prop = new LottieColor;
*static_cast<LottieColor*>(pair->prop) = static_cast<LottieSolid*>(pair->obj)->color; *static_cast<LottieColor*>(pair->prop) = static_cast<LottieSolid*>(pair->obj)->color;
} }
pair->obj->override(&static_cast<LottieSolid*>(target)->color); pair->obj->override(&static_cast<LottieSolid*>(target)->color);
break; break;
} }
case LottieProperty::Type::ColorStop: {
if (!overridden) {
pair->prop = new LottieColorStop;
*static_cast<LottieColorStop*>(pair->prop) = static_cast<LottieGradient*>(pair->obj)->colorStops;
}
pair->obj->override(&static_cast<LottieGradient*>(target)->colorStops);
break;
}
case LottieProperty::Type::TextDoc: { case LottieProperty::Type::TextDoc: {
if (!overridden) { if (!overridden) {
pair->prop = new LottieTextDoc; pair->prop = new LottieTextDoc;
*static_cast<LottieTextDoc*>(pair->prop) = static_cast<LottieText*>(pair->obj)->doc; *static_cast<LottieTextDoc*>(pair->prop) = static_cast<LottieText*>(pair->obj)->doc;
} }
pair->obj->override(&static_cast<LottieText*>(target)->doc); pair->obj->override(&static_cast<LottieText*>(target)->doc);
break; break;
} }

View file

@ -566,7 +566,8 @@ struct LottieSolidFill : LottieSolid
void override(LottieProperty* prop) override void override(LottieProperty* prop) override
{ {
this->color = *static_cast<LottieColor*>(prop); if (prop->type == LottieProperty::Type::Opacity) this->opacity = *static_cast<LottieOpacity*>(prop);
else if (prop->type == LottieProperty::Type::Color) this->color = *static_cast<LottieColor*>(prop);
this->prepare(); this->prepare();
} }

View file

@ -1482,6 +1482,18 @@ bool LottieParser::apply(LottieSlot* slot)
LottieObject* obj = nullptr; //slot object LottieObject* obj = nullptr; //slot object
switch (slot->type) { switch (slot->type) {
case LottieProperty::Type::Opacity: {
obj = new LottieSolid;
context.parent = obj;
parseSlotProperty<LottieProperty::Type::Opacity>(static_cast<LottieSolid*>(obj)->opacity);
break;
}
case LottieProperty::Type::Color: {
obj = new LottieSolid;
context.parent = obj;
parseSlotProperty<LottieProperty::Type::Color>(static_cast<LottieSolid*>(obj)->color);
break;
}
case LottieProperty::Type::ColorStop: { case LottieProperty::Type::ColorStop: {
obj = new LottieGradient; obj = new LottieGradient;
context.parent = obj; context.parent = obj;
@ -1491,12 +1503,6 @@ bool LottieParser::apply(LottieSlot* slot)
} }
break; break;
} }
case LottieProperty::Type::Color: {
obj = new LottieSolid;
context.parent = obj;
parseSlotProperty<LottieProperty::Type::Color>(static_cast<LottieSolid*>(obj)->color);
break;
}
case LottieProperty::Type::TextDoc: { case LottieProperty::Type::TextDoc: {
obj = new LottieText; obj = new LottieText;
context.parent = obj; context.parent = obj;