X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftags%2Fsynfig_0_61_05%2Fsynfig-core%2Fsrc%2Fsynfig%2Ftime.h;fp=synfig-core%2Ftags%2Fsynfig_0_61_05%2Fsynfig-core%2Fsrc%2Fsynfig%2Ftime.h;h=86f66e75f9aa166d0a6ba486032904f7a51aa0dc;hb=299aecad571ca490ce017004a0d7e555d6df0520;hp=0000000000000000000000000000000000000000;hpb=42861dc634bef4059ca95e5292033315a0b9ce30;p=synfig.git diff --git a/synfig-core/tags/synfig_0_61_05/synfig-core/src/synfig/time.h b/synfig-core/tags/synfig_0_61_05/synfig-core/src/synfig/time.h new file mode 100644 index 0000000..86f66e7 --- /dev/null +++ b/synfig-core/tags/synfig_0_61_05/synfig-core/src/synfig/time.h @@ -0,0 +1,165 @@ +/* === S Y N F I G ========================================================= */ +/*! \file time.h +** \brief Template Header +** +** $Id: time.h,v 1.1.1.1 2005/01/04 01:23:15 darco Exp $ +** +** \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 +*/ +/* ========================================================================= */ + +/* === S T A R T =========================================================== */ + +#ifndef __SYNFIG_TIME_H +#define __SYNFIG_TIME_H + +/* === H E A D E R S ======================================================= */ + +#include "string_decl.h" + +/* === M A C R O S ========================================================= */ + +/* === T Y P E D E F S ===================================================== */ + +/* === C L A S S E S & S T R U C T S ======================================= */ + +namespace synfig { + +/*! \class Time +** \todo writeme +** \see TimeFormat, time_to_string(), string_to_time() +*/ +class Time +{ +public: + typedef double value_type; + + /*! \enum Format + ** \todo writeme + ** \see Time, get_string() */ + enum Format + { + FORMAT_NORMAL=0, //!< Represents the default method of printing the time + FORMAT_NOSPACES=(1<<0), //!< Remove any whitespace + FORMAT_FULL=(1<<1), //!< Do not remove units that have "zero" value + FORMAT_VIDEO=(1<<2), //!< Use the HH:MM:SS.ff format + + FORMAT_END=(1<<4) //!< \internal Not used + }; // END of enum Format + +private: + value_type value_; + + static const value_type epsilon_() { return static_cast(0.0005); } + +public: + Time() { } + + Time(const value_type &x):value_(x) { } + + Time(int x):value_(x) { } + + Time(int hour, int minute, float second):value_(static_cast(second+hour*3600+minute*60)) { } + + //! Constructs Time from the given string. + /*! \note If the string references frames, then the + ** frame rate (\afps) should be provided from the + ** correct source. (Which is most likely the RendDesc + ** of the current Canvas) + ** The frame count will be ignored if the + ** FPS is not given. */ + Time(const String &string, float fps=0); + + //! Marks the exclusive negative boundary of time + static const Time begin() { return static_cast(-32767.0f*512.0f); } + + //! Marks the exclusive positive boundary of time + static const Time end() { return static_cast(32767.0f*512.0f); } + + //! Marks zero time + static const Time zero() { return static_cast(0); } + + //! The amount of allowable error in calculations + static const Time epsilon() { return static_cast(epsilon_()); } + + //! Returns a string describing the current time value + /*! \see Format */ + String get_string(float fps=0, Time::Format format=FORMAT_NORMAL)const; + + //! \writeme + bool is_valid()const; + + //! Rounds time to the nearest frame for the given frame rate, \a fps + Time round(float fps)const; + + bool is_equal(const Time& rhs)const { return (value_>rhs.value_)?value_-rhs.value_<=epsilon_():rhs.value_-value_<=epsilon_(); } + bool is_less_than(const Time& rhs)const { return rhs.value_-value_ > epsilon_(); } + bool is_more_than(const Time& rhs)const { return value_-rhs.value_ > epsilon_(); } + + operator double()const { return value_; } + + template bool operator<(const U& rhs)const { return value_ bool operator>(const U& rhs)const { return value_>rhs; } + template bool operator<=(const U& rhs)const { return value_<=rhs; } + template bool operator>=(const U& rhs)const { return value_>=rhs; } + template bool operator==(const U& rhs)const { return value_==rhs; } + template bool operator!=(const U& rhs)const { return value_!=rhs; } + +#if 0 + bool operator<(const Time& rhs)const { return value_(const Time& rhs)const { return value_>rhs.value_; } + bool operator<=(const Time& rhs)const { return value_<=rhs.value_; } + bool operator>=(const Time& rhs)const { return value_>=rhs.value_; } + bool operator==(const Time& rhs)const { return value_==rhs.value_; } + bool operator!=(const Time& rhs)const { return value_!=rhs.value_; } +#else + bool operator<(const Time& rhs)const { return is_less_than(rhs); } + bool operator>(const Time& rhs)const { return is_more_than(rhs); } + bool operator<=(const Time& rhs)const { return is_less_than(rhs)||is_equal(rhs); } + bool operator>=(const Time& rhs)const { return is_more_than(rhs)||is_equal(rhs); } + bool operator==(const Time& rhs)const { return is_equal(rhs); } + bool operator!=(const Time& rhs)const { return !is_equal(rhs); } +#endif + + template const Time& operator+=(const U &rhs) { value_+=static_cast(rhs); return *this; } + template const Time& operator-=(const U &rhs) { value_-=static_cast(rhs); return *this; } + template const Time& operator*=(const U &rhs) { value_*=static_cast(rhs); return *this; } + template const Time& operator/=(const U &rhs) { value_/=static_cast(rhs); return *this; } + + template Time operator+(const U &rhs)const { return value_+static_cast(rhs); } + template Time operator-(const U &rhs)const { return value_-static_cast(rhs); } + template Time operator*(const U &rhs)const { return value_*static_cast(rhs); } + template Time operator/(const U &rhs)const { return value_/static_cast(rhs); } + + Time operator-()const { return -value_; } +}; // END of class Time + +//! This operator allows the combining of Time::Format flags using the '|' operator +/*! \see Time::Format, Time::get_string() */ +inline Time::Format operator|(Time::Format lhs, Time::Format rhs) +{ return static_cast((int)lhs|(int)rhs); } + +//! This operator is for checking Time::Format flags. +/*! Don't think of it as "less then or equal to", but think of it +** like an arrow. Is \a rhs inside of \a lhs ? +** \see Time::Format, Time::get_string() */ +inline bool operator<=(Time::Format lhs, Time::Format rhs) +{ return (static_cast(lhs) & static_cast(rhs))==static_cast(rhs); } + +}; // END of namespace synfig + +/* === E N D =============================================================== */ + +#endif