|
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 |
}
|