X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftags%2Fstable%2Fsrc%2Fsynfig%2Fvalue.cpp;fp=synfig-core%2Ftags%2Fstable%2Fsrc%2Fsynfig%2Fvalue.cpp;h=900361859c5147abebaccf32bf0c6b600479cae5;hb=40dd10f62f1b0983b20cf99dd4780ea73236eb0c;hp=0000000000000000000000000000000000000000;hpb=bed0eacb9fa07f038f4c4ad4a5334c81d662bead;p=synfig.git diff --git a/synfig-core/tags/stable/src/synfig/value.cpp b/synfig-core/tags/stable/src/synfig/value.cpp new file mode 100644 index 0000000..9003618 --- /dev/null +++ b/synfig-core/tags/stable/src/synfig/value.cpp @@ -0,0 +1,407 @@ +/* === S Y N F I G ========================================================= */ +/*! \file value.cpp +** \brief Template Header +** +** $Id$ +** +** \legal +** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** +** This package is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 2 of +** the License, or (at your option) any later version. +** +** This package is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** \endlegal +*/ +/* ========================================================================= */ + +/* === H E A D E R S ======================================================= */ + +#ifdef USING_PCH +# include "pch.h" +#else +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "value.h" +#include "general.h" +#include +#include "canvas.h" +#include "gradient.h" + + + +#include "vector.h" +#include "time.h" +#include "segment.h" +#include "color.h" + +#endif + +using namespace synfig; +using namespace std; +using namespace etl; + +/* === M A C R O S ========================================================= */ + +/* === G L O B A L S ======================================================= */ + +/* === P R O C E D U R E S ================================================= */ + +/* === M E T H O D S ======================================================= */ + +ValueBase::ValueBase():type(TYPE_NIL),data(0),ref_count(0),loop_(0) +{ +} + +ValueBase::ValueBase(Type x): + type(x), + data(0), + loop_(0) +{ + + switch(type) + { + case TYPE_BOOL: + data=static_cast(new bool()); + break; + case TYPE_INTEGER: + data=static_cast(new int()); + break; + case TYPE_ANGLE: + data=static_cast(new Angle()); + break; + case TYPE_VECTOR: + data=static_cast(new Vector()); + break; + case TYPE_TIME: + data=static_cast(new Time()); + break; + case TYPE_REAL: + data=static_cast(new Real()); + break; + case TYPE_COLOR: + data=static_cast(new Color()); + break; + case TYPE_SEGMENT: + data=static_cast(new Segment()); + break; + case TYPE_BLINEPOINT: + data=static_cast(new BLinePoint()); + break; + case TYPE_LIST: + data=static_cast(new list_type()); + break; + case TYPE_STRING: + data=static_cast(new String()); + break; + case TYPE_GRADIENT: + data=static_cast(new Gradient()); + break; + case TYPE_CANVAS: + data=static_cast(new etl::handle()); + break; + default: + break; + } +} + +ValueBase::~ValueBase() +{ + clear(); +} + +const char* +ValueBase::get(const char*)const +{ + return get(String()).c_str(); +} + + + + +void +ValueBase::set(Canvas* x) +{ + clear(); + if(x && x->is_inline()) + { + _set(etl::handle(x)); + } + else + { + _set(etl::loose_handle(x)); + } + assert(get(x)==x); +} + +void +ValueBase::set(etl::loose_handle x) +{ + clear(); + if(x && x->is_inline()) + { + _set(etl::handle(x)); + } + else + { + _set(etl::loose_handle(x)); + } + assert(get(x)==x); +} + +void +ValueBase::set(etl::handle x) +{ + clear(); + if(x && x->is_inline()) + { + _set(etl::handle(x)); + } + else + { + _set(etl::loose_handle(x)); + } + assert(get(x)==x); +} + +void +ValueBase::set(const list_type &x) +{ + _set(x); +} + +void +ValueBase::set(const char* x) +{ + _set(String(x)); +} + +bool +ValueBase::is_valid()const +{ + return type>TYPE_NIL && type(data); + break; + case TYPE_INTEGER: + delete static_cast(data); + break; + case TYPE_ANGLE: + delete static_cast(data); + break; + case TYPE_VECTOR: + delete static_cast(data); + break; + case TYPE_TIME: + delete static_cast(data); + break; + case TYPE_REAL: + delete static_cast(data); + break; + case TYPE_COLOR: + delete static_cast(data); + break; + case TYPE_SEGMENT: + delete static_cast(data); + break; + case TYPE_BLINEPOINT: + delete static_cast(data); + break; + case TYPE_LIST: + delete static_cast(data); + break; + case TYPE_STRING: + delete static_cast(data); + break; + case TYPE_GRADIENT: + delete static_cast(data); + break; + + + case TYPE_CANVAS: + { + etl::handle canvas(get(etl::loose_handle())); + if(canvas && canvas->is_inline()) + { + delete static_cast*>(data); + } + else + { + delete static_cast*>(data); + } + break; + } + default: + break; + } + } + + ref_count.detach(); + data=0; + type=TYPE_NIL; +} + + +String +ValueBase::type_name(Type id) +{ + switch(id) + { + case TYPE_REAL: + return "real"; + case TYPE_TIME: + return "time"; + case TYPE_INTEGER: + return "integer"; + case TYPE_BOOL: + return "bool"; + case TYPE_ANGLE: + return "angle"; + case TYPE_VECTOR: + return "vector"; + case TYPE_COLOR: + return "color"; + case TYPE_STRING: + return "string"; + case TYPE_CANVAS: + return "canvas"; + case TYPE_LIST: + return "list"; + case TYPE_SEGMENT: + return "segment"; + case TYPE_GRADIENT: + return "gradient"; + case TYPE_BLINEPOINT: + return "bline_point"; + case TYPE_NIL: + return "nil"; + default: + break; + } + synfig::warning("Encountered unknown ValueBase with an Type of %d",id); +// assert(0); + return "UNKNOWN"; +} + +ValueBase::Type +ValueBase::ident_type(const String &str) +{ + if(str=="nil" || str=="null") + return TYPE_NIL; + else if(str=="time" || str==_("time")) + return TYPE_TIME; + else if(str=="real" || str=="float" || str==_("real")) + return TYPE_REAL; + else if(str=="integer" || str=="int" || str==_("integer")) + return TYPE_INTEGER; + else if(str=="bool" || str==_("bool")) + return TYPE_BOOL; + else if(str=="angle" || str=="degrees" || str=="radians" || str=="rotations") + return TYPE_ANGLE; + else if(str=="vector" || str=="point") + return TYPE_VECTOR; + else if(str=="color") + return TYPE_COLOR; + else if(str=="string") + return TYPE_STRING; + else if(str=="canvas") + return TYPE_CANVAS; + else if(str=="list") + return TYPE_LIST; + else if(str=="segment") + return TYPE_SEGMENT; + else if(str=="gradient") + return TYPE_GRADIENT; + else if(str=="bline_point" || str=="blinepoint") + return TYPE_BLINEPOINT; + + return TYPE_NIL; +} + +bool +ValueBase::operator==(const ValueBase& rhs)const +{ + if(get_type()!=rhs.get_type()) + return false; + if(data==rhs.data) + return true; + + switch(get_type()) + { + case TYPE_TIME: + return get(Time()).is_equal(rhs.get(Time())); + case TYPE_REAL: + return abs(get(Real())-rhs.get(Real()))<=0.00000000000001; + case TYPE_INTEGER: + return get(int())==rhs.get(int()); + case TYPE_BOOL: + return get(bool())==rhs.get(bool()); + case TYPE_ANGLE: + return get(Angle())==rhs.get(Angle()); + case TYPE_VECTOR: + return get(Vector()).is_equal_to(rhs.get(Vector())); + case TYPE_COLOR: + return get(Color())==rhs.get(Color()); + case TYPE_STRING: + return get(String())==rhs.get(String()); + case TYPE_CANVAS: + return get(Canvas::LooseHandle())==rhs.get(Canvas::LooseHandle()); + case TYPE_LIST: + return get_list()==rhs.get_list(); + case TYPE_SEGMENT: +// return get(Segment())==rhs.get(Segment()); + case TYPE_GRADIENT: +// return get(Gradient())==rhs.get(Gradient()); + case TYPE_BLINEPOINT: +// return get(BLinePoint())==rhs.get(BLinePoint()); + case TYPE_NIL: + default: + return false; + break; + } + return false; +}