1 /* === S Y N F I G ========================================================= */
3 ** \brief Template Header
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 ======================================================= */
35 #include <ETL/stringf>
48 using namespace synfig;
52 /* === M A C R O S ========================================================= */
54 /* === G L O B A L S ======================================================= */
56 /* === P R O C E D U R E S ================================================= */
58 /* === M E T H O D S ======================================================= */
60 ValueBase::ValueBase():type(TYPE_NIL),data(0),ref_count(0),loop_(0),static_(0)
64 ValueBase::ValueBase(Type x):
72 case TYPE_BOOL: data=static_cast<void*>(new bool()); break;
73 case TYPE_INTEGER: data=static_cast<void*>(new int()); break;
74 case TYPE_ANGLE: data=static_cast<void*>(new Angle()); break;
75 case TYPE_VECTOR: data=static_cast<void*>(new Vector()); break;
76 case TYPE_TIME: data=static_cast<void*>(new Time()); break;
77 case TYPE_REAL: data=static_cast<void*>(new Real()); break;
78 case TYPE_COLOR: data=static_cast<void*>(new Color()); break;
79 case TYPE_SEGMENT: data=static_cast<void*>(new Segment()); break;
80 case TYPE_BLINEPOINT: data=static_cast<void*>(new BLinePoint()); break;
81 case TYPE_LIST: data=static_cast<void*>(new list_type()); break;
82 case TYPE_STRING: data=static_cast<void*>(new String()); break;
83 case TYPE_GRADIENT: data=static_cast<void*>(new Gradient()); break;
84 case TYPE_CANVAS: data=static_cast<void*>(new etl::handle<Canvas>()); break;
89 ValueBase::~ValueBase()
95 ValueBase::get(const char*)const
97 return get(String()).c_str();
102 ValueBase::get_string() const
106 case TYPE_NIL: return "Nil";
107 case TYPE_BOOL: return strprintf("Bool (%s)", get(bool()) ? "true" : "false");
108 case TYPE_INTEGER: return strprintf("Integer (%s)", get(int()));
109 case TYPE_ANGLE: return strprintf("Angle (%.2f)", Angle::deg(get(Angle())).get());
111 // All types after this point are larger than 32 bits
113 case TYPE_TIME: return strprintf("Time (%s)", get(Time()).get_string().c_str());
114 case TYPE_REAL: return strprintf("Real (%f)", get(Real()));
116 // All types after this point are larger than 64 bits
118 case TYPE_VECTOR: return strprintf("Vector (%f, %f)", get(Vector())[0], get(Vector())[1]);
119 case TYPE_COLOR: return strprintf("Color (%s)", get(Color()).get_string().c_str());
120 case TYPE_SEGMENT: return strprintf("Segment ((%f, %f) to (%f, %f))", get(Segment()).p1[0], get(Segment()).p1[1], get(Segment()).p2[0], get(Segment()).p2[1]);
121 case TYPE_BLINEPOINT: return strprintf("BLinePoint (%s)", get(BLinePoint()).get_vertex()[0], get(BLinePoint()).get_vertex()[1]);
123 // All types after this point require construction/destruction
125 case TYPE_LIST: return strprintf("List (%d elements)", get(list_type()).size());
126 case TYPE_CANVAS: return strprintf("Canvas (%s)", get(etl::loose_handle<Canvas>())->get_id().c_str());
127 case TYPE_STRING: return strprintf("String (%s)", get(String()).c_str());
128 case TYPE_GRADIENT: return strprintf("Gradient (%d cpoints)", get(Gradient()).size());
129 default: return "Invalid type";
135 ValueBase::set(Canvas* x)
138 if(x && x->is_inline())
140 _set(etl::handle<Canvas>(x));
144 _set(etl::loose_handle<Canvas>(x));
150 ValueBase::set(etl::loose_handle<Canvas> x)
153 if(x && x->is_inline())
154 _set(etl::handle<Canvas>(x));
156 _set(etl::loose_handle<Canvas>(x));
161 ValueBase::set(etl::handle<Canvas> x)
164 if(x && x->is_inline())
165 _set(etl::handle<Canvas>(x));
167 _set(etl::loose_handle<Canvas>(x));
172 ValueBase::set(const list_type &x)
178 ValueBase::set(const char* x)
184 ValueBase::set(char* x)
190 ValueBase::is_valid()const
192 return type>TYPE_NIL && type<TYPE_END && ref_count;
196 ValueBase::empty()const
198 return !is_valid() || ((type==TYPE_LIST)?get_list().empty():false);
202 ValueBase::get_contained_type()const
204 if(type!=TYPE_LIST || empty())
206 return get_list().front().get_type();
210 ValueBase::operator=(const ValueBase& x)
217 ref_count=x.ref_count;
227 if(ref_count.unique() && data)
231 case TYPE_BOOL: delete static_cast<bool*>(data); break;
232 case TYPE_INTEGER: delete static_cast<int*>(data); break;
233 case TYPE_ANGLE: delete static_cast<Angle*>(data); break;
234 case TYPE_TIME: delete static_cast<Time*>(data); break;
235 case TYPE_REAL: delete static_cast<Real*>(data); break;
236 case TYPE_VECTOR: delete static_cast<Vector*>(data); break;
237 case TYPE_COLOR: delete static_cast<Color*>(data); break;
238 case TYPE_SEGMENT: delete static_cast<Segment*>(data); break;
239 case TYPE_BLINEPOINT: delete static_cast<BLinePoint*>(data); break;
240 case TYPE_LIST: delete static_cast<list_type*>(data); break;
243 etl::handle<Canvas> canvas(get(etl::loose_handle<Canvas>()));
244 if(canvas && canvas->is_inline())
245 delete static_cast<etl::handle<Canvas>*>(data);
247 delete static_cast<etl::loose_handle<Canvas>*>(data);
250 case TYPE_STRING: delete static_cast<String*>(data); break;
251 case TYPE_GRADIENT: delete static_cast<Gradient*>(data); break;
264 ValueBase::type_name(Type id)
266 // don't internationalize these type names - they're using in .sif files
269 /* TRANSLATORS: this is the name of a type -- see http://synfig.org/wiki/Dev:Types */
270 case TYPE_BOOL: return N_("bool");
271 /* TRANSLATORS: this is the name of a type -- see http://synfig.org/wiki/Dev:Types */
272 case TYPE_INTEGER: return N_("integer");
273 /* TRANSLATORS: this is the name of a type -- see http://synfig.org/wiki/Dev:Types */
274 case TYPE_ANGLE: return N_("angle");
275 /* TRANSLATORS: this is the name of a type -- see http://synfig.org/wiki/Dev:Types */
276 case TYPE_TIME: return N_("time");
277 /* TRANSLATORS: this is the name of a type -- see http://synfig.org/wiki/Dev:Types */
278 case TYPE_REAL: return N_("real");
279 /* TRANSLATORS: this is the name of a type -- see http://synfig.org/wiki/Dev:Types */
280 case TYPE_VECTOR: return N_("vector");
281 /* TRANSLATORS: this is the name of a type -- see http://synfig.org/wiki/Dev:Types */
282 case TYPE_COLOR: return N_("color");
283 /* TRANSLATORS: this is the name of a type -- see http://synfig.org/wiki/Dev:Types */
284 case TYPE_SEGMENT: return N_("segment");
285 /* TRANSLATORS: this is the name of a type -- see http://synfig.org/wiki/Dev:Types */
286 case TYPE_BLINEPOINT: return N_("bline_point");
287 /* TRANSLATORS: this is the name of a type -- see http://synfig.org/wiki/Dev:Types */
288 case TYPE_LIST: return N_("list");
289 /* TRANSLATORS: this is the name of a type -- see http://synfig.org/wiki/Dev:Types */
290 case TYPE_CANVAS: return N_("canvas");
291 /* TRANSLATORS: this is the name of a type -- see http://synfig.org/wiki/Dev:Types */
292 case TYPE_STRING: return N_("string");
293 /* TRANSLATORS: this is the name of a type -- see http://synfig.org/wiki/Dev:Types */
294 case TYPE_GRADIENT: return N_("gradient");
295 /* TRANSLATORS: this is the name of a type -- see http://synfig.org/wiki/Dev:Types */
296 case TYPE_NIL: return N_("nil");
300 synfig::warning("Encountered unknown ValueBase with an Type of %d",id);
306 ValueBase::type_local_name(Type id)
308 return dgettext("synfig",type_name(id).c_str());
312 ValueBase::ident_type(const String &str)
315 str=="null") return TYPE_NIL;
316 else if(str=="time" ||
317 str==_("time")) return TYPE_TIME;
318 else if(str=="real" ||
320 str==_("real")) return TYPE_REAL;
321 else if(str=="integer" ||
323 str==_("integer")) return TYPE_INTEGER;
324 else if(str=="bool" ||
325 str==_("bool")) return TYPE_BOOL;
326 else if(str=="angle" ||
329 str=="rotations") return TYPE_ANGLE;
330 else if(str=="vector" ||
331 str=="point") return TYPE_VECTOR;
332 else if(str=="color") return TYPE_COLOR;
333 else if(str=="string") return TYPE_STRING;
334 else if(str=="canvas") return TYPE_CANVAS;
335 else if(str=="list") return TYPE_LIST;
336 else if(str=="segment") return TYPE_SEGMENT;
337 else if(str=="gradient") return TYPE_GRADIENT;
338 else if(str=="bline_point" ||
339 str=="blinepoint") return TYPE_BLINEPOINT;
345 ValueBase::operator==(const ValueBase& rhs)const
347 if(get_type()!=rhs.get_type())
354 case TYPE_TIME: return get(Time()).is_equal(rhs.get(Time()));
355 case TYPE_REAL: return abs(get(Real())-rhs.get(Real()))<=0.00000000000001;
356 case TYPE_INTEGER: return get(int())==rhs.get(int());
357 case TYPE_BOOL: return get(bool())==rhs.get(bool());
358 case TYPE_ANGLE: return get(Angle())==rhs.get(Angle());
359 case TYPE_VECTOR: return get(Vector()).is_equal_to(rhs.get(Vector()));
360 case TYPE_COLOR: return get(Color())==rhs.get(Color());
361 case TYPE_STRING: return get(String())==rhs.get(String());
362 case TYPE_CANVAS: return get(Canvas::LooseHandle())==rhs.get(Canvas::LooseHandle());
363 case TYPE_LIST: return get_list()==rhs.get_list();
364 case TYPE_SEGMENT: // return get(Segment())==rhs.get(Segment());
365 case TYPE_GRADIENT: // return get(Gradient())==rhs.get(Gradient());
366 case TYPE_BLINEPOINT: // return get(BLinePoint())==rhs.get(BLinePoint());
368 default: return false;