X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftags%2Fsynfig_0_61_07_rc1%2Fsrc%2Fsynfig%2Flistimporter.cpp;fp=synfig-core%2Ftags%2Fsynfig_0_61_07_rc1%2Fsrc%2Fsynfig%2Flistimporter.cpp;h=11b59ea4418b24887607ca2f1e1930f0ea7a3bc2;hb=7d32b486bfe48032fdb52fbb3b6f144a6ce7e63e;hp=0000000000000000000000000000000000000000;hpb=e46234d7b452318bb265f47ba85f2a5226f9657a;p=synfig.git diff --git a/synfig-core/tags/synfig_0_61_07_rc1/src/synfig/listimporter.cpp b/synfig-core/tags/synfig_0_61_07_rc1/src/synfig/listimporter.cpp new file mode 100644 index 0000000..11b59ea --- /dev/null +++ b/synfig-core/tags/synfig_0_61_07_rc1/src/synfig/listimporter.cpp @@ -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 +#endif + +#include "listimporter.h" +#include "general.h" +#include + +#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(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 >::iterator iter; + for(iter=frame_cache.begin();iter!=frame_cache.end();++iter) + { + if(iter->first==frame) + { +// DEBUGPOINT(); + surface.mirror(iter->second); + return static_cast(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(frame,surface)); + +// DEBUGPOINT(); + + surface.mirror(frame_cache.back().second); + +// DEBUGPOINT(); + + return static_cast(surface); +} + +bool +ListImporter::is_animated() +{ + return true; +}