X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Ftrunk%2Fsrc%2Fgtkmm%2Fasyncrenderer.cpp;h=d68f7622099135a098595e45488a20b75f7a8b9c;hb=3fe8b02daa1dff7dd1d00dc6e85b70c96103d185;hp=3c64f53819e8cead26882818523ff7c11257a776;hpb=c3ad95144d148602f672e95ddda1f18fc35502f8;p=synfig.git diff --git a/synfig-studio/trunk/src/gtkmm/asyncrenderer.cpp b/synfig-studio/trunk/src/gtkmm/asyncrenderer.cpp index 3c64f53..d68f762 100644 --- a/synfig-studio/trunk/src/gtkmm/asyncrenderer.cpp +++ b/synfig-studio/trunk/src/gtkmm/asyncrenderer.cpp @@ -30,6 +30,7 @@ #endif #include "asyncrenderer.h" +#include "app.h" #include #include @@ -200,16 +201,19 @@ public: virtual void end_frame() { - while(alive_flag) + if (!single_threaded()) { - Glib::Mutex::Lock lock(mutex); - if(!tile_queue.empty() && alive_flag) + while(alive_flag) { - if(cond_tile_queue_empty.timed_wait(mutex,Glib::TimeVal(0,BOREDOM_TIMEOUT))) + Glib::Mutex::Lock lock(mutex); + if(!tile_queue.empty() && alive_flag) + { + if(cond_tile_queue_empty.timed_wait(mutex,Glib::TimeVal(0,BOREDOM_TIMEOUT))) + break; + } + else break; } - else - break; } Glib::Mutex::Lock lock(mutex); if(!alive_flag) @@ -300,14 +304,17 @@ public: #else frame_ready_signal(); #endif - } - - while(alive_flag && !ready_next) - { - Glib::Mutex::Lock lock(mutex); - if(cond_frame_queue_empty.timed_wait(mutex,Glib::TimeVal(0,BOREDOM_TIMEOUT))) - break; } + + if (single_threaded()) + signal_progress()(); + else + while(alive_flag && !ready_next) + { + Glib::Mutex::Lock lock(mutex); + if(cond_frame_queue_empty.timed_wait(mutex,Glib::TimeVal(0,BOREDOM_TIMEOUT))) + break; + } } @@ -328,7 +335,7 @@ public: Glib::Mutex::Lock lock(mutex); if(alive_flag) alive_flag=warm_target->add_frame(&surface); - cond_frame_queue_empty.signal(); + if (!single_threaded()) cond_frame_queue_empty.signal(); ready_next=true; } }; @@ -342,7 +349,8 @@ public: AsyncRenderer::AsyncRenderer(etl::handle target_,synfig::ProgressCallback *cb): error(false), success(false), - cb(cb) + cb(cb), + updating(false) { render_thread=0; if(etl::handle::cast_dynamic(target_)) @@ -387,7 +395,7 @@ AsyncRenderer::stop() signal_stop_(); #if REJOIN_ON_STOP - render_thread->join(); + if (!single_threaded()) render_thread->join(); #endif // Make sure all the dispatch crap is cleared out @@ -427,6 +435,14 @@ AsyncRenderer::start() } void +AsyncRenderer::rendering_progress() +{ + updating = true; + while(studio::App::events_pending()) studio::App::iteration(false); + updating = false; +} + +void AsyncRenderer::start_() { error=false;success=false; @@ -436,15 +452,25 @@ AsyncRenderer::start_() done_connection=signal_done_.connect(mem_fun(*this,&AsyncRenderer::stop)); #endif - render_thread=Glib::Thread::create( - sigc::mem_fun(*this,&AsyncRenderer::render_target), + if (single_threaded()) + { + synfig::info("%s:%d rendering in the same thread", __FILE__, __LINE__); + target->signal_progress().connect(sigc::mem_fun(this,&AsyncRenderer::rendering_progress)); + render_thread = (Glib::Thread*)1; + render_target(); + } + else + { + render_thread=Glib::Thread::create( + sigc::mem_fun(*this,&AsyncRenderer::render_target), #if REJOIN_ON_STOP - true + true #else - false + false #endif - ); - assert(render_thread); + ); + assert(render_thread); + } } else {