1 /* === S Y N F I G ========================================================= */
3 ** \brief Layer class implementation
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.
22 /* ========================================================================= */
24 /* === H E A D E R S ======================================================= */
37 #include "layer_bitmap.h"
38 #include "layer_mime.h"
40 #include "paramdesc.h"
42 #include "layer_solidcolor.h"
43 #include "layer_polygon.h"
44 #include "layer_pastecanvas.h"
45 #include "layer_motionblur.h"
46 #include "layer_duplicate.h"
48 #include "valuenode_const.h"
50 #include "transform.h"
54 #include <sigc++/adaptors/bind.h>
57 /* === U S I N G =========================================================== */
61 using namespace synfig;
63 /* === G L O B A L S ======================================================= */
65 static Layer::Book* _layer_book;
73 synfig::error("%d layers not yet deleted!",counter);
77 int _LayerCounter::counter(0);
79 /* === P R O C E D U R E S ================================================= */
88 Layer::register_in_book(const BookEntry &entry)
90 book()[entry.name]=entry;
96 _layer_book=new Book();
98 #define INCLUDE_LAYER(class) \
99 synfig::Layer::book() [synfig::String(class::name__)] = \
100 BookEntry(class::create, \
102 dgettext("synfig", class::local_name__), \
107 #define LAYER_ALIAS(class,alias) \
108 synfig::Layer::book()[synfig::String(alias)] = \
109 BookEntry(class::create, \
112 CATEGORY_DO_NOT_USE, \
116 INCLUDE_LAYER(Layer_SolidColor); LAYER_ALIAS(Layer_SolidColor, "solid_color");
117 INCLUDE_LAYER(Layer_PasteCanvas); LAYER_ALIAS(Layer_PasteCanvas, "paste_canvas");
118 INCLUDE_LAYER(Layer_Polygon); LAYER_ALIAS(Layer_Polygon, "Polygon");
119 INCLUDE_LAYER(Layer_MotionBlur); LAYER_ALIAS(Layer_MotionBlur, "motion_blur");
120 INCLUDE_LAYER(Layer_Duplicate);
134 /* === M E T H O D S ======================================================= */
139 dirty_time_(Time::end())//,
140 //z_depth_static(false)
142 _LayerCounter::counter++;
143 Vocab vocab=get_param_vocab();
148 synfig::Layer::create(const String &name)
150 if(!book().count(name))
152 return Layer::LooseHandle(new Layer_Mime(name));
155 Layer* layer(book()[name].factory());
156 return Layer::LooseHandle(layer);
159 synfig::Layer::~Layer()
161 _LayerCounter::counter--;
162 while(!dynamic_param_list_.empty())
164 remove_child(dynamic_param_list_.begin()->second.get());
165 dynamic_param_list_.erase(dynamic_param_list_.begin());
168 remove_from_all_groups();
170 parent_death_connect_.disconnect();
175 synfig::Layer::set_canvas(etl::loose_handle<Canvas> x)
179 parent_death_connect_.disconnect();
183 parent_death_connect_=x->signal_deleted().connect(
189 etl::loose_handle<synfig::Canvas>(0)
198 synfig::Layer::on_canvas_set()
202 etl::loose_handle<synfig::Canvas>
203 synfig::Layer::get_canvas()const
209 Layer::get_depth()const
213 return get_canvas()->get_depth(const_cast<synfig::Layer*>(this));
217 Layer::set_active(bool x)
224 signal_status_changed_();
229 Layer::set_description(const String& x)
234 signal_description_changed_();
239 Layer::connect_dynamic_param(const String& param, etl::loose_handle<ValueNode> value_node)
241 ValueNode::Handle previous(dynamic_param_list_[param]);
243 if(previous==value_node)
246 dynamic_param_list_[param]=ValueNode::Handle(value_node);
249 remove_child(previous.get());
251 add_child(value_node.get());
253 if(!value_node->is_exported() && get_canvas())
255 value_node->set_parent_canvas(get_canvas());
263 Layer::disconnect_dynamic_param(const String& param)
265 ValueNode::Handle previous(dynamic_param_list_[param]);
269 dynamic_param_list_.erase(param);
271 // fix 2353284: if two parameters in the same layer are
272 // connected to the same valuenode and we disconnect one of
273 // them, the parent-child relationship for the remaining
274 // connection was being deleted. now we search the parameter
275 // list to see if another parameter uses the same valuenode
276 DynamicParamList::const_iterator iter;
277 for (iter = dynamic_param_list().begin(); iter != dynamic_param_list().end(); iter++)
278 if (iter->second == previous)
280 if (iter == dynamic_param_list().end())
281 remove_child(previous.get());
291 dirty_time_=Time::end();
296 Layer::set_param(const String ¶m, const ValueBase &value)
303 Layer::set_param_static(const String ¶m, const bool x)
305 Sparams::iterator iter=static_params.find(param);
306 if(iter!=static_params.end())
315 void Layer::fill_static(Vocab vocab)
317 Vocab::const_iterator viter;
318 for(viter=vocab.begin();viter!=vocab.end();viter++)
320 if(static_params.find(viter->get_name())==static_params.end())
321 static_params.insert(make_pair(viter->get_name(),false));
327 Layer::get_param_static(const String ¶m) const
330 Sparams::const_iterator iter=static_params.find(param);
331 if(iter!=static_params.end())
337 etl::handle<Transform>
338 Layer::get_transform()const
344 Layer::get_z_depth(const synfig::Time& t)const
346 if(!dynamic_param_list().count("z_depth"))
348 return (*dynamic_param_list().find("z_depth")->second)(t).get(Real());
352 Layer::simple_clone()const
354 if(!book().count(get_name())) return 0;
355 Handle ret = create(get_name()).get();
357 //ret->set_canvas(get_canvas());
358 ret->set_description(get_description());
359 ret->set_active(active());
360 ret->set_param_list(get_param_list());
361 for(DynamicParamList::const_iterator iter=dynamic_param_list().begin();iter!=dynamic_param_list().end();++iter)
362 ret->connect_dynamic_param(iter->first, iter->second);
367 Layer::clone(const GUID& deriv_guid) const
369 if(!book().count(get_name())) return 0;
371 //Layer *ret = book()[get_name()].factory();//create(get_name()).get();
372 Handle ret = create(get_name()).get();
375 //ret->set_canvas(get_canvas());
376 ret->set_description(get_description());
377 ret->set_active(active());
378 ret->set_guid(get_guid()^deriv_guid);
380 //ret->set_param_list(get_param_list());
381 // Process the parameter list so that
382 // we can duplicate any inline canvases
383 ParamList param_list(get_param_list());
384 for(ParamList::const_iterator iter(param_list.begin()); iter != param_list.end(); ++iter)
386 if(dynamic_param_list().count(iter->first)==0 && iter->second.get_type()==ValueBase::TYPE_CANVAS)
388 // This parameter is a canvas. We need a close look.
389 Canvas::Handle canvas(iter->second.get(Canvas::Handle()));
390 if(canvas && canvas->is_inline())
392 // This parameter is an inline canvas! we need to clone it
393 // before we set it as a parameter.
394 Canvas::Handle new_canvas(canvas->clone(deriv_guid));
395 ValueBase value(new_canvas);
396 ret->set_param(iter->first, value);
401 // This is a normal parameter,go ahead and set it.
402 ret->set_param(iter->first, iter->second);
405 // Duplicate the dynamic paramlist, but only the exported data nodes
406 DynamicParamList::const_iterator iter;
407 for(iter=dynamic_param_list().begin();iter!=dynamic_param_list().end();++iter)
409 // Make sure we clone inline canvases
410 if(iter->second->get_type()==ValueBase::TYPE_CANVAS)
412 Canvas::Handle canvas((*iter->second)(0).get(Canvas::Handle()));
413 if(canvas->is_inline())
415 Canvas::Handle new_canvas(canvas->clone(deriv_guid));
416 ValueBase value(new_canvas);
417 ret->connect_dynamic_param(iter->first,ValueNode_Const::create(value));
422 if(iter->second->is_exported())
423 ret->connect_dynamic_param(iter->first,iter->second);
425 ret->connect_dynamic_param(iter->first,iter->second->clone(deriv_guid));
428 //ret->set_canvas(0);
434 Layer::reads_context() const
440 Layer::get_full_bounding_rect(Context context)const
443 return context.get_full_bounding_rect()|get_bounding_rect();
444 return context.get_full_bounding_rect();
448 Layer::get_bounding_rect()const
450 return Rect::full_plane();
454 Layer::set_param_list(const ParamList &list)
459 ParamList::const_iterator iter(list.begin());
460 for(;iter!=list.end();++iter)
462 if(!set_param(iter->first, iter->second))ret=false;
468 Layer::get_param_list()const
472 Vocab vocab(get_param_vocab());
474 Vocab::const_iterator iter=vocab.begin();
475 for(;iter!=vocab.end();++iter)
477 ret[iter->get_name()]=get_param(iter->get_name());
483 Layer::get_param(const String & param)const
487 synfig::ValueBase ret(get_z_depth());
488 ret.set_static(get_param_static(param));
495 Layer::get_version()const
497 return get_param("version__").get(String());
501 Layer::set_version(const String &/*ver*/)
507 Layer::reset_version()
513 Layer::set_time(Context context, Time time)const
515 context.set_time(time);
520 Layer::set_time(Context context, Time time, const Point &pos)const
522 context.set_time(time,pos);
527 Layer::get_color(Context context, const Point &pos)const
529 return context.get_color(pos);
532 synfig::Layer::Handle
533 Layer::hit_check(synfig::Context context, const synfig::Point &pos)const
535 return context.hit_check(pos);
538 /* The default accelerated renderer
539 ** is anything but accelerated...
542 Layer::accelerated_render(Context context,Surface *surface,int /*quality*/, const RendDesc &renddesc, ProgressCallback *cb) const
544 handle<Target> target=surface_target(surface);
547 if(cb)cb->error(_("Unable to create surface target"));
550 RendDesc desc=renddesc;
551 target->set_rend_desc(&desc);
553 // When we render, we want to
554 // make sure that we are rendered too...
555 // Since the context iterator is for
556 // the layer after us, we need to back up.
557 // This could be considered a hack, as
558 // it is a possibility that we are indeed
559 // not the previous layer.
562 return render(context,target,desc,cb);
563 //return render_threaded(context,target,desc,cb,2);
567 Layer::get_name()const
569 return get_param("name__").get(String());
573 Layer::get_local_name()const
575 return get_param("local_name__").get(String());
580 Layer::get_param_vocab()const
584 ret.push_back(ParamDesc(z_depth,"z_depth")
585 .set_local_name(_("Z Depth"))
586 .set_animation_only(true)
593 Layer::get_times_vfunc(Node::time_set &set) const
595 DynamicParamList::const_iterator i = dynamic_param_list_.begin(),
596 end = dynamic_param_list_.end();
600 const Node::time_set &tset = i->second->get_times();
601 set.insert(tset.begin(),tset.end());
607 Layer::add_to_group(const String&x)
612 remove_from_all_groups();
614 signal_added_to_group()(group_);
618 Layer::remove_from_group(const String&x)
621 remove_from_all_groups();
625 Layer::remove_from_all_groups()
629 signal_removed_from_group()(group_);
634 Layer::get_group()const
640 Layer::get_param_local_name(const String ¶m_name)const
642 ParamVocab vocab = get_param_vocab();
643 // loop to find the parameter in the parameter vocab - this gives us its local name
644 for (ParamVocab::iterator iter = vocab.begin(); iter != vocab.end(); iter++)
645 if (iter->get_name() == param_name)
646 return iter->get_local_name();