{
public:
etl::handle<synfig::Target_Tile> warm_target;
-
+
struct tile_t
{
Surface surface;
};
std::list<tile_t> tile_queue;
Glib::Mutex mutex;
-
+
#ifndef GLIB_DISPATCHER_BROKEN
Glib::Dispatcher tile_ready_signal;
#endif
Glib::Cond cond_tile_queue_empty;
bool alive_flag;
-
+
sigc::connection ready_connection;
-
+
public:
AsyncTarget_Tile(etl::handle<synfig::Target_Tile> warm_target):
warm_target(warm_target)
ready_connection=tile_ready_signal.connect(sigc::mem_fun(*this,&AsyncTarget_Tile::tile_ready));
#endif
}
-
+
~AsyncTarget_Tile()
{
ready_connection.disconnect();
Glib::Mutex::Lock lock(mutex);
alive_flag=false;
}
-
+
virtual int total_tiles()const
{
return warm_target->total_tiles();
}
-
+
virtual int next_tile(int& x, int& y)
{
if(!alive_flag)
return 0;
-
+
return warm_target->next_tile(x,y);
}
return 0;
return warm_target->next_frame(time);
}
-
+
virtual bool start_frame(synfig::ProgressCallback *cb=0)
{
if(!alive_flag)
return false;
return warm_target->start_frame(cb);
}
-
+
virtual bool add_tile(const synfig::Surface &surface, int gx, int gy)
{
assert(surface);
tile_ready_signal();
#endif
}
-
+
return alive_flag;
}
while(!tile_queue.empty() && alive_flag)
{
tile_t& tile(tile_queue.front());
-
+
alive_flag=warm_target->add_tile(tile.surface,tile.x,tile.y);
-
+
tile_queue.pop_front();
}
cond_tile_queue_empty.signal();
{
public:
etl::handle<synfig::Target_Scanline> warm_target;
-
+
int scanline_;
Surface surface;
Glib::Mutex mutex;
-
+
#ifndef GLIB_DISPATCHER_BROKEN
Glib::Dispatcher frame_ready_signal;
#endif
#endif
surface.set_wh(warm_target->rend_desc().get_w(),warm_target->rend_desc().get_h());
}
-
+
~AsyncTarget_Scanline()
{
ready_connection.disconnect();
Glib::Mutex::Lock lock(mutex);
alive_flag=false;
}
-
+
virtual bool start_frame(synfig::ProgressCallback *cb=0)
- {
+ {
return alive_flag;
}
-
+
virtual void end_frame()
{
{
}
}
-
+
virtual Color * start_scanline(int scanline)
{
Glib::Mutex::Lock lock(mutex);
return surface[scanline];
}
-
+
virtual bool end_scanline()
{
return alive_flag;
etl::handle<AsyncTarget_Tile> wrap_target(
new AsyncTarget_Tile(etl::handle<synfig::Target_Tile>::cast_dynamic(target_))
);
-
+
signal_stop_.connect(sigc::mem_fun(*wrap_target,&AsyncTarget_Tile::set_dead));
-
+
target=wrap_target;
}
else if(etl::handle<synfig::Target_Scanline>::cast_dynamic(target_))
etl::handle<synfig::Target_Scanline>::cast_dynamic(target_)
)
);
-
+
signal_stop_.connect(sigc::mem_fun(*wrap_target,&AsyncTarget_Scanline::set_dead));
-
+
target=wrap_target;
}
}
{
Glib::Mutex::Lock lock(mutex);
done_connection.disconnect();
-
+
if(render_thread)
{
signal_stop_();
-
+
#if REJOIN_ON_STOP
render_thread->join();
#endif
-
+
// Make sure all the dispatch crap is cleared out
//Glib::MainContext::get_default()->iteration(false);
-
+
if(success)
signal_success_();
-
+
signal_finished_();
-
+
target=0;
render_thread=0;
}
#ifndef GLIB_DISPATCHER_BROKEN
done_connection=signal_done_.connect(mem_fun(*this,&AsyncRenderer::stop));
#endif
-
+
render_thread=Glib::Thread::create(
sigc::mem_fun(*this,&AsyncRenderer::render_target),
#if REJOIN_ON_STOP
AsyncRenderer::render_target()
{
etl::handle<Target> target(AsyncRenderer::target);
-
+
if(target && target->render())
{
success=true;