1 /* === S Y N F I G ========================================================= */
2 /*! \file layer_duplicate.cpp
3 ** \brief Implementation of the "Duplicate" layer
8 ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
9 ** Copyright (c) 2007 Chris Moore
11 ** This package is free software; you can redistribute it and/or
12 ** modify it under the terms of the GNU General Public License as
13 ** published by the Free Software Foundation; either version 2 of
14 ** the License, or (at your option) any later version.
16 ** This package is distributed in the hope that it will be useful,
17 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
18 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 ** General Public License for more details.
22 /* ========================================================================= */
24 /* === H E A D E R S ======================================================= */
34 #include "layer_duplicate.h"
37 #include "paramdesc.h"
41 #include "valuenode.h"
46 /* === U S I N G =========================================================== */
48 using namespace synfig;
52 /* === G L O B A L S ======================================================= */
54 SYNFIG_LAYER_INIT(Layer_Duplicate);
55 SYNFIG_LAYER_SET_NAME(Layer_Duplicate,"duplicate");
56 SYNFIG_LAYER_SET_LOCAL_NAME(Layer_Duplicate,N_("Duplicate"));
57 SYNFIG_LAYER_SET_CATEGORY(Layer_Duplicate,N_("Other"));
58 SYNFIG_LAYER_SET_VERSION(Layer_Duplicate,"0.1");
59 SYNFIG_LAYER_SET_CVS_ID(Layer_Duplicate,"$Id$");
61 /* === M E M B E R S ======================================================= */
63 Layer_Duplicate::Layer_Duplicate():
64 Layer_Composite(1.0,Color::BLEND_COMPOSITE)
69 Layer_Duplicate::set_param(const String ¶m, const ValueBase &value)
72 return Layer_Composite::set_param(param,value);
76 Layer_Duplicate::get_param(const String ¶m)const
83 return Layer_Composite::get_param(param);
87 Layer_Duplicate::set_time(Context context, Time time)const
89 context.set_time(time);
94 Layer_Duplicate::set_time(Context context, Time time, const Point &pos)const
96 context.set_time(time,pos);
101 Layer_Duplicate::get_color(Context context, const Point &pos)const
103 return context.get_color(pos);
107 Layer_Duplicate::get_param_vocab()const
110 //ret=Layer_Composite::get_param_vocab();
112 ret.push_back(ParamDesc("index")
113 .set_local_name(_("Index"))
114 .set_description(_("Copy Index"))
121 Layer_Duplicate::accelerated_render(Context context,Surface *surface,int quality, const RendDesc &renddesc, ProgressCallback *cb)const
124 return context.accelerated_render(surface,quality,renddesc,cb);
128 surface->set_wh(renddesc.get_w(),renddesc.get_h());
133 SuperCallback subimagecb;
137 const DynamicParamList &dpl = dynamic_param_list();
138 DynamicParamList::const_iterator iter = dpl.find("index");
139 if (iter == dpl.end())
140 return context.accelerated_render(surface,quality,renddesc,cb);
142 etl::rhandle<ValueNode> param(iter->second);
143 handle<ValueNode_Duplicate> duplicate_param(handle<ValueNode_Duplicate>::cast_dynamic(param));
145 if (!duplicate_param)
146 return context.accelerated_render(surface,quality,renddesc,cb);
148 surface->set_wh(renddesc.get_w(),renddesc.get_h());
151 Color::BlendMethod blend_method(get_blend_method());
152 int steps = duplicate_param->count_steps(time_cur);
154 duplicate_param->reset_index(time_cur);
157 subimagecb=SuperCallback(cb,i*(5000/steps),(i+1)*(5000/steps),5000);
158 // \todo can we force a re-evaluation of all the variables without changing the time twice?
159 context.set_time(time_cur+1);
160 context.set_time(time_cur);
161 if(!context.accelerated_render(&tmp,quality,renddesc,&subimagecb)) return false;
163 Surface::alpha_pen apen(surface->begin());
165 // \todo have a checkbox allowing use of 'behind' to reverse the order?
166 apen.set_blend_method(blend_method);
169 } while (duplicate_param->step(time_cur));
171 duplicate_param->reset_index(time_cur);