mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-08 13:43:43 +00:00
lottie/slot: fix potential memory leak when overriding twice
Co-Authored-By: Hermet Park <hermet@lottiefiles.com>
This commit is contained in:
parent
c6960502eb
commit
dec4b141ec
2 changed files with 24 additions and 24 deletions
|
@ -63,17 +63,17 @@ void LottieSlot::assign(LottieObject* target, bool byDefault)
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case LottieProperty::Type::Position: {
|
case LottieProperty::Type::Position: {
|
||||||
if (copy) pair->prop = new LottiePosition(static_cast<LottieTransform*>(pair->obj)->position);
|
if (copy) pair->prop = new LottiePosition(static_cast<LottieTransform*>(pair->obj)->position);
|
||||||
pair->obj->override(&static_cast<LottieTransform*>(target)->position, shallow, byDefault);
|
pair->obj->override(&static_cast<LottieTransform*>(target)->position, shallow, !copy);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case LottieProperty::Type::Point: {
|
case LottieProperty::Type::Point: {
|
||||||
if (copy) pair->prop = new LottiePoint(static_cast<LottieTransform*>(pair->obj)->scale);
|
if (copy) pair->prop = new LottiePoint(static_cast<LottieTransform*>(pair->obj)->scale);
|
||||||
pair->obj->override(&static_cast<LottieTransform*>(target)->scale, shallow, byDefault);
|
pair->obj->override(&static_cast<LottieTransform*>(target)->scale, shallow, !copy);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case LottieProperty::Type::Float: {
|
case LottieProperty::Type::Float: {
|
||||||
if (copy) pair->prop = new LottieFloat(static_cast<LottieTransform*>(pair->obj)->rotation);
|
if (copy) pair->prop = new LottieFloat(static_cast<LottieTransform*>(pair->obj)->rotation);
|
||||||
pair->obj->override(&static_cast<LottieTransform*>(target)->rotation, shallow, byDefault);
|
pair->obj->override(&static_cast<LottieTransform*>(target)->rotation, shallow, !copy);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case LottieProperty::Type::Opacity: {
|
case LottieProperty::Type::Opacity: {
|
||||||
|
@ -81,27 +81,27 @@ void LottieSlot::assign(LottieObject* target, bool byDefault)
|
||||||
if (pair->obj->type == LottieObject::Type::Transform) pair->prop = new LottieOpacity(static_cast<LottieTransform*>(pair->obj)->opacity);
|
if (pair->obj->type == LottieObject::Type::Transform) pair->prop = new LottieOpacity(static_cast<LottieTransform*>(pair->obj)->opacity);
|
||||||
else pair->prop = new LottieOpacity(static_cast<LottieSolid*>(pair->obj)->opacity);
|
else pair->prop = new LottieOpacity(static_cast<LottieSolid*>(pair->obj)->opacity);
|
||||||
}
|
}
|
||||||
pair->obj->override(&static_cast<LottieSolid*>(target)->opacity, shallow, byDefault);
|
pair->obj->override(&static_cast<LottieSolid*>(target)->opacity, shallow, !copy);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case LottieProperty::Type::Color: {
|
case LottieProperty::Type::Color: {
|
||||||
if (copy) pair->prop = new LottieColor(static_cast<LottieSolid*>(pair->obj)->color);
|
if (copy) pair->prop = new LottieColor(static_cast<LottieSolid*>(pair->obj)->color);
|
||||||
pair->obj->override(&static_cast<LottieSolid*>(target)->color, shallow, byDefault);
|
pair->obj->override(&static_cast<LottieSolid*>(target)->color, shallow, !copy);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case LottieProperty::Type::ColorStop: {
|
case LottieProperty::Type::ColorStop: {
|
||||||
if (copy) pair->prop = new LottieColorStop(static_cast<LottieGradient*>(pair->obj)->colorStops);
|
if (copy) pair->prop = new LottieColorStop(static_cast<LottieGradient*>(pair->obj)->colorStops);
|
||||||
pair->obj->override(&static_cast<LottieGradient*>(target)->colorStops, shallow, byDefault);
|
pair->obj->override(&static_cast<LottieGradient*>(target)->colorStops, shallow, !copy);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case LottieProperty::Type::TextDoc: {
|
case LottieProperty::Type::TextDoc: {
|
||||||
if (copy) pair->prop = new LottieTextDoc(static_cast<LottieText*>(pair->obj)->doc);
|
if (copy) pair->prop = new LottieTextDoc(static_cast<LottieText*>(pair->obj)->doc);
|
||||||
pair->obj->override(&static_cast<LottieText*>(target)->doc, shallow, byDefault);
|
pair->obj->override(&static_cast<LottieText*>(target)->doc, shallow, !copy);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case LottieProperty::Type::Image: {
|
case LottieProperty::Type::Image: {
|
||||||
if (copy) pair->prop = new LottieBitmap(static_cast<LottieImage*>(pair->obj)->data);
|
if (copy) pair->prop = new LottieBitmap(static_cast<LottieImage*>(pair->obj)->data);
|
||||||
pair->obj->override(&static_cast<LottieImage*>(target)->data, shallow, byDefault);
|
pair->obj->override(&static_cast<LottieImage*>(target)->data, shallow, !copy);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: break;
|
default: break;
|
||||||
|
|
|
@ -213,7 +213,7 @@ struct LottieObject
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void override(LottieProperty* prop, bool shallow, bool byDefault)
|
virtual void override(LottieProperty* prop, bool shallow, bool release)
|
||||||
{
|
{
|
||||||
TVGERR("LOTTIE", "Unsupported slot type");
|
TVGERR("LOTTIE", "Unsupported slot type");
|
||||||
}
|
}
|
||||||
|
@ -562,26 +562,26 @@ struct LottieTransform : LottieObject
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void override(LottieProperty* prop, bool shallow, bool byDefault) override
|
void override(LottieProperty* prop, bool shallow, bool release) override
|
||||||
{
|
{
|
||||||
switch (prop->type) {
|
switch (prop->type) {
|
||||||
case LottieProperty::Type::Position: {
|
case LottieProperty::Type::Position: {
|
||||||
if (byDefault) position.release();
|
if (release) position.release();
|
||||||
position.copy(*static_cast<LottiePosition*>(prop), shallow);
|
position.copy(*static_cast<LottiePosition*>(prop), shallow);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case LottieProperty::Type::Float: {
|
case LottieProperty::Type::Float: {
|
||||||
if (byDefault) rotation.release();
|
if (release) rotation.release();
|
||||||
rotation.copy(*static_cast<LottieFloat*>(prop), shallow);
|
rotation.copy(*static_cast<LottieFloat*>(prop), shallow);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case LottieProperty::Type::Point: {
|
case LottieProperty::Type::Point: {
|
||||||
if (byDefault) scale.release();
|
if (release) scale.release();
|
||||||
scale.copy(*static_cast<LottiePoint*>(prop), shallow);
|
scale.copy(*static_cast<LottiePoint*>(prop), shallow);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case LottieProperty::Type::Opacity: {
|
case LottieProperty::Type::Opacity: {
|
||||||
if (byDefault) opacity.release();
|
if (release) opacity.release();
|
||||||
opacity.copy(*static_cast<LottieOpacity*>(prop), shallow);
|
opacity.copy(*static_cast<LottieOpacity*>(prop), shallow);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -633,9 +633,9 @@ struct LottieSolidStroke : LottieSolid, LottieStroke
|
||||||
return LottieSolid::property(ix);
|
return LottieSolid::property(ix);
|
||||||
}
|
}
|
||||||
|
|
||||||
void override(LottieProperty* prop, bool shallow, bool byDefault) override
|
void override(LottieProperty* prop, bool shallow, bool release) override
|
||||||
{
|
{
|
||||||
if (byDefault) color.release();
|
if (release) color.release();
|
||||||
color.copy(*static_cast<LottieColor*>(prop), shallow);
|
color.copy(*static_cast<LottieColor*>(prop), shallow);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -648,13 +648,13 @@ struct LottieSolidFill : LottieSolid
|
||||||
LottieObject::type = LottieObject::SolidFill;
|
LottieObject::type = LottieObject::SolidFill;
|
||||||
}
|
}
|
||||||
|
|
||||||
void override(LottieProperty* prop, bool shallow, bool byDefault) override
|
void override(LottieProperty* prop, bool shallow, bool release) override
|
||||||
{
|
{
|
||||||
if (prop->type == LottieProperty::Type::Opacity) {
|
if (prop->type == LottieProperty::Type::Opacity) {
|
||||||
if (byDefault) opacity.release();
|
if (release) opacity.release();
|
||||||
opacity.copy(*static_cast<LottieOpacity*>(prop), shallow);
|
opacity.copy(*static_cast<LottieOpacity*>(prop), shallow);
|
||||||
} else if (prop->type == LottieProperty::Type::Color) {
|
} else if (prop->type == LottieProperty::Type::Color) {
|
||||||
if (byDefault) color.release();
|
if (release) color.release();
|
||||||
color.copy(*static_cast<LottieColor*>(prop), shallow);
|
color.copy(*static_cast<LottieColor*>(prop), shallow);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -693,9 +693,9 @@ struct LottieGradient : LottieObject
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void override(LottieProperty* prop, bool shallow, bool byDefault = false) override
|
void override(LottieProperty* prop, bool shallow, bool release = false) override
|
||||||
{
|
{
|
||||||
if (byDefault) colorStops.release();
|
if (release) colorStops.release();
|
||||||
colorStops.copy(*static_cast<LottieColorStop*>(prop), shallow);
|
colorStops.copy(*static_cast<LottieColorStop*>(prop), shallow);
|
||||||
prepare();
|
prepare();
|
||||||
}
|
}
|
||||||
|
@ -747,9 +747,9 @@ struct LottieImage : LottieObject, LottieRenderPooler<tvg::Picture>
|
||||||
{
|
{
|
||||||
LottieBitmap data;
|
LottieBitmap data;
|
||||||
|
|
||||||
void override(LottieProperty* prop, bool shallow, bool byDefault = false) override
|
void override(LottieProperty* prop, bool shallow, bool release = false) override
|
||||||
{
|
{
|
||||||
if (byDefault) data.release();
|
if (release) data.release();
|
||||||
data.copy(*static_cast<LottieBitmap*>(prop), shallow);
|
data.copy(*static_cast<LottieBitmap*>(prop), shallow);
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue