synfig-core  1.0.3
module.h
Go to the documentation of this file.
1 /* === S Y N F I G ========================================================= */
22 /* ========================================================================= */
23 
24 /* === S T A R T =========================================================== */
25 
26 #ifndef __SYNFIG_MODULE_H
27 #define __SYNFIG_MODULE_H
28 
29 /* === H E A D E R S ======================================================= */
30 
31 #include "general.h"
32 #include <ETL/handle>
33 #include <map>
34 #include "string.h"
35 #include "releases.h"
36 #include <utility>
37 #include "vector.h"
38 #include "color.h"
39 #include "layer.h"
40 #include "canvas.h"
41 
42 //#include "value.h"
43 
44 /* === M A C R O S ========================================================= */
45 
47 #define MODULE_DESC_BEGIN(x) struct x##_modclass : public synfig::Module { x##_modclass(synfig::ProgressCallback *callback=NULL);
48 
50 #define MODULE_NAME(x) virtual const char * Name() { return x; }
51 
53 #define MODULE_DESCRIPTION(x) virtual const char * Desc() { return x; }
54 
56 #define MODULE_AUTHOR(x) virtual const char * Author() { return x; }
57 
59 #define MODULE_VERSION(x) virtual const char * Version() { return x; }
60 
62 #define MODULE_COPYRIGHT(x) virtual const char * Copyright() { return x; }
63 
65 #define MODULE_CONSTRUCTOR(x) bool constructor_(synfig::ProgressCallback *cb) { return x(cb); }
66 
68 #define MODULE_DESTRUCTOR(x) virtual void destructor_() { return x(); }
69 
71 #define MODULE_DESC_END };
72 
73 //#if 0
74 #ifdef __APPLE__
75 
76 #define MODULE_INVENTORY_BEGIN(x) extern "C" { \
77  synfig::Module* _##x##_LTX_new_instance(synfig::ProgressCallback *cb) \
78  { if(SYNFIG_CHECK_VERSION()){x##_modclass *mod=new x##_modclass(cb); mod->constructor_(cb); return mod; }\
79  if(cb)cb->error(#x": Unable to load module due to version mismatch."); return NULL; } \
80  }; x##_modclass::x##_modclass(synfig::ProgressCallback */*cb*/) {
81 #else
82 
83 #define MODULE_INVENTORY_BEGIN(x) extern "C" { \
84  synfig::Module* x##_LTX_new_instance(synfig::ProgressCallback *cb) \
85  { if(SYNFIG_CHECK_VERSION()){x##_modclass *mod=new x##_modclass(cb); mod->constructor_(cb); return mod; }\
86  if(cb)cb->error(#x": Unable to load module due to version mismatch."); return NULL; } \
87  }; x##_modclass::x##_modclass(synfig::ProgressCallback */*cb*/) {
88 #endif
89 
91 #define BEGIN_LAYERS {
92 
94 // Really? ^^ The INCLUDE_LAYER(class) macro is defined in a cpp file and
95 // is undefined a few lines later. In fact the INCLUDE_LAYER is only
96 // used in the layer.cpp file and the functionality is the same. Even
97 // more, I think that we should use register_in_book call because maybe
98 // the Layer class would like to do something else when register the class.
100 #define LAYER(class) \
101  synfig::Layer::register_in_book( \
102  synfig::Layer::BookEntry(class::create, \
103  class::name__, \
104  dgettext("synfig", class::local_name__), \
105  class::category__, \
106  class::cvs_id__, \
107  class::version__));
108 
110 #define LAYER_ALIAS(class,alias) \
111  synfig::Layer::register_in_book( \
112  synfig::Layer::BookEntry(class::create, \
113  alias, \
114  alias, \
115  CATEGORY_DO_NOT_USE, \
116  class::cvs_id__, \
117  class::version__));
118 
120 #define END_LAYERS }
121 
123 #define BEGIN_TARGETS {
124 
125 #define TARGET(x) \
126  synfig::Target::book()[synfig::String(x::name__)].factory = \
127  reinterpret_cast<synfig::Target::Factory> (x::create); \
128  synfig::Target::book()[synfig::String(x::name__)].filename = \
129  synfig::String(x::ext__); \
130  synfig::Target::book()[synfig::String(x::name__)].target_param = \
131  synfig::TargetParam(); \
132  synfig::Target::ext_book()[synfig::String(x::ext__)]=x::name__;
133 
134 #define TARGET_EXT(x,y) synfig::Target::ext_book()[synfig::String(y)]=x::name__;
135 
137 #define END_TARGETS }
138 
140 #define BEGIN_IMPORTERS {
141 
143 #define IMPORTER_EXT(x,y) \
144  synfig::Importer::book()[synfig::String(y)]=synfig::Importer::BookEntry(x::create, x::supports_file_system_wrapper__);
145 
147 #define IMPORTER(x) IMPORTER_EXT(x,x::ext__)
148 
150 #define CAIROIMPORTER_EXT(x,y) \
151  synfig::CairoImporter::book()[synfig::String(y)]=synfig::CairoImporter::BookEntry(x::create, x::supports_file_system_wrapper__);
152 
154 #define CAIROIMPORTER(x) CAIROIMPORTER_EXT(x,x::ext__)
155 
157 #define END_IMPORTERS }
158 
160 #define BEGIN_VALUENODES { synfig::LinkableValueNode::Book &book(synfig::LinkableValueNode::book());
161 
163 #define VALUENODE(class,name,local,version) \
164  book[name].factory=reinterpret_cast<synfig::LinkableValueNode::Factory>(&class::create); \
165  book[name].check_type=&class::check_type; \
166  book[name].local_name=local; \
167  book[name].release_version=version;
168 
170 #define END_VALUENODES }
171 
173 #define MODULE_INVENTORY_END }
174 
175 /* === T Y P E D E F S ===================================================== */
176 
177 /* === C L A S S E S & S T R U C T S ======================================= */
178 
179 namespace synfig {
180 
181 class ProgressCallback;
182 
186 class Module : public etl::shared_object
187 {
188 public:
189  bool constructor_(synfig::ProgressCallback */*cb*/) { return true; }
190  virtual void destructor_() { }
191 
192  typedef etl::handle<Module> Handle;
193  typedef etl::loose_handle<Module> LooseHandle;
194  typedef etl::handle<const Module> ConstHandle;
195 
196 public:
199  typedef Module* (*constructor_type)(ProgressCallback *);
200  typedef std::map<String, Handle > Book;
201 private:
202  static Book* book_;
203 public:
204  static Book& book();
205 
208  static bool subsys_init(const String &prefix);
209  static bool subsys_stop();
211  static void register_default_modules(ProgressCallback *cb=NULL);
212 
214  static void Register(Handle mod);
216  static bool Register(const String &module_name, ProgressCallback *cb=NULL);
218  static inline void Register(Module *mod) { Register(Handle(mod)); }
219 
221  virtual const char * Name() { return " "; }
222  virtual const char * Desc() { return " "; }
223  virtual const char * Author() { return " "; }
224  virtual const char * Version() { return " "; }
225  virtual const char * Copyright() { return SYNFIG_COPYRIGHT; }
226 
227  virtual ~Module() { destructor_(); }
228 };
229 
230 }; // END of namespace synfig
231 
232 /* === E N D =============================================================== */
233 
234 #endif