Blame synfig-core/src/synfig/rendering/primitive/bend.h

96d6ce
/* === S Y N F I G ========================================================= */
96d6ce
/*!	\file synfig/rendering/primitive/bend.h
96d6ce
**	\brief Bend Header
96d6ce
**
96d6ce
**	$Id$
96d6ce
**
96d6ce
**	\legal
96d6ce
**	......... ... 2019 Ivan Mahonin
96d6ce
**
96d6ce
**	This package is free software; you can redistribute it and/or
96d6ce
**	modify it under the terms of the GNU General Public License as
96d6ce
**	published by the Free Software Foundation; either version 2 of
96d6ce
**	the License, or (at your option) any later version.
96d6ce
**
96d6ce
**	This package is distributed in the hope that it will be useful,
96d6ce
**	but WITHOUT ANY WARRANTY; without even the implied warranty of
96d6ce
**	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
96d6ce
**	General Public License for more details.
96d6ce
**	\endlegal
96d6ce
*/
96d6ce
/* ========================================================================= */
96d6ce
96d6ce
/* === S T A R T =========================================================== */
96d6ce
96d6ce
#ifndef __SYNFIG_RENDERING_BEND_H
96d6ce
#define __SYNFIG_RENDERING_BEND_H
96d6ce
96d6ce
/* === H E A D E R S ======================================================= */
96d6ce
96d6ce
#include <vector></vector>
96d6ce
96d6ce
#include <etl handle=""></etl>
96d6ce
96d6ce
#include <synfig vector.h=""></synfig>
96d6ce
#include <synfig matrix.h=""></synfig>
96d6ce
96d6ce
#include "contour.h"
96d6ce
96d6ce
/* === M A C R O S ========================================================= */
96d6ce
96d6ce
/* === T Y P E D E F S ===================================================== */
96d6ce
96d6ce
/* === C L A S S E S & S T R U C T S ======================================= */
96d6ce
96d6ce
namespace synfig
96d6ce
{
96d6ce
namespace rendering
96d6ce
{
96d6ce
96d6ce
class Bend: public etl::shared_object
96d6ce
{
96d6ce
public:
96d6ce
	typedef etl::handle<bend> Handle;</bend>
96d6ce
96d6ce
	enum Mode
96d6ce
	{
96d6ce
		NONE   = 0,
573f83
		FLAT   = 1,
573f83
		ROUND  = 2,
573f83
		CORNER = 3
96d6ce
	};
96d6ce
	
96d6ce
	typedef unsigned int Hints;
96d6ce
96d6ce
	class Point {
96d6ce
	public:
96d6ce
		Vector p;
96d6ce
		Vector t0, t1;
8eff58
		Vector tn0, tn1;
96d6ce
		Mode mode;
96d6ce
		bool e0, e1;
96d6ce
		Real l;
96d6ce
		Real length;
6b4114
		Point(): mode(NONE), e0(), e1(), l(), length() { }
96d6ce
	};
96d6ce
96d6ce
	typedef std::vector<point> PointList;</point>
96d6ce
96d6ce
	PointList points;
96d6ce
96d6ce
	void add(const Vector &p, const Vector &t0, const Vector &t1, Mode mode, bool calc_length, int segments);
96d6ce
	void loop(bool calc_length, int segments);
96d6ce
	void tails();
96d6ce
	
96d6ce
	Real l0() const
96d6ce
		{ return points.empty() ? Real() : points.front().l; }
96d6ce
	Real l1() const
96d6ce
		{ return points.empty() ? Real() : points.back().l; }
96d6ce
96d6ce
	Real length0() const
96d6ce
		{ return points.empty() ? Real() : points.front().length; }
96d6ce
	Real length1() const
96d6ce
		{ return points.empty() ? Real() : points.back().length; }
96d6ce
	
573f83
	PointList::const_iterator find_by_l(Real l) const;
573f83
	PointList::const_iterator find(Real length) const;
573f83
	Real length_by_l(Real length) const;
573f83
	Point interpolate(Real length) const;
96d6ce
	
573f83
	void bend(Contour &dst, const Contour &src, const Matrix &matrix, int segments) const;
96d6ce
};
96d6ce
96d6ce
} /* end namespace rendering */
96d6ce
} /* end namespace synfig */
96d6ce
96d6ce
/* -- E N D ----------------------------------------------------------------- */
96d6ce
96d6ce
#endif
96d6ce