Blame synfig-core/src/synfig/timepointcollect.cpp

Carlos Lopez a09598
/* === S Y N F I G ========================================================= */
Carlos Lopez a09598
/*!	\file timepointcollect.cpp
Carlos Lopez a09598
**	\brief Template File
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 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 "timepointcollect.h"
Diego Barrios Romero dcc14d
#include <synfig valuenode_animated.h="" valuenodes=""></synfig>
Diego Barrios Romero dcc14d
#include <synfig layer_pastecanvas.h="" layers=""></synfig>
Carlos Lopez a09598
#include "layer.h"
Carlos Lopez a09598
#include "canvas.h"
Carlos Lopez a09598
#include "value.h"
Carlos Lopez a09598
Carlos Lopez a09598
#endif
Carlos Lopez a09598
Carlos Lopez a09598
/* === U S I N G =========================================================== */
Carlos Lopez a09598
Carlos Lopez a09598
using namespace std;
Carlos Lopez a09598
using namespace etl;
Carlos Lopez a09598
using namespace synfig;
Carlos Lopez a09598
Carlos Lopez a09598
/* === M A C R O S ========================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
/* === G L O B A L S ======================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
/* === P R O C E D U R E S ================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
/* === M E T H O D S ======================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
//! \writeme
Carlos Lopez a09598
int
Carlos Lopez a09598
synfig::waypoint_collect(set<waypoint, std::less<uniqueid=""> >	&waypoint_set,</waypoint,>
Carlos Lopez a09598
						 const Time								&time,
Carlos Lopez a09598
						 const etl::handle<node>				&node)</node>
Carlos Lopez a09598
{
Carlos Lopez a09598
	const TimePointSet& timepoint_set(node->get_times());
Carlos Lopez a09598
Carlos Lopez a09598
	// Check to see if there is anything in here at the given time
Carlos Lopez a09598
	if(timepoint_set.find(time)==timepoint_set.end())
Carlos Lopez a09598
		return 0;
Carlos Lopez a09598
Carlos Lopez a09598
	// Check if we are a linkable value node
Carlos Lopez a09598
	LinkableValueNode::Handle linkable_value_node;
Carlos Lopez a09598
	linkable_value_node=linkable_value_node.cast_dynamic(node);
Carlos Lopez a09598
	if(linkable_value_node)
Carlos Lopez a09598
	{
Carlos Lopez a09598
		const int link_count(linkable_value_node->link_count());
Carlos Lopez a09598
		int i,ret(0);
Carlos Lopez a09598
		for(i=0;i
Carlos Lopez a09598
			ret+=waypoint_collect(waypoint_set,time,linkable_value_node->get_link(i).get());
Carlos Lopez a09598
Carlos Lopez a09598
		return ret;
Carlos Lopez a09598
	}
Carlos Lopez a09598
Carlos Lopez a09598
	// Check if we are a layer
Carlos Lopez a09598
	Layer::Handle layer;
Carlos Lopez a09598
	layer=layer.cast_dynamic(node);
Carlos Lopez a09598
	if(layer)
Carlos Lopez a09598
	{
Carlos Lopez a09598
		const Layer::DynamicParamList& dyn_param_list(layer->dynamic_param_list());
Carlos Lopez a09598
		Layer::DynamicParamList::const_iterator iter;
Carlos Lopez a09598
		int ret(0);
Carlos Lopez a09598
		for(iter=dyn_param_list.begin();iter!=dyn_param_list.end();++iter)
Carlos Lopez a09598
			ret+=waypoint_collect(waypoint_set,time,iter->second);
Carlos Lopez a09598
Carlos Lopez a09598
		ValueBase canvas_value(layer->get_param("canvas"));
d89783
		if(canvas_value.get_type()==type_canvas)
Carlos Lopez a09598
		{
Carlos Lopez a09598
			etl::handle<layer_pastecanvas> p = etl::handle<layer_pastecanvas>::cast_dynamic(layer);</layer_pastecanvas></layer_pastecanvas>
Carlos Lopez a09598
			if (p)
Carlos Lopez a09598
				ret+=waypoint_collect(waypoint_set, time + p->get_time_offset(),
Carlos Lopez a09598
									  Canvas::Handle(canvas_value.get(Canvas::Handle())));
Carlos Lopez a09598
			else
Carlos Lopez a09598
				ret+=waypoint_collect(waypoint_set, time,
Carlos Lopez a09598
									  Canvas::Handle(canvas_value.get(Canvas::Handle())));
Carlos Lopez a09598
		}
Carlos Lopez a09598
		return ret;
Carlos Lopez a09598
	}
Carlos Lopez a09598
Carlos Lopez a09598
	// Check if we are a canvas
Carlos Lopez a09598
	Canvas::Handle canvas;
Carlos Lopez a09598
	canvas=canvas.cast_dynamic(node);
Carlos Lopez a09598
	if(canvas)
Carlos Lopez a09598
	{
Carlos Lopez a09598
		Canvas::const_iterator iter;
Carlos Lopez a09598
		int ret(0);
Carlos Lopez a09598
		for(iter=canvas->begin();iter!=canvas->end();++iter)
Carlos Lopez a09598
			ret+=waypoint_collect(waypoint_set,time,*iter);
Carlos Lopez a09598
		return ret;
Carlos Lopez a09598
	}
Carlos Lopez a09598
Carlos Lopez a09598
	// Check if we are an animated value node
Carlos Lopez a09598
	ValueNode_Animated::Handle value_node_animated;
Carlos Lopez a09598
	value_node_animated=value_node_animated.cast_dynamic(node);
Carlos Lopez a09598
	if(value_node_animated)
Carlos Lopez a09598
	{
Carlos Lopez a09598
		try{
Carlos Lopez a09598
			Waypoint waypoint=*value_node_animated->find(time);
Carlos Lopez a09598
Carlos Lopez a09598
			// If it is already in the waypoint set, then
Carlos Lopez a09598
			// don't bother adding it again
Carlos Lopez a09598
			if(waypoint_set.find(waypoint)!=waypoint_set.end())
Carlos Lopez a09598
				return 0;
Carlos Lopez a09598
Carlos Lopez a09598
			waypoint_set.insert(waypoint);
Carlos Lopez a09598
			return 1;
Carlos Lopez a09598
		}catch(...)
Carlos Lopez a09598
		{
Carlos Lopez a09598
			return 0;
Carlos Lopez a09598
		}
Carlos Lopez a09598
	}
Carlos Lopez a09598
Carlos Lopez a09598
	return 0;
Carlos Lopez a09598
}
Carlos Lopez a09598
Rodolfo Ribeiro Gomes ad5dbf
bool
Rodolfo Ribeiro Gomes ad5dbf
synfig::waypoint_search(Waypoint& waypoint, const UniqueID &uid, const etl::handle<node> &node)</node>
Rodolfo Ribeiro Gomes ad5dbf
{
Rodolfo Ribeiro Gomes ad5dbf
	// Check if we are a linkable value node
Rodolfo Ribeiro Gomes ad5dbf
	LinkableValueNode::Handle linkable_value_node;
Rodolfo Ribeiro Gomes ad5dbf
	linkable_value_node=linkable_value_node.cast_dynamic(node);
Rodolfo Ribeiro Gomes ad5dbf
	if(linkable_value_node)
Rodolfo Ribeiro Gomes ad5dbf
	{
Rodolfo Ribeiro Gomes ad5dbf
		const int link_count(linkable_value_node->link_count());
Rodolfo Ribeiro Gomes ad5dbf
		for(int i=0; i < link_count; i++) {
Rodolfo Ribeiro Gomes ad5dbf
			bool ret = waypoint_search(waypoint, uid, linkable_value_node->get_link(i).get());
Rodolfo Ribeiro Gomes ad5dbf
			if (ret)
Rodolfo Ribeiro Gomes ad5dbf
				return true;
Rodolfo Ribeiro Gomes ad5dbf
		}
Rodolfo Ribeiro Gomes ad5dbf
		return false;
Rodolfo Ribeiro Gomes ad5dbf
	}
Rodolfo Ribeiro Gomes ad5dbf
Rodolfo Ribeiro Gomes ad5dbf
	// Check if we are a layer
Rodolfo Ribeiro Gomes ad5dbf
	Layer::Handle layer;
Rodolfo Ribeiro Gomes ad5dbf
	layer=layer.cast_dynamic(node);
Rodolfo Ribeiro Gomes ad5dbf
	if(layer)
Rodolfo Ribeiro Gomes ad5dbf
	{
Rodolfo Ribeiro Gomes ad5dbf
		const Layer::DynamicParamList& dyn_param_list(layer->dynamic_param_list());
Rodolfo Ribeiro Gomes ad5dbf
Rodolfo Ribeiro Gomes ad5dbf
		for(Layer::DynamicParamList::const_iterator iter=dyn_param_list.begin(); iter!=dyn_param_list.end(); ++iter) {
Rodolfo Ribeiro Gomes ad5dbf
			bool ret = waypoint_search(waypoint, uid, iter->second);
Rodolfo Ribeiro Gomes ad5dbf
			if (ret)
Rodolfo Ribeiro Gomes ad5dbf
				return true;
Rodolfo Ribeiro Gomes ad5dbf
		}
Rodolfo Ribeiro Gomes ad5dbf
Rodolfo Ribeiro Gomes ad5dbf
		ValueBase canvas_value(layer->get_param("canvas"));
Rodolfo Ribeiro Gomes ad5dbf
		if(canvas_value.get_type()==type_canvas)
Rodolfo Ribeiro Gomes ad5dbf
		{
Rodolfo Ribeiro Gomes ad5dbf
			bool ret = waypoint_search(waypoint, uid,
Rodolfo Ribeiro Gomes ad5dbf
									  Canvas::Handle(canvas_value.get(Canvas::Handle())));
Rodolfo Ribeiro Gomes ad5dbf
			if (ret)
Rodolfo Ribeiro Gomes ad5dbf
				return true;
Rodolfo Ribeiro Gomes ad5dbf
		}
Rodolfo Ribeiro Gomes ad5dbf
		return false;
Rodolfo Ribeiro Gomes ad5dbf
	}
Rodolfo Ribeiro Gomes ad5dbf
Rodolfo Ribeiro Gomes ad5dbf
	// Check if we are a canvas
Rodolfo Ribeiro Gomes ad5dbf
	Canvas::Handle canvas;
Rodolfo Ribeiro Gomes ad5dbf
	canvas=canvas.cast_dynamic(node);
Rodolfo Ribeiro Gomes ad5dbf
	if(canvas)
Rodolfo Ribeiro Gomes ad5dbf
	{
Rodolfo Ribeiro Gomes ad5dbf
		for(Canvas::const_iterator iter = canvas->begin(); iter!=canvas->end(); ++iter) {
Rodolfo Ribeiro Gomes ad5dbf
			bool ret = waypoint_search(waypoint, uid, *iter);
Rodolfo Ribeiro Gomes ad5dbf
			if (ret)
Rodolfo Ribeiro Gomes ad5dbf
				return true;
Rodolfo Ribeiro Gomes ad5dbf
		}
Rodolfo Ribeiro Gomes ad5dbf
		return false;
Rodolfo Ribeiro Gomes ad5dbf
	}
Rodolfo Ribeiro Gomes ad5dbf
Rodolfo Ribeiro Gomes ad5dbf
	// Check if we are an animated value node
Rodolfo Ribeiro Gomes ad5dbf
	ValueNode_Animated::Handle value_node_animated;
Rodolfo Ribeiro Gomes ad5dbf
	value_node_animated=value_node_animated.cast_dynamic(node);
Rodolfo Ribeiro Gomes ad5dbf
	if(value_node_animated)
Rodolfo Ribeiro Gomes ad5dbf
	{
Rodolfo Ribeiro Gomes ad5dbf
		ValueNode_AnimatedInterfaceConst::const_findresult result = value_node_animated->find_uid(uid);
Rodolfo Ribeiro Gomes ad5dbf
		if (!result.second)
Rodolfo Ribeiro Gomes ad5dbf
			return false;
Rodolfo Ribeiro Gomes ad5dbf
Rodolfo Ribeiro Gomes ad5dbf
		waypoint = *result.first;
Rodolfo Ribeiro Gomes ad5dbf
		return true;
Rodolfo Ribeiro Gomes ad5dbf
	}
Rodolfo Ribeiro Gomes ad5dbf
Rodolfo Ribeiro Gomes ad5dbf
	return false;
Rodolfo Ribeiro Gomes ad5dbf
}
Rodolfo Ribeiro Gomes ad5dbf
Carlos Lopez a09598
//! \writeme
Carlos Lopez a09598
int
Carlos Lopez a09598
synfig::activepoint_collect(set<activepoint, std::less<uniqueid=""> >& /*activepoint_set*/,const Time& time, const etl::handle<node>& node)</node></activepoint,>
Carlos Lopez a09598
{
Carlos Lopez a09598
	const TimePointSet& timepoint_set(node->get_times());
Carlos Lopez a09598
Carlos Lopez a09598
	// Check to see if there is anything in here at the given time
Carlos Lopez a09598
	if(timepoint_set.find(time)==timepoint_set.end())
Carlos Lopez a09598
		return 0;
Carlos Lopez a09598
Carlos Lopez a09598
	return 0;
Carlos Lopez a09598
}