**
** \legal
** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
-** Copyright (c) 2007 Chris Moore
+** Copyright (c) 2007, 2008 Chris Moore
**
** This package is free software; you can redistribute it and/or
** modify it under the terms of the GNU General Public License as
Layer_Duplicate::Layer_Duplicate():
Layer_Composite(1.0,Color::BLEND_COMPOSITE)
{
+ LinkableValueNode* index_value_node = ValueNode_Duplicate::create(Real(3));
+ connect_dynamic_param("index", index_value_node);
+}
+
+Layer::Handle
+Layer_Duplicate::clone(const GUID& deriv_guid)const
+{
+ Layer::Handle ret = (Layer::Handle)Layer_Composite::clone(deriv_guid);
+
+ const DynamicParamList &dpl = dynamic_param_list();
+ DynamicParamList::const_iterator iter = dpl.find("index");
+
+ // if we have a dynamic "index" parameter, make a new one in the clone
+ // it's not good to have two references to the same index valuenode,
+ // or nested duplications cause an infinite loop
+ if (iter != dpl.end())
+ ret->connect_dynamic_param(iter->first,iter->second->clone(deriv_guid));
+
+ return ret;
}
bool
Layer_Duplicate::get_param_vocab()const
{
Layer::Vocab ret;
- //ret=Layer_Composite::get_param_vocab();
+ ret=Layer_Composite::get_param_vocab();
ret.push_back(ParamDesc("index")
.set_local_name(_("Index"))
return ret;
}
+ValueNode_Duplicate::Handle
+Layer_Duplicate::get_duplicate_param()const
+{
+ const DynamicParamList &dpl = dynamic_param_list();
+ DynamicParamList::const_iterator iter = dpl.find("index");
+ if (iter == dpl.end()) return NULL;
+ etl::rhandle<ValueNode> param(iter->second);
+ return ValueNode_Duplicate::Handle::cast_dynamic(param);
+}
+
bool
Layer_Duplicate::accelerated_render(Context context,Surface *surface,int quality, const RendDesc &renddesc, ProgressCallback *cb)const
{
Surface tmp;
int i = 0;
- const DynamicParamList &dpl = dynamic_param_list();
- DynamicParamList::const_iterator iter = dpl.find("index");
- if (iter == dpl.end())
- return context.accelerated_render(surface,quality,renddesc,cb);
-
- etl::rhandle<ValueNode> param(iter->second);
- handle<ValueNode_Duplicate> duplicate_param(handle<ValueNode_Duplicate>::cast_dynamic(param));
-
- if (!duplicate_param)
- return context.accelerated_render(surface,quality,renddesc,cb);
+ handle<ValueNode_Duplicate> duplicate_param = get_duplicate_param();
+ if (!duplicate_param) return context.accelerated_render(surface,quality,renddesc,cb);
surface->set_wh(renddesc.get_w(),renddesc.get_h());
surface->clear();
Color::BlendMethod blend_method(get_blend_method());
int steps = duplicate_param->count_steps(time_cur);
+ Mutex::Lock lock(mutex);
duplicate_param->reset_index(time_cur);
do
{
if(!context.accelerated_render(&tmp,quality,renddesc,&subimagecb)) return false;
Surface::alpha_pen apen(surface->begin());
- apen.set_alpha(1.0);
+ apen.set_alpha(get_amount());
// \todo have a checkbox allowing use of 'behind' to reverse the order?
- apen.set_blend_method(blend_method);
+ apen.set_blend_method(i ? blend_method : Color::BLEND_COMPOSITE);
tmp.blit_to(apen);
i++;
} while (duplicate_param->step(time_cur));
- duplicate_param->reset_index(time_cur);
-
return true;
}