1 /* === S Y N F I G ========================================================= */
3 ** \brief Template Header
8 ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
10 ** This package is free software; you can redistribute it and/or
11 ** modify it under the terms of the GNU General Public License as
12 ** published by the Free Software Foundation; either version 2 of
13 ** the License, or (at your option) any later version.
15 ** This package is distributed in the hope that it will be useful,
16 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 ** General Public License for more details.
21 /* ========================================================================= */
23 /* === H E A D E R S ======================================================= */
34 #include <ETL/stringf>
47 using namespace synfig;
51 /* === M A C R O S ========================================================= */
53 /* === G L O B A L S ======================================================= */
55 /* === P R O C E D U R E S ================================================= */
57 /* === M E T H O D S ======================================================= */
59 ValueBase::ValueBase():type(TYPE_NIL),data(0),ref_count(0),loop_(0)
63 ValueBase::ValueBase(Type x):
70 case TYPE_BOOL: data=static_cast<void*>(new bool()); break;
71 case TYPE_INTEGER: data=static_cast<void*>(new int()); break;
72 case TYPE_ANGLE: data=static_cast<void*>(new Angle()); break;
73 case TYPE_VECTOR: data=static_cast<void*>(new Vector()); break;
74 case TYPE_TIME: data=static_cast<void*>(new Time()); break;
75 case TYPE_REAL: data=static_cast<void*>(new Real()); break;
76 case TYPE_COLOR: data=static_cast<void*>(new Color()); break;
77 case TYPE_SEGMENT: data=static_cast<void*>(new Segment()); break;
78 case TYPE_BLINEPOINT: data=static_cast<void*>(new BLinePoint()); break;
79 case TYPE_LIST: data=static_cast<void*>(new list_type()); break;
80 case TYPE_STRING: data=static_cast<void*>(new String()); break;
81 case TYPE_GRADIENT: data=static_cast<void*>(new Gradient()); break;
82 case TYPE_CANVAS: data=static_cast<void*>(new etl::handle<Canvas>()); break;
87 ValueBase::~ValueBase()
93 ValueBase::get(const char*)const
95 return get(String()).c_str();
99 ValueBase::set(Canvas* x)
102 if(x && x->is_inline())
104 _set(etl::handle<Canvas>(x));
108 _set(etl::loose_handle<Canvas>(x));
114 ValueBase::set(etl::loose_handle<Canvas> x)
117 if(x && x->is_inline())
118 _set(etl::handle<Canvas>(x));
120 _set(etl::loose_handle<Canvas>(x));
125 ValueBase::set(etl::handle<Canvas> x)
128 if(x && x->is_inline())
129 _set(etl::handle<Canvas>(x));
131 _set(etl::loose_handle<Canvas>(x));
136 ValueBase::set(const list_type &x)
142 ValueBase::set(const char* x)
148 ValueBase::is_valid()const
150 return type>TYPE_NIL && type<TYPE_END && ref_count;
154 ValueBase::empty()const
156 return !is_valid() || ((type==TYPE_LIST)?get_list().empty():false);
160 ValueBase::get_contained_type()const
162 if(type!=TYPE_LIST || empty())
164 return get_list().front().get_type();
168 ValueBase::operator=(const ValueBase& x)
175 ref_count=x.ref_count;
184 if(ref_count.unique() && data)
188 case TYPE_BOOL: delete static_cast<bool*>(data); break;
189 case TYPE_INTEGER: delete static_cast<int*>(data); break;
190 case TYPE_ANGLE: delete static_cast<Angle*>(data); break;
191 case TYPE_VECTOR: delete static_cast<Vector*>(data); break;
192 case TYPE_TIME: delete static_cast<Time*>(data); break;
193 case TYPE_REAL: delete static_cast<Real*>(data); break;
194 case TYPE_COLOR: delete static_cast<Color*>(data); break;
195 case TYPE_SEGMENT: delete static_cast<Segment*>(data); break;
196 case TYPE_BLINEPOINT: delete static_cast<BLinePoint*>(data); break;
197 case TYPE_LIST: delete static_cast<list_type*>(data); break;
198 case TYPE_STRING: delete static_cast<String*>(data); break;
199 case TYPE_GRADIENT: delete static_cast<Gradient*>(data); break;
202 etl::handle<Canvas> canvas(get(etl::loose_handle<Canvas>()));
203 if(canvas && canvas->is_inline())
204 delete static_cast<etl::handle<Canvas>*>(data);
206 delete static_cast<etl::loose_handle<Canvas>*>(data);
221 ValueBase::type_name(Type id)
223 // don't internationalize these type names - they're using in .sif files
226 case TYPE_REAL: return "real";
227 case TYPE_TIME: return "time";
228 case TYPE_INTEGER: return "integer";
229 case TYPE_BOOL: return "bool";
230 case TYPE_ANGLE: return "angle";
231 case TYPE_VECTOR: return "vector";
232 case TYPE_COLOR: return "color";
233 case TYPE_STRING: return "string";
234 case TYPE_CANVAS: return "canvas";
235 case TYPE_LIST: return "list";
236 case TYPE_SEGMENT: return "segment";
237 case TYPE_GRADIENT: return "gradient";
238 case TYPE_BLINEPOINT: return "bline_point";
239 case TYPE_NIL: return "nil";
243 synfig::warning("Encountered unknown ValueBase with an Type of %d",id);
249 ValueBase::ident_type(const String &str)
252 str=="null") return TYPE_NIL;
253 else if(str=="time" ||
254 str==_("time")) return TYPE_TIME;
255 else if(str=="real" ||
257 str==_("real")) return TYPE_REAL;
258 else if(str=="integer" ||
260 str==_("integer")) return TYPE_INTEGER;
261 else if(str=="bool" ||
262 str==_("bool")) return TYPE_BOOL;
263 else if(str=="angle" ||
266 str=="rotations") return TYPE_ANGLE;
267 else if(str=="vector" ||
268 str=="point") return TYPE_VECTOR;
269 else if(str=="color") return TYPE_COLOR;
270 else if(str=="string") return TYPE_STRING;
271 else if(str=="canvas") return TYPE_CANVAS;
272 else if(str=="list") return TYPE_LIST;
273 else if(str=="segment") return TYPE_SEGMENT;
274 else if(str=="gradient") return TYPE_GRADIENT;
275 else if(str=="bline_point" ||
276 str=="blinepoint") return TYPE_BLINEPOINT;
282 ValueBase::operator==(const ValueBase& rhs)const
284 if(get_type()!=rhs.get_type())
291 case TYPE_TIME: return get(Time()).is_equal(rhs.get(Time()));
292 case TYPE_REAL: return abs(get(Real())-rhs.get(Real()))<=0.00000000000001;
293 case TYPE_INTEGER: return get(int())==rhs.get(int());
294 case TYPE_BOOL: return get(bool())==rhs.get(bool());
295 case TYPE_ANGLE: return get(Angle())==rhs.get(Angle());
296 case TYPE_VECTOR: return get(Vector()).is_equal_to(rhs.get(Vector()));
297 case TYPE_COLOR: return get(Color())==rhs.get(Color());
298 case TYPE_STRING: return get(String())==rhs.get(String());
299 case TYPE_CANVAS: return get(Canvas::LooseHandle())==rhs.get(Canvas::LooseHandle());
300 case TYPE_LIST: return get_list()==rhs.get_list();
301 case TYPE_SEGMENT: // return get(Segment())==rhs.get(Segment());
302 case TYPE_GRADIENT: // return get(Gradient())==rhs.get(Gradient());
303 case TYPE_BLINEPOINT: // return get(BLinePoint())==rhs.get(BLinePoint());
305 default: return false;