00001
00022
00023
00024
00025
00026 #ifndef __SYNFIG_ASYNCRENDERER_H
00027 #define __SYNFIG_ASYNCRENDERER_H
00028
00029
00030
00031 #include <ETL/handle>
00032 #include <sigc++/signal.h>
00033 #include <sigc++/trackable.h>
00034 #include <sigc++/connection.h>
00035
00036 #include <synfig/target_scanline.h>
00037 #include <synfig/target_tile.h>
00038 #include <synfig/surface.h>
00039 #include <glibmm/main.h>
00040 #include <ETL/ref_count>
00041 #include <glibmm/thread.h>
00042 #include <glibmm/dispatcher.h>
00043
00044
00045
00046
00047
00048 #ifdef SINGLE_THREADED
00049 # define single_threaded() App::single_threaded
00050 #endif
00051
00052
00053
00054
00055
00056 namespace studio {
00057
00058 class AsyncRenderer : public etl::shared_object, public sigc::trackable
00059 {
00060 sigc::signal<void> signal_finished_;
00061 sigc::signal<void> signal_success_;
00062
00063 std::list<sigc::connection> activity_connection_list;
00064
00065
00066
00067 etl::handle<synfig::Target> target;
00068
00069 bool error;
00070 bool success;
00071
00072 synfig::ProgressCallback *cb;
00073
00074 sigc::signal<void> signal_stop_;
00075
00076 Glib::Thread* render_thread;
00077 Glib::Dispatcher signal_done_;
00078 Glib::Mutex mutex;
00079 sigc::connection done_connection;
00080
00081
00082
00083
00084 public:
00085
00086 AsyncRenderer(etl::handle<synfig::Target> target,synfig::ProgressCallback *cb=0);
00087 virtual ~AsyncRenderer();
00088
00089 void start();
00090 void stop();
00091 void pause();
00092 void resume();
00093 #ifdef SINGLE_THREADED
00094 void rendering_progress();
00095 bool updating;
00096 #endif
00097
00098 bool has_error()const { return error; }
00099 bool has_success()const { return success; }
00100
00101 sigc::signal<void>& signal_finished() { return signal_finished_; }
00102 sigc::signal<void>& signal_success() { return signal_success_; }
00103
00104 private:
00105
00106 void render_target();
00107 void start_();
00108
00109
00110
00111
00112
00113 protected:
00114
00115 };
00116
00117 };
00118
00119
00120
00121 #endif