renderer: support duplicate effects

implement effect duplication functionality
to enable proper Scene duplication with effects.

issue: https://github.com/thorvg/thorvg/issues/3631

Co-Authored-By: Hermet Park <hermet@lottiefiles.com>
This commit is contained in:
Jinny You 2025-07-23 17:14:28 +09:00 committed by Hermet Park
parent 9369642642
commit bdccfb2449
2 changed files with 36 additions and 3 deletions

View file

@ -103,9 +103,9 @@ struct UserExample : tvgexam::Example
//Duplicate Picture - svg //Duplicate Picture - svg
{ {
auto picture1 = tvg::Picture::gen(); auto picture1 = tvg::Picture::gen();
if (!tvgexam::verify(picture1->load(EXAMPLE_DIR"/svg/tiger.svg"))) return false; if (!tvgexam::verify(picture1->load(EXAMPLE_DIR"/svg/2684.svg"))) return false;
picture1->translate(350, 200); picture1->translate(350, 200);
picture1->scale(0.25); picture1->scale(4);
auto picture2 = picture1->duplicate(); auto picture2 = picture1->duplicate();
picture2->translate(550, 250); picture2->translate(550, 250);

View file

@ -272,7 +272,40 @@ struct SceneImpl : Scene
dup->paints.push_back(cdup); dup->paints.push_back(cdup);
} }
if (effects) TVGERR("RENDERER", "TODO: Duplicate Effects?"); if (effects) {
dup->effects = new Array<RenderEffect*>;
ARRAY_FOREACH(p, *effects) {
RenderEffect* ret = nullptr;
switch ((*p)->type) {
case SceneEffect::GaussianBlur: {
ret = new RenderEffectGaussianBlur(*(RenderEffectGaussianBlur*)(*p));
break;
}
case SceneEffect::DropShadow: {
ret = new RenderEffectDropShadow(*(RenderEffectDropShadow*)(*p));
break;
}
case SceneEffect::Fill: {
ret = new RenderEffectFill(*(RenderEffectFill*)(*p));
break;
}
case SceneEffect::Tint: {
ret = new RenderEffectTint(*(RenderEffectTint*)(*p));
break;
}
case SceneEffect::Tritone: {
ret = new RenderEffectTritone(*(RenderEffectTritone*)(*p));
break;
}
default: break;
}
if (ret) {
ret->rd = nullptr;
ret->valid = false;
dup->effects->push(ret);
}
}
}
return scene; return scene;
} }