Revision: 4467 http://pd-gem.svn.sourceforge.net/pd-gem/?rev=4467&view=rev Author: zmoelnig Date: 2011-08-15 13:05:37 +0000 (Mon, 15 Aug 2011)
Log Message: ----------- moved meta imageloader class implementation to imageloader.cpp imageloader::getInstance() now returns a valid instance that wraps all classes Modified Paths: -------------- trunk/Gem/src/Gem/ImageLoad.cpp trunk/Gem/src/plugins/imageloader.cpp Modified: trunk/Gem/src/Gem/ImageLoad.cpp =================================================================== --- trunk/Gem/src/Gem/ImageLoad.cpp 2011-08-15 13:05:07 UTC (rev 4466) +++ trunk/Gem/src/Gem/ImageLoad.cpp 2011-08-15 13:05:37 UTC (rev 4467) @@ -20,110 +20,7 @@ #include "Gem/SynchedWorkerThread.h" #include "plugins/imageloader.h" -#include "plugins/PluginFactory.h" -namespace gem { - class PixImageLoader : public gem::plugins::imageloader { - private: - static PixImageLoader*s_instance; - std::vector<gem::plugins::imageloader*>m_loaders; - std::vector<std::string>m_ids; - bool m_canThread; - - PixImageLoader(void) : m_canThread(true) { - gem::PluginFactory<gem::plugins::imageloader>::loadPlugins("image"); - std::vector<std::string>available_ids=gem::PluginFactory<gem::plugins::imageloader>::getIDs(); - - addLoader(available_ids, "magick"); - addLoader(available_ids); - - if(m_ids.size()>0) { - startpost("Image loading support:"); - unsigned int i; - for(i=0; i<m_ids.size(); i++) { - startpost(" %s", m_ids[i].c_str()); - } - endpost(); - } - - - m_canThread=true; - unsigned int i; - for(i=0; i<m_loaders.size(); i++) { - if(!m_loaders[i]->isThreadable()) { - m_canThread=false; - break; - } - } - } - bool addLoader( std::vector<std::string>available, std::string ID=std::string("")) - { - int count=0; - - std::vector<std::string>id; - if(!ID.empty()) { - // if requested 'cid' is in 'available' add it to the list of 'id's - if(std::find(available.begin(), available.end(), ID)!=available.end()) { - id.push_back(ID); - } else { - // request for an unavailable ID - verbose(2, "backend '%s' unavailable", ID.c_str()); - return false; - } - } else { - // no 'ID' given: add all available IDs - id=available; - } - - unsigned int i=0; - for(i=0; i<id.size(); i++) { - std::string key=id[i]; - verbose(2, "trying to add '%s' as backend", key.c_str()); - if(std::find(m_ids.begin(), m_ids.end(), key)==m_ids.end()) { - // not yet added, do so now! - gem::plugins::imageloader*loader= - gem::PluginFactory<gem::plugins::imageloader>::getInstance(key); - if(NULL==loader)break; - m_ids.push_back(key); - m_loaders.push_back(loader); - count++; - verbose(2, "added backend#%d '%s' @ 0x%x", m_loaders.size()-1, key.c_str(), loader); - } - } - return (count>0); - } - - public: - virtual ~PixImageLoader(void) { - unsigned int i; - for(i=0; i<m_loaders.size(); i++) { - delete m_loaders[i]; - m_loaders[i]=NULL; - } - } - - virtual bool load(std::string filename, imageStruct&result, gem::Properties&props) { - unsigned int i; - for(i=0; i<m_loaders.size(); i++) { - if(m_loaders[i]->load(filename, result, props)) - return true; - } - return false; - } - - static PixImageLoader*getInstance(void) { - if(NULL==s_instance) { - s_instance=new PixImageLoader(); - } - return s_instance; - } - virtual bool isThreadable(void) { - return m_canThread; - } - }; }; -gem::PixImageLoader*gem::PixImageLoader::s_instance=NULL; - - namespace gem { namespace image { struct PixImageThreadLoader : public gem::thread::SynchedWorkerThread { struct InData { @@ -149,12 +46,17 @@ }; }; - gem::PixImageLoader*imageloader; + static gem::plugins::imageloader*s_imageloader; PixImageThreadLoader(void) : - SynchedWorkerThread(false), - imageloader(gem::PixImageLoader::getInstance()) + SynchedWorkerThread(false) { - if(!imageloader->isThreadable()) + if(NULL==s_imageloader) { + s_imageloader=gem::plugins::imageloader::getInstance(); + } + if(!s_imageloader) + throw(40); + + if(!s_imageloader->isThreadable()) throw(42); start(); } @@ -174,7 +76,7 @@ } // DOIT out->img=new imageStruct; - if(!imageloader->load(in->filename, *out->img, out->props)) { + if(!s_imageloader->load(in->filename, *out->img, out->props)) { delete out->img; out->img=0; } @@ -227,21 +129,22 @@ static PixImageThreadLoader*s_instance; }; PixImageThreadLoader*PixImageThreadLoader::s_instance=NULL; + gem::plugins::imageloader*PixImageThreadLoader::s_imageloader=NULL; - const load::id_t load::IMMEDIATE= 0; const load::id_t load::INVALID =~0; bool load::sync(const std::string filename, imageStruct&result, gem::Properties&props) { - gem::PixImageLoader*piximageloader=gem::PixImageLoader::getInstance(); - if(piximageloader) { - if(piximageloader->load(filename, result, props)) { - return true; + if(!PixImageThreadLoader::s_imageloader) + PixImageThreadLoader::s_imageloader=gem::plugins::imageloader::getInstance(); + if((PixImageThreadLoader::s_imageloader) && + (PixImageThreadLoader::s_imageloader->load(filename, result, props))) + { + return true; } - } return false; } Modified: trunk/Gem/src/plugins/imageloader.cpp =================================================================== --- trunk/Gem/src/plugins/imageloader.cpp 2011-08-15 13:05:07 UTC (rev 4466) +++ trunk/Gem/src/plugins/imageloader.cpp 2011-08-15 13:05:37 UTC (rev 4467) @@ -15,10 +15,107 @@ #include "imageloader.h" #include "plugins/PluginFactory.h" +#include "Gem/RTE.h" + gem::plugins::imageloader :: ~imageloader(void) {} +static gem::PluginFactoryRegistrar::dummy<gem::plugins::imageloader> fac_imageloaderdummy; + +namespace gem { namespace plugins { + class imageloaderMeta : public gem::plugins::imageloader { + private: + static imageloaderMeta*s_instance; + std::vector<gem::plugins::imageloader*>m_loaders; + std::vector<std::string>m_ids; + bool m_canThread; + public: + imageloaderMeta(void) : m_canThread(true) { + gem::PluginFactory<gem::plugins::imageloader>::loadPlugins("image"); + std::vector<std::string>available_ids=gem::PluginFactory<gem::plugins::imageloader>::getIDs(); + + addLoader(available_ids, "magick"); + addLoader(available_ids); + + if(m_ids.size()>0) { + startpost("Image loading support:"); + unsigned int i; + for(i=0; i<m_ids.size(); i++) { + startpost(" %s", m_ids[i].c_str()); + } + endpost(); + } + + + m_canThread=true; + unsigned int i; + for(i=0; i<m_loaders.size(); i++) { + if(!m_loaders[i]->isThreadable()) { + m_canThread=false; + break; + } + } + } + bool addLoader( std::vector<std::string>available, std::string ID=std::string("")) { + int count=0; + + std::vector<std::string>id; + if(!ID.empty()) { + // if requested 'cid' is in 'available' add it to the list of 'id's + if(std::find(available.begin(), available.end(), ID)!=available.end()) { + id.push_back(ID); + } else { + // request for an unavailable ID + verbose(2, "backend '%s' unavailable", ID.c_str()); + return false; + } + } else { + // no 'ID' given: add all available IDs + id=available; + } + + unsigned int i=0; + for(i=0; i<id.size(); i++) { + std::string key=id[i]; + verbose(2, "trying to add '%s' as backend", key.c_str()); + if(std::find(m_ids.begin(), m_ids.end(), key)==m_ids.end()) { + // not yet added, do so now! + gem::plugins::imageloader*loader= + gem::PluginFactory<gem::plugins::imageloader>::getInstance(key); + if(NULL==loader)break; + m_ids.push_back(key); + m_loaders.push_back(loader); + count++; + verbose(2, "added backend#%d '%s' @ 0x%x", m_loaders.size()-1, key.c_str(), loader); + } + } + return (count>0); + } + + public: + virtual ~imageloaderMeta(void) { + unsigned int i; + for(i=0; i<m_loaders.size(); i++) { + delete m_loaders[i]; + m_loaders[i]=NULL; + } + } + + virtual bool load(std::string filename, imageStruct&result, gem::Properties&props) { + unsigned int i; + for(i=0; i<m_loaders.size(); i++) { + if(m_loaders[i]->load(filename, result, props)) + return true; + } + return false; + } + + virtual bool isThreadable(void) { + return m_canThread; + } + }; }; }; + + gem::plugins::imageloader*gem::plugins::imageloader::getInstance(void) { - return NULL; + gem::plugins::imageloader*result=new imageloaderMeta(); + return result; } - -static gem::PluginFactoryRegistrar::dummy<gem::plugins::imageloader> fac_imageloaderdummy; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ uberSVN's rich system and user administration capabilities and model configuration take the hassle out of deploying and managing Subversion and the tools developers use with it. Learn more about uberSVN and get a free download at: http://p.sf.net/sfu/wandisco-dev2dev _______________________________________________ pd-gem-CVS mailing list pd-gem-CVS@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/pd-gem-cvs