From e0404b1832b4bdccfbd82ff4448fada3f7e52209 Mon Sep 17 00:00:00 2001 From: Jinny You Date: Wed, 23 Jul 2025 17:14:28 +0900 Subject: [PATCH] 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 --- src/renderer/tvgRender.h | 26 ++++++++++++++++++++++++++ src/renderer/tvgScene.h | 9 ++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/renderer/tvgRender.h b/src/renderer/tvgRender.h index 5651bbbb..807a3fe1 100644 --- a/src/renderer/tvgRender.h +++ b/src/renderer/tvgRender.h @@ -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 diff --git a/src/renderer/tvgScene.h b/src/renderer/tvgScene.h index 8368ce2e..ca01d14e 100644 --- a/src/renderer/tvgScene.h +++ b/src/renderer/tvgScene.h @@ -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; + + ARRAY_FOREACH(effect, *effects) { + auto dupEffect = (*effect)->duplicate(); + dup->effects->push(dupEffect); + } + } return scene; }