Remove .gitignore do nothing is ignored.
[synfig.git] / synfig-studio / trunk / src / gtkmm / asyncrenderer.cpp
index 66e78c5..72a286c 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
@@ -53,6 +54,8 @@
 #include <synfig/general.h>
 #include <ETL/clock>
 
+#include "general.h"
+
 #endif
 
 /* === U S I N G =========================================================== */
@@ -123,8 +126,7 @@ public:
        }
        void set_dead()
        {
-               Glib::Mutex::Lock lock(mutex, NotLock);
-               if (!single_threaded()) lock.acquire();
+               Glib::Mutex::Lock lock(mutex);
                alive_flag=false;
        }
 
@@ -160,8 +162,7 @@ public:
                assert(surface);
                if(!alive_flag)
                        return false;
-               Glib::Mutex::Lock lock(mutex, NotLock);
-               if (!single_threaded()) lock.acquire();
+               Glib::Mutex::Lock lock(mutex);
                tile_queue.push_back(tile_t(surface,gx,gy));
                if(tile_queue.size()==1)
                {
@@ -183,8 +184,7 @@ public:
 
        void tile_ready()
        {
-               Glib::Mutex::Lock lock(mutex, NotLock);
-               if (!single_threaded()) lock.acquire();
+               Glib::Mutex::Lock lock(mutex);
                if(!alive_flag)
                {
                        tile_queue.clear();
@@ -195,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();
@@ -204,8 +211,10 @@ public:
 
        virtual void end_frame()
        {
+#ifdef SINGLE_THREADED
                if (!single_threaded())
                {
+#endif
                        while(alive_flag)
                        {
                                Glib::Mutex::Lock lock(mutex);
@@ -217,9 +226,10 @@ public:
                                else
                                        break;
                        }
+#ifdef SINGLE_THREADED
                }
-               Glib::Mutex::Lock lock(mutex, NotLock);
-               if (!single_threaded()) lock.acquire();
+#endif
+               Glib::Mutex::Lock lock(mutex);
                if(!alive_flag)
                        return;
                return warm_target->end_frame();
@@ -279,8 +289,7 @@ public:
 
        void set_dead()
        {
-               Glib::Mutex::Lock lock(mutex, NotLock);
-               if (!single_threaded()) lock.acquire();
+               Glib::Mutex::Lock lock(mutex);
                alive_flag=false;
        }
 
@@ -292,8 +301,7 @@ public:
        virtual void end_frame()
        {
                {
-                       Glib::Mutex::Lock lock(mutex, NotLock);
-                       if (!single_threaded()) lock.acquire();
+                       Glib::Mutex::Lock lock(mutex);
 
                        if(!alive_flag)
                                return;
@@ -312,7 +320,11 @@ public:
 #endif
                }
 
-               if (!single_threaded())
+#ifdef SINGLE_THREADED
+               if (single_threaded())
+                       signal_progress()();
+               else
+#endif
                        while(alive_flag && !ready_next)
                        {
                                Glib::Mutex::Lock lock(mutex);
@@ -324,8 +336,7 @@ public:
 
        virtual Color * start_scanline(int scanline)
        {
-               Glib::Mutex::Lock lock(mutex, NotLock);
-               if (!single_threaded()) lock.acquire();
+               Glib::Mutex::Lock lock(mutex);
 
                return surface[scanline];
        }
@@ -337,11 +348,13 @@ public:
 
        void frame_ready()
        {
-               Glib::Mutex::Lock lock(mutex, NotLock);
-               if (!single_threaded()) lock.acquire();
+               Glib::Mutex::Lock lock(mutex);
                if(alive_flag)
                        alive_flag=warm_target->add_frame(&surface);
-               if (!single_threaded()) cond_frame_queue_empty.signal();
+#ifdef SINGLE_THREADED
+               if (!single_threaded())
+#endif
+                       cond_frame_queue_empty.signal();
                ready_next=true;
        }
 };
@@ -355,8 +368,10 @@ public:
 AsyncRenderer::AsyncRenderer(etl::handle<synfig::Target> target_,synfig::ProgressCallback *cb):
        error(false),
        success(false),
-       cb(cb),
-       updating(false)
+       cb(cb)
+#ifdef SINGLE_THREADED
+       , updating(false)
+#endif
 {
        render_thread=0;
        if(etl::handle<synfig::Target_Tile>::cast_dynamic(target_))
@@ -393,8 +408,7 @@ AsyncRenderer::stop()
 {
        if(target)
        {
-               Glib::Mutex::Lock lock(mutex, NotLock);
-               if (!single_threaded()) lock.acquire();
+               Glib::Mutex::Lock lock(mutex);
                done_connection.disconnect();
 
                if(render_thread)
@@ -402,7 +416,10 @@ AsyncRenderer::stop()
                        signal_stop_();
 
 #if REJOIN_ON_STOP
-                       if (!single_threaded()) render_thread->join();
+#ifdef SINGLE_THREADED
+                       if (!single_threaded())
+#endif
+                               render_thread->join();
 #endif
 
                        // Make sure all the dispatch crap is cleared out
@@ -441,6 +458,7 @@ AsyncRenderer::start()
        );
 }
 
+#ifdef SINGLE_THREADED
 void
 AsyncRenderer::rendering_progress()
 {
@@ -448,6 +466,7 @@ AsyncRenderer::rendering_progress()
        while(studio::App::events_pending()) studio::App::iteration(false);
        updating = false;
 }
+#endif
 
 void
 AsyncRenderer::start_()
@@ -459,6 +478,7 @@ AsyncRenderer::start_()
                done_connection=signal_done_.connect(mem_fun(*this,&AsyncRenderer::stop));
 #endif
 
+#ifdef SINGLE_THREADED
                if (single_threaded())
                {
                        synfig::info("%s:%d rendering in the same thread", __FILE__, __LINE__);
@@ -467,6 +487,7 @@ AsyncRenderer::start_()
                        render_target();
                }
                else
+#endif
                {
                        render_thread=Glib::Thread::create(
                                sigc::mem_fun(*this,&AsyncRenderer::render_target),
@@ -502,7 +523,7 @@ AsyncRenderer::render_target()
 #endif
        }
 
-       if (single_threaded() || mutex.trylock())
+       if(mutex.trylock())
        {
 #ifdef GLIB_DISPATCHER_BROKEN
                done_connection=Glib::signal_timeout().connect(
@@ -515,6 +536,6 @@ AsyncRenderer::render_target()
 #else
                signal_done_.emit();
 #endif
-               if (!single_threaded()) mutex.unlock();
+               mutex.unlock();
        }
 }