1 /* === S Y N F I G ========================================================= */
3 ** \brief Template File
8 ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
9 ** Copyright (c) 2007, 2008 Chris Moore
11 ** This package is free software; you can redistribute it and/or
12 ** modify it under the terms of the GNU General Public License as
13 ** published by the Free Software Foundation; either version 2 of
14 ** the License, or (at your option) any later version.
16 ** This package is distributed in the hope that it will be useful,
17 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
18 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 ** General Public License for more details.
22 /* ========================================================================= */
24 /* === H E A D E R S ======================================================= */
40 /* === U S I N G =========================================================== */
44 using namespace synfig;
45 using namespace studio;
47 /* === M A C R O S ========================================================= */
49 /* === G L O B A L S ======================================================= */
51 int studio::Duck::duck_count(0);
59 synfig::error("%d ducks not yet deleted!",counter);
63 int _DuckCounter::counter(0);
66 /* === P R O C E D U R E S ================================================= */
68 /* === M E T H O D S ======================================================= */
71 rotations(synfig::Angle::deg(0)),
78 { duck_count++; _DuckCounter::counter++; }
80 Duck::Duck(const synfig::Point &point):
83 rotations(synfig::Angle::deg(0)),
91 { duck_count++; _DuckCounter::counter++;}
93 Duck::Duck(const synfig::Point &point,const synfig::Point &origin):
95 rotations(synfig::Angle::deg(0)),
103 { duck_count++; _DuckCounter::counter++;}
105 Duck::~Duck() { duck_count--; _DuckCounter::counter--;}
108 Duck::get_data_guid()const
110 if(value_desc_.is_value_node())
111 return value_desc_.get_value_node()->get_guid();
112 return GUID::hasher(get_name());
116 Duck::set_name(const synfig::String &x)
119 if(guid_==GUID::zero())
121 guid_=GUID::hasher(name);
127 Duck::operator==(const Duck &rhs)const
133 scalar==rhs.scalar &&
135 transform_stack_.size()==rhs.transform_stack_.size();
137 //(origin_duck?*origin_duck==*rhs.origin_duck:origin==rhs.origin) &&
138 //(shared_point?*shared_point==*rhs.shared_point:point==rhs.point) ;
142 Duck::get_trans_point()const
144 return transform_stack_.perform(get_sub_trans_point());
148 Duck::set_trans_point(const synfig::Point &x)
150 set_sub_trans_point(transform_stack_.unperform(x));
153 //! Sets the origin point.
155 Duck::set_origin(const synfig::Point &x)
157 origin=x; origin_duck=0;
160 //! Sets the origin point as another duck
162 Duck::set_origin(const etl::handle<Duck> &x)
167 //! Retrieves the origin location
169 Duck::get_origin()const
171 return origin_duck?origin_duck->get_point():origin;
174 //! Retrieves the origin duck
175 const etl::handle<Duck> &
176 Duck::get_origin_duck() const
181 //! Retrieves the origin location
183 Duck::get_trans_origin()const
185 return transform_stack_.perform(get_sub_trans_origin());
189 Duck::get_sub_trans_point()const
191 return get_point()*get_scalar()+get_sub_trans_origin();
195 Duck::set_sub_trans_point(const synfig::Point &x)
197 if (get_type() == Duck::TYPE_TANGENT ||
198 get_type() == Duck::TYPE_ANGLE)
200 Angle old_angle = get_point().angle();
201 set_point((x-get_sub_trans_origin())/get_scalar());
202 Angle change = get_point().angle() - old_angle;
203 while (change < Angle::deg(-180)) change += Angle::deg(360);
204 while (change > Angle::deg(180)) change -= Angle::deg(360);
205 int old_quarters = round_to_int(Angle::deg(rotations).get()/90);
207 int new_quarters = round_to_int(Angle::deg(rotations).get()/90);
208 if (old_quarters != new_quarters)
209 synfig::info("rotation: %.2f turns", new_quarters/4.0);
212 set_point((x-get_sub_trans_origin())/get_scalar());
216 Duck::get_sub_trans_origin()const
218 return origin_duck?origin_duck->get_sub_trans_point():origin;