Remove debugging code.
[synfig.git] / synfig-core / trunk / src / synfig / layer_duplicate.cpp
blobf9c77fac6776367a2c5ccf460dba482928af4344
1 /* === S Y N F I G ========================================================= */
2 /*! \file layer_duplicate.cpp
3 ** \brief Implementation of the "Duplicate" layer
4 **
5 ** $Id$
6 **
7 ** \legal
8 ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
9 ** Copyright (c) 2007, 2008 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.
20 ** \endlegal
22 /* ========================================================================= */
24 /* === H E A D E R S ======================================================= */
26 #ifdef USING_PCH
27 # include "pch.h"
28 #else
29 #ifdef HAVE_CONFIG_H
30 # include <config.h>
31 #endif
33 #include "string.h"
34 #include "layer_duplicate.h"
35 #include "time.h"
36 #include "context.h"
37 #include "paramdesc.h"
38 #include "renddesc.h"
39 #include "surface.h"
40 #include "value.h"
41 #include "valuenode.h"
42 #include "canvas.h"
44 #endif
46 /* === U S I N G =========================================================== */
48 using namespace synfig;
49 using namespace etl;
50 using namespace std;
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)
66 LinkableValueNode* index_value_node = ValueNode_Duplicate::create(Real(3));
67 connect_dynamic_param("index", index_value_node);
70 Layer::Handle
71 Layer_Duplicate::clone(const GUID& deriv_guid)const
73 Layer::Handle ret = (Layer::Handle)Layer_Composite::clone(deriv_guid);
75 const DynamicParamList &dpl = dynamic_param_list();
76 DynamicParamList::const_iterator iter = dpl.find("index");
78 // if we have a dynamic "index" parameter, make a new one in the clone
79 // it's not good to have two references to the same index valuenode,
80 // or nested duplications cause an infinite loop
81 if (iter != dpl.end())
82 ret->connect_dynamic_param(iter->first,iter->second->clone(deriv_guid));
84 return ret;
87 bool
88 Layer_Duplicate::set_param(const String &param, const ValueBase &value)
90 IMPORT(index);
91 return Layer_Composite::set_param(param,value);
94 ValueBase
95 Layer_Duplicate::get_param(const String &param)const
97 EXPORT(index);
99 EXPORT_NAME();
100 EXPORT_VERSION();
102 return Layer_Composite::get_param(param);
105 void
106 Layer_Duplicate::set_time(Context context, Time time)const
108 context.set_time(time);
109 time_cur=time;
112 void
113 Layer_Duplicate::set_time(Context context, Time time, const Point &pos)const
115 context.set_time(time,pos);
116 time_cur=time;
119 Color
120 Layer_Duplicate::get_color(Context context, const Point &pos)const
122 return context.get_color(pos);
125 Layer::Vocab
126 Layer_Duplicate::get_param_vocab()const
128 Layer::Vocab ret;
129 ret=Layer_Composite::get_param_vocab();
131 ret.push_back(ParamDesc("index")
132 .set_local_name(_("Index"))
133 .set_description(_("Copy Index"))
136 return ret;
139 ValueNode_Duplicate::Handle
140 Layer_Duplicate::get_duplicate_param()const
142 const DynamicParamList &dpl = dynamic_param_list();
143 DynamicParamList::const_iterator iter = dpl.find("index");
144 if (iter == dpl.end()) return NULL;
145 etl::rhandle<ValueNode> param(iter->second);
146 return ValueNode_Duplicate::Handle::cast_dynamic(param);
149 bool
150 Layer_Duplicate::accelerated_render(Context context,Surface *surface,int quality, const RendDesc &renddesc, ProgressCallback *cb)const
152 if(quality == 10)
153 return context.accelerated_render(surface,quality,renddesc,cb);
155 if(context->empty())
157 surface->set_wh(renddesc.get_w(),renddesc.get_h());
158 surface->clear();
159 return true;
162 SuperCallback subimagecb;
163 Surface tmp;
164 int i = 0;
166 handle<ValueNode_Duplicate> duplicate_param = get_duplicate_param();
167 if (!duplicate_param) return context.accelerated_render(surface,quality,renddesc,cb);
169 surface->set_wh(renddesc.get_w(),renddesc.get_h());
170 surface->clear();
172 Color::BlendMethod blend_method(get_blend_method());
173 int steps = duplicate_param->count_steps(time_cur);
175 Mutex::Lock lock(mutex);
176 duplicate_param->reset_index(time_cur);
179 subimagecb=SuperCallback(cb,i*(5000/steps),(i+1)*(5000/steps),5000);
180 // \todo can we force a re-evaluation of all the variables without changing the time twice?
181 context.set_time(time_cur+1);
182 context.set_time(time_cur);
183 if(!context.accelerated_render(&tmp,quality,renddesc,&subimagecb)) return false;
185 Surface::alpha_pen apen(surface->begin());
186 apen.set_alpha(get_amount());
187 // \todo have a checkbox allowing use of 'behind' to reverse the order?
188 apen.set_blend_method(i ? blend_method : Color::BLEND_COMPOSITE);
189 tmp.blit_to(apen);
190 i++;
191 } while (duplicate_param->step(time_cur));
193 return true;