Blame synfig-core/src/synfig/layers/layer_duplicate.cpp

Carlos Lopez a09598
/* === S Y N F I G ========================================================= */
Carlos Lopez a09598
/*!	\file layer_duplicate.cpp
Carlos Lopez a09598
**	\brief Implementation of the "Duplicate" layer
Carlos Lopez a09598
**
Carlos Lopez a09598
**	$Id$
Carlos Lopez a09598
**
Carlos Lopez a09598
**	\legal
Carlos Lopez a09598
**	Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
Carlos Lopez a09598
**	Copyright (c) 2007, 2008 Chris Moore
Carlos Lopez a09598
**
Carlos Lopez a09598
**	This package is free software; you can redistribute it and/or
Carlos Lopez a09598
**	modify it under the terms of the GNU General Public License as
Carlos Lopez a09598
**	published by the Free Software Foundation; either version 2 of
Carlos Lopez a09598
**	the License, or (at your option) any later version.
Carlos Lopez a09598
**
Carlos Lopez a09598
**	This package is distributed in the hope that it will be useful,
Carlos Lopez a09598
**	but WITHOUT ANY WARRANTY; without even the implied warranty of
Carlos Lopez a09598
**	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Carlos Lopez a09598
**	General Public License for more details.
Carlos Lopez a09598
**	\endlegal
Carlos Lopez a09598
*/
Carlos Lopez a09598
/* ========================================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
/* === H E A D E R S ======================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
#ifdef USING_PCH
Carlos Lopez a09598
#	include "pch.h"
Carlos Lopez a09598
#else
Carlos Lopez a09598
#ifdef HAVE_CONFIG_H
Carlos Lopez a09598
#	include <config.h></config.h>
Carlos Lopez a09598
#endif
Carlos Lopez a09598
Carlos Lopez a09598
#include "layer_duplicate.h"
bw 94d8a6
bw 94d8a6
#include <synfig general.h=""></synfig>
bw 94d8a6
#include <synfig localization.h=""></synfig>
bw 94d8a6
bw 94d8a6
#include <synfig canvas.h=""></synfig>
Diego Barrios Romero dcc14d
#include <synfig context.h=""></synfig>
Diego Barrios Romero dcc14d
#include <synfig paramdesc.h=""></synfig>
Diego Barrios Romero dcc14d
#include <synfig renddesc.h=""></synfig>
bw 94d8a6
#include <synfig string.h=""></synfig>
Diego Barrios Romero dcc14d
#include <synfig surface.h=""></synfig>
bw 94d8a6
#include <synfig time.h=""></synfig>
Diego Barrios Romero dcc14d
#include <synfig value.h=""></synfig>
Diego Barrios Romero dcc14d
#include <synfig valuenode.h=""></synfig>
Carlos Lopez a09598
26a291
#include <synfig common="" rendering="" task="" taskblend.h=""></synfig>
26a291
Carlos Lopez a09598
#endif
Carlos Lopez a09598
Carlos Lopez a09598
/* === U S I N G =========================================================== */
Carlos Lopez a09598
Carlos Lopez a09598
using namespace synfig;
Carlos Lopez a09598
using namespace etl;
Carlos Lopez a09598
using namespace std;
Carlos Lopez a09598
Carlos Lopez a09598
/* === G L O B A L S ======================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
SYNFIG_LAYER_INIT(Layer_Duplicate);
Carlos Lopez a09598
SYNFIG_LAYER_SET_NAME(Layer_Duplicate,"duplicate");
Carlos Lopez a09598
SYNFIG_LAYER_SET_LOCAL_NAME(Layer_Duplicate,N_("Duplicate"));
Carlos Lopez a09598
SYNFIG_LAYER_SET_CATEGORY(Layer_Duplicate,N_("Other"));
Carlos Lopez a09598
SYNFIG_LAYER_SET_VERSION(Layer_Duplicate,"0.1");
Carlos Lopez a09598
SYNFIG_LAYER_SET_CVS_ID(Layer_Duplicate,"$Id$");
Carlos Lopez a09598
Carlos Lopez a09598
/* === M E M B E R S ======================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
Layer_Duplicate::Layer_Duplicate():
e222d9
	Layer_CompositeFork(1.0,Color::BLEND_COMPOSITE)
Carlos Lopez a09598
{
Carlos Lopez a09598
	LinkableValueNode* index_value_node = ValueNode_Duplicate::create(Real(3));
Carlos Lopez a09598
	connect_dynamic_param("index", index_value_node);
Carlos Lopez 920f9a
Carlos Lopez b3fcc2
	SET_INTERPOLATION_DEFAULTS();
Carlos Lopez b3fcc2
	SET_STATIC_DEFAULTS();
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
Layer::Handle
Nikita Kitaev dc5e35
Layer_Duplicate::clone(Canvas::LooseHandle canvas, const GUID& deriv_guid)const
Carlos Lopez a09598
{
Nikita Kitaev dc5e35
	Layer::Handle ret = (Layer::Handle)Layer_Composite::clone(canvas, deriv_guid);
Carlos Lopez a09598
Carlos Lopez a09598
	const DynamicParamList &dpl = dynamic_param_list();
Carlos Lopez a09598
	DynamicParamList::const_iterator iter = dpl.find("index");
Carlos Lopez a09598
Carlos Lopez a09598
	// if we have a dynamic "index" parameter, make a new one in the clone
Carlos Lopez a09598
	// it's not good to have two references to the same index valuenode,
Carlos Lopez a09598
	// or nested duplications cause an infinite loop
Carlos Lopez a09598
	if (iter != dpl.end())
Nikita Kitaev dc5e35
		ret->connect_dynamic_param(iter->first,iter->second->clone(canvas, deriv_guid));
Carlos Lopez a09598
Carlos Lopez a09598
	return ret;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
bool
Carlos Lopez a09598
Layer_Duplicate::set_param(const String ¶m, const ValueBase &value)
Carlos Lopez a09598
{
Carlos Lopez 920f9a
	IMPORT_VALUE(param_index);
Carlos Lopez a09598
	return Layer_Composite::set_param(param,value);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
ValueBase
Carlos Lopez a09598
Layer_Duplicate::get_param(const String ¶m)const
Carlos Lopez a09598
{
Carlos Lopez 920f9a
 	EXPORT_VALUE(param_index);
Carlos Lopez a09598
Carlos Lopez a09598
	EXPORT_NAME();
Carlos Lopez a09598
	EXPORT_VERSION();
Carlos Lopez a09598
Carlos Lopez a09598
	return Layer_Composite::get_param(param);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
Color
Carlos Lopez a09598
Layer_Duplicate::get_color(Context context, const Point &pos)const
Carlos Lopez a09598
{
Carlos Lopez a09598
	handle<valuenode_duplicate> duplicate_param = get_duplicate_param();</valuenode_duplicate>
Carlos Lopez a09598
	if (!duplicate_param) return context.get_color(pos);
Carlos Lopez a09598
Carlos Lopez a09598
	Color::BlendMethod blend_method(get_blend_method());
Carlos Lopez a09598
	float amount(get_amount());
Carlos Lopez a09598
	Color color;
Carlos Lopez a09598
Rodolfo Ribeiro Gomes cfe072
	std::lock_guard<std::mutex> lock(mutex);</std::mutex>
dd97a8
	Time time_cur = get_time_mark();
Carlos Lopez a09598
	duplicate_param->reset_index(time_cur);
Carlos Lopez a09598
	do
Carlos Lopez a09598
	{
Carlos Lopez a09598
		context.set_time(time_cur+1);
Carlos Lopez a09598
		context.set_time(time_cur);
Carlos Lopez a09598
		color = Color::blend(context.get_color(pos),color,amount,blend_method);
Carlos Lopez a09598
	} while (duplicate_param->step(time_cur));
Carlos Lopez a09598
Carlos Lopez a09598
	return color;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
Layer::Vocab
Carlos Lopez a09598
Layer_Duplicate::get_param_vocab()const
Carlos Lopez a09598
{
Carlos Lopez a09598
	Layer::Vocab ret;
Carlos Lopez a09598
	ret=Layer_Composite::get_param_vocab();
Carlos Lopez a09598
Carlos Lopez a09598
	ret.push_back(ParamDesc("index")
Carlos Lopez a09598
		.set_local_name(_("Index"))
Carlos Lopez a09598
		.set_description(_("Copy Index"))
Carlos Lopez a09598
	);
Carlos Lopez a09598
Carlos Lopez a09598
	return ret;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
ValueNode_Duplicate::Handle
Carlos Lopez a09598
Layer_Duplicate::get_duplicate_param()const
Carlos Lopez a09598
{
Carlos Lopez a09598
	const DynamicParamList &dpl = dynamic_param_list();
Carlos Lopez a09598
	DynamicParamList::const_iterator iter = dpl.find("index");
Carlos Lopez a09598
	if (iter == dpl.end()) return NULL;
Carlos Lopez a09598
	etl::rhandle<valuenode> param(iter->second);</valuenode>
Carlos Lopez a09598
	return ValueNode_Duplicate::Handle::cast_dynamic(param);
Carlos Lopez a09598
}
Carlos Lopez a09598
e222d9
rendering::Task::Handle
e222d9
Layer_Duplicate::build_rendering_task_vfunc(Context context) const
26a291
{
26a291
	handle<valuenode_duplicate> duplicate_param = get_duplicate_param();</valuenode_duplicate>
26a291
	if (!duplicate_param)
26a291
		return context.build_rendering_task();
26a291
26a291
	Time time_cur = get_time_mark();
26a291
26a291
	ColorReal amount = get_amount() * Context::z_depth_visibility(context.get_params(), *this);
26a291
	Color::BlendMethod blend_method = get_blend_method();
26a291
ce743b
	rendering::Task::Handle task;
26a291
Rodolfo Ribeiro Gomes cfe072
	std::lock_guard<std::mutex> lock(mutex);</std::mutex>
26a291
	duplicate_param->reset_index(time_cur);
26a291
	do
26a291
	{
26a291
		context.set_time(time_cur, true);
26a291
26a291
		rendering::TaskBlend::Handle task_blend(new rendering::TaskBlend());
26a291
		task_blend->amount = amount;
26a291
		task_blend->blend_method = blend_method;
26a291
		task_blend->sub_task_a() = task;
26a291
		task_blend->sub_task_b() = context.build_rendering_task();
26a291
		task = task_blend;
26a291
	}
26a291
	while (duplicate_param->step(time_cur));
26a291
26a291
	return task;
26a291
}