Release synfig_0_61_07_rc2
[synfig.git] / synfig-core / tags / synfig_0_61_07_rc2 / src / synfig / listimporter.cpp
diff --git a/synfig-core/tags/synfig_0_61_07_rc2/src/synfig/listimporter.cpp b/synfig-core/tags/synfig_0_61_07_rc2/src/synfig/listimporter.cpp
new file mode 100644 (file)
index 0000000..11b59ea
--- /dev/null
@@ -0,0 +1,168 @@
+/* === S Y N F I G ========================================================= */
+/*!    \file listimporter.cpp
+**     \brief Template File
+**
+**     $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 <config.h>
+#endif
+
+#include "listimporter.h"
+#include "general.h"
+#include <fstream>
+
+#endif
+
+/* === U S I N G =========================================================== */
+
+using namespace std;
+using namespace etl;
+using namespace synfig;
+
+/* === M A C R O S ========================================================= */
+
+#define LIST_IMPORTER_CACHE_SIZE       20
+
+/* === G L O B A L S ======================================================= */
+
+/* === P R O C E D U R E S ================================================= */
+
+/* === M E T H O D S ======================================================= */
+
+ListImporter::ListImporter(const String &filename)
+{
+       fps=15;
+
+       ifstream stream(filename.c_str());
+
+       if(!stream)
+       {
+               synfig::error("Unable to open "+filename);
+               return;
+       }
+       String line;
+       String prefix=etl::dirname(filename)+ETL_DIRECTORY_SEPARATOR;
+       while(!stream.eof())
+       {
+               getline(stream,line);
+               if(line.empty())
+                       continue;
+               // If we have a framerate, then use it
+               if(line.find(String("FPS "))==0)
+               {
+                       fps=atof(String(line.begin()+4,line.end()).c_str());
+                       //synfig::warning("FPS=%f",fps);
+                       if(!fps)
+                               fps=15;
+                       continue;
+               }
+               filename_list.push_back(prefix+line);
+       }
+}
+
+Importer*
+ListImporter::create(const char *filename)
+{
+       return new ListImporter(filename);
+}
+
+ListImporter::~ListImporter()
+{
+}
+
+bool
+ListImporter::get_frame(Surface &surface,Time time, ProgressCallback *cb)
+{
+//                     DEBUGPOINT();
+       int frame=static_cast<int>(time*fps);
+//                     DEBUGPOINT();
+
+       if(!filename_list.size())
+       {
+               if(cb)cb->error(_("No images in list"));
+               else synfig::error(_("No images in list"));
+               return false;
+       }
+
+//                     DEBUGPOINT();
+       if(frame<0)frame=0;
+       if(frame>=(signed)filename_list.size())frame=filename_list.size()-1;
+
+//                     DEBUGPOINT();
+       // See if that frame is cached
+       std::list<std::pair<int,Surface> >::iterator iter;
+       for(iter=frame_cache.begin();iter!=frame_cache.end();++iter)
+       {
+               if(iter->first==frame)
+               {
+//                     DEBUGPOINT();
+                       surface.mirror(iter->second);
+                       return static_cast<bool>(surface);
+               }
+       }
+
+       Importer::Handle importer(Importer::open(filename_list[frame]));
+
+//     DEBUGPOINT();
+
+       if(!importer)
+       {
+               if(cb)cb->error(_("Unable to open ")+filename_list[frame]);
+               else synfig::error(_("Unable to open ")+filename_list[frame]);
+               return false;
+       }
+
+//     DEBUGPOINT();
+
+       if(!importer->get_frame(surface,0,cb))
+       {
+               if(cb)cb->error(_("Unable to get frame from ")+filename_list[frame]);
+               else synfig::error(_("Unable to get frame from ")+filename_list[frame]);
+               return false;
+       }
+
+//     DEBUGPOINT();
+
+       if(frame_cache.size()>=LIST_IMPORTER_CACHE_SIZE)
+               frame_cache.pop_front();
+
+//     DEBUGPOINT();
+
+       frame_cache.push_back(std::pair<int,Surface>(frame,surface));
+
+//     DEBUGPOINT();
+
+       surface.mirror(frame_cache.back().second);
+
+//     DEBUGPOINT();
+
+       return static_cast<bool>(surface);
+}
+
+bool
+ListImporter::is_animated()
+{
+       return true;
+}