Added my "Copyright (c) 2007" notices, for files I edited in 2007.
[synfig.git] / synfig-studio / trunk / src / gtkmm / asyncrenderer.cpp
index 745409c..ca7de13 100644 (file)
@@ -6,6 +6,7 @@
 **
 **     \legal
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+**     Copyright (c) 2007 Chris Moore
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
@@ -30,6 +31,7 @@
 #endif
 
 #include "asyncrenderer.h"
+#include "app.h"
 #include <glibmm/thread.h>
 #include <glibmm/dispatcher.h>
 
@@ -52,6 +54,8 @@
 #include <synfig/general.h>
 #include <ETL/clock>
 
+#include "general.h"
+
 #endif
 
 /* === U S I N G =========================================================== */
@@ -191,6 +195,13 @@ public:
                {
                        tile_t& tile(tile_queue.front());
 
+                       if (getenv("SYNFIG_SHOW_TILE_OUTLINES"))
+                       {
+                               Color red(1,0,0);
+                               tile.surface.fill(red, 0, 0, 1, tile.surface.get_h());
+                               tile.surface.fill(red, 0, 0, tile.surface.get_w(), 1);
+                       }
+
                        alive_flag=warm_target->add_tile(tile.surface,tile.x,tile.y);
 
                        tile_queue.pop_front();
@@ -200,16 +211,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)
@@ -275,7 +289,7 @@ public:
                alive_flag=false;
        }
 
-       virtual bool start_frame(synfig::ProgressCallback *cb=0)
+       virtual bool start_frame(synfig::ProgressCallback */*cb*/=0)
        {
                return alive_flag;
        }
@@ -300,14 +314,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 +345,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 +359,8 @@ public:
 AsyncRenderer::AsyncRenderer(etl::handle<synfig::Target> target_,synfig::ProgressCallback *cb):
        error(false),
        success(false),
-       cb(cb)
+       cb(cb),
+       updating(false)
 {
        render_thread=0;
        if(etl::handle<synfig::Target_Tile>::cast_dynamic(target_))
@@ -387,7 +405,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 +445,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 +462,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
        {