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

Reply via email to