renderer: support duplicate effects

Implement effect duplication functionality for all RenderEffect types to enable proper Scene duplication with effects.

issue: https://github.com/thorvg/thorvg/issues/3631
This commit is contained in:
Jinny You 2025-07-23 17:14:28 +09:00
parent 9369642642
commit e0404b1832
2 changed files with 34 additions and 1 deletions

View file

@ -419,6 +419,7 @@ struct RenderEffect
bool valid = false;
virtual ~RenderEffect() {}
virtual RenderEffect* duplicate() const = 0;
};
struct RenderEffectGaussianBlur : RenderEffect
@ -438,6 +439,11 @@ struct RenderEffectGaussianBlur : RenderEffect
inst->type = SceneEffect::GaussianBlur;
return inst;
}
RenderEffectGaussianBlur* duplicate() const override
{
return new RenderEffectGaussianBlur(*this);
}
};
struct RenderEffectDropShadow : RenderEffect
@ -462,6 +468,11 @@ struct RenderEffectDropShadow : RenderEffect
inst->type = SceneEffect::DropShadow;
return inst;
}
RenderEffectDropShadow* duplicate() const override
{
return new RenderEffectDropShadow(*this);
}
};
struct RenderEffectFill : RenderEffect
@ -478,6 +489,11 @@ struct RenderEffectFill : RenderEffect
inst->type = SceneEffect::Fill;
return inst;
}
RenderEffectFill* duplicate() const override
{
return new RenderEffectFill(*this);
}
};
struct RenderEffectTint : RenderEffect
@ -499,6 +515,11 @@ struct RenderEffectTint : RenderEffect
inst->type = SceneEffect::Tint;
return inst;
}
RenderEffectTint* duplicate() const override
{
return new RenderEffectTint(*this);
}
};
struct RenderEffectTritone : RenderEffect
@ -524,6 +545,11 @@ struct RenderEffectTritone : RenderEffect
inst->type = SceneEffect::Tritone;
return inst;
}
RenderEffectTritone* duplicate() const override
{
return new RenderEffectTritone(*this);
}
};
class RenderMethod

View file

@ -272,7 +272,14 @@ struct SceneImpl : Scene
dup->paints.push_back(cdup);
}
if (effects) TVGERR("RENDERER", "TODO: Duplicate Effects?");
if (effects) {
dup->effects = new Array<RenderEffect*>;
ARRAY_FOREACH(effect, *effects) {
auto dupEffect = (*effect)->duplicate();
dup->effects->push(dupEffect);
}
}
return scene;
}