Fix bugs in previous commit that caused FTBFS in synfig and ETL FTBFS with older...
[synfig.git] / synfig-core / tags / stable / src / synfig / time.cpp
index eb2eef7..c639775 100644 (file)
@@ -6,6 +6,9 @@
 **
 **     \legal
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+**     Copyright (c) 2007, 2008 Chris Moore
+**  Copyright (c) 2008 Gerco Ballintijn
+**  Copyright (c) 2008 Carlos López
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
@@ -100,7 +103,7 @@ Time::Time(const String &str_, float fps):
        int read;
        float amount;
 
-       // Now try to read it in the letter-abreviated format
+       // Now try to read it in the letter-abbreviated format
        while(pos<str.size() && sscanf(String(str,pos).c_str(),"%f%n",&amount,&read))
        {
                pos+=read;
@@ -182,17 +185,18 @@ Time::get_string(float fps, Time::Format format)const
                time.value_=ceil(time.value_);
 
        int hour,minute;
-
-       hour=time/3600;time-=hour*3600;
-       minute=time/60;time-=minute*60;
-
+       if(!(format<=FORMAT_FRAMES))
+       {
+               hour=time/3600;time-=hour*3600;
+               minute=time/60;time-=minute*60;
+       }
        // <= is redefined, so this means "is the FORMAT_VIDEO bit set in the format?"
        if(format<=FORMAT_VIDEO)
        {
                int second;
                second=time;time-=second;
 
-               if(fps)
+               if(fps && fps>1)
                {
                        int frame;
                        frame=round_to_int(time*fps);
@@ -203,39 +207,57 @@ Time::get_string(float fps, Time::Format format)const
                        return strprintf("%02d:%02d:%02d",hour,minute,second);
        }
 
+       if (format <= FORMAT_FRAMES)
+       {
+               if (fps && fps>0)
+                       return strprintf("%df", round_to_int(time * fps));
+               else
+                       return strprintf("%ds", round_to_int(time * 1));
+       }
+
        String ret;
        bool started = false;
 
        if(format<=FORMAT_FULL || hour)
        {
-               ret+=strprintf(format<=FORMAT_NOSPACES?"%dh":"%dh ",hour);
+               ret+=strprintf("%dh",hour);
                started = true;
        }
 
        if(format<=FORMAT_FULL || minute)
        {
-               ret+=strprintf(format<=FORMAT_NOSPACES?"%dm":"%dm ",minute);
+               if (!(format<=FORMAT_NOSPACES) && started)
+                       ret += " ";
+
+               ret += strprintf("%dm", minute);
                started = true;
        }
 
-       if(fps)
+       if(fps && fps>1)
        {
                int second;
                float frame;
                second=time;time-=second;
                frame=time*fps;
+
                if(format<=FORMAT_FULL || second)
                {
-                       ret+=strprintf(format<=FORMAT_NOSPACES?"%ds":"%ds ",(int)second);
+                       if (!(format<=FORMAT_NOSPACES) && started)
+                               ret += " ";
+
+                       ret += strprintf("%ds", (int)second);
                        started = true;
                }
 
-               if(format<=FORMAT_FULL || frame || !started)
+               if(format<=FORMAT_FULL || abs(frame) > epsilon_() || !started)
                {
-                       if(abs(frame-floor(frame)>=epsilon_()))
-                               ret+=strprintf("%0.3ff",frame);
+                       if (!(format<=FORMAT_NOSPACES) && started)
+                               ret += " ";
+
+                       if(abs(frame-floor(frame) >= epsilon_()))
+                               ret += strprintf("%0.3ff", frame);
                        else
-                               ret+=strprintf("%0.0ff",frame);
+                               ret += strprintf("%0.0ff", frame);
                }
        }
        else
@@ -244,8 +266,24 @@ Time::get_string(float fps, Time::Format format)const
                second=time;
                if(format<=FORMAT_FULL || second || !started)
                {
+                       if (!(format<=FORMAT_NOSPACES) && started)
+                               ret += " ";
+
                        if(abs(second-floor(second))>=epsilon_())
-                               ret+=strprintf("%0.8fs",second);
+                       {
+                               String seconds(strprintf("%0.8f",second));
+
+                               // skip trailing zeros
+                               int count = 0;
+                               String::reverse_iterator i = seconds.rbegin();
+                               for ( ; (*i) == '0'; i++)
+                                       count++;
+
+                               // if we removed too many, go back one place, leaving one zero
+                               if (*i < '0' || *i > '9') count--;
+
+                               ret += seconds.substr(0, seconds.size()-count) + "s";
+                       }
                        else
                                ret+=strprintf("%0.0fs",second);
                }
@@ -269,6 +307,14 @@ Time::round(float fps)const
                return ceil(time)/fps;
 }
 
+#ifdef _DEBUG
+const char *
+Time::c_str()const
+{
+       return get_string().c_str();
+}
+#endif
+
 //! \writeme
 bool
 Time::is_valid()const