OSDLRenderer.cc

Go to the documentation of this file.
00001 #include "OSDLRenderer.h"
00002 
00003 #include "OSDLScheduler.h"    // for GetExistingScheduler
00004 
00005 
00006 using namespace Ceylan::Log ;
00007 
00008 using namespace OSDL::Events ;
00009 using namespace OSDL::Rendering ;
00010 using namespace OSDL::Engine ;
00011 
00012 using std::string ;
00013 
00014 
00015 #ifdef OSDL_USES_CONFIG_H
00016 #include <OSDLConfig.h>       // for OSDL_DEBUG_RENDERER and al 
00017 #endif // OSDL_USES_CONFIG_H
00018 
00019 
00020 #if OSDL_DEBUG_RENDERER
00021 
00022 #define OSDL_RENDER_LOG(message) send( message ) ;
00023 
00024 #else // OSDL_DEBUG_RENDERER
00025 
00026 #define OSDL_RENDER_LOG(message)
00027 
00028 #endif // OSDL_DEBUG_RENDERER
00029 
00030 
00031 Renderer * Renderer::_internalRootRenderer = 0 ;
00032 
00033 
00034 RenderingException::RenderingException( const std::string & reason ) throw() :
00035     OSDL::Exception( "RenderingException : " + reason )
00036 {
00037 
00038 }
00039 
00040 
00041 RenderingException::~RenderingException() throw()
00042 {
00043 
00044 }
00045 
00046 
00047 
00048 Renderer::Renderer( bool registerToScheduler ) throw( RenderingException ) :
00049     Object(),
00050     _renderingDone( 0 ),
00051     _renderingSkipped( 0 ),
00052     _lastRender( 0 )
00053 {
00054 
00055     if ( registerToScheduler )
00056     {
00057         try
00058         {
00059             Scheduler::GetExistingScheduler().setRenderer( * this ) ;
00060         }
00061         catch( const RenderingException & e )
00062         {
00063             throw RenderingException( 
00064                 "Renderer constructor : no already existing scheduler ("
00065                 + e.toString() + ") whereas registering had been requested." ) ;
00066         } 
00067     }
00068     
00069 }
00070 
00071 
00072 Renderer::~Renderer() throw()
00073 {
00074 
00075     // Views are not owned.
00076     
00077 }
00078 
00079 
00080 void Renderer::render( Events::RenderingTick currentRenderingTick ) throw()
00081 {
00082 
00083     OSDL_RENDER_LOG( "Rendering ! " ) ;
00084     
00085     /*
00086      * Beware, currentRenderingTick might be always zero if no scheduler 
00087      * is used.
00088      *
00089      */
00090     _renderingDone++ ;
00091     
00092 }
00093 
00094 
00095 void Renderer::onRenderingSkipped( RenderingTick skippedRenderingTick ) throw()
00096 {
00097 
00098     OSDL_RENDER_LOG( "Rendering skipped." ) ;
00099     _renderingSkipped++ ;
00100     
00101 }
00102 
00103 
00104 const string Renderer::toString( Ceylan::VerbosityLevels level ) const throw() 
00105 {
00106 
00107     string res = "Basic renderer, last rendering tick was " 
00108         + Ceylan::toString( _lastRender )
00109         + ", having performed " 
00110         + Ceylan::toString( _renderingDone )    + " rendering(s) for "
00111         + Ceylan::toString( _renderingSkipped ) + " skip(s)" ;
00112     
00113     if ( _renderingDone + _renderingSkipped != 0 )
00114         res += " (rendering proportion : " 
00115             + Ceylan::toString( 100 * _renderingDone / ( _renderingDone 
00116                 + _renderingSkipped ) ) + "%)" ;
00117             
00118     return res ;
00119     
00120 }
00121 
00122 
00123 bool Renderer::HasExistingRootRenderer() throw()
00124 {
00125 
00126     return ( _internalRootRenderer != 0 ) ;
00127     
00128 }
00129 
00130 
00131 Renderer & Renderer::GetExistingRootRenderer() throw( RenderingException )
00132 {
00133 
00134     if ( Renderer::_internalRootRenderer == 0 )
00135         throw RenderingException( 
00136             "Renderer::GetExistingRenderer : no Renderer available." ) ;
00137     return * Renderer::_internalRootRenderer ;
00138 
00139 }
00140 
00141 
00142 void Renderer::DeleteExistingRootRenderer() throw( RenderingException )
00143 {
00144 
00145     if ( Renderer::_internalRootRenderer != 0 )
00146         throw RenderingException( "Renderer::DeleteExistingRenderer : "
00147             "there was no already existing Renderer." ) ;
00148             
00149     LogPlug::debug( "Renderer::DeleteExistingRenderer : effective deleting." ) ;
00150 
00151     delete Renderer::_internalRootRenderer ;
00152     Renderer::_internalRootRenderer = 0 ;
00153 
00154 }
00155 
00156 
00157 void Renderer::DeleteRootRenderer() throw()
00158 {
00159 
00160     if ( Renderer::_internalRootRenderer != 0 )
00161     {
00162     
00163         LogPlug::debug( "Renderer::DeleteRenderer : effective deleting." ) ;
00164 
00165         delete Renderer::_internalRootRenderer ;
00166         Renderer::_internalRootRenderer = 0 ;
00167         
00168     }
00169     else
00170     {
00171     
00172         LogPlug::debug( "Renderer::DeleteRenderer : no deleting needed." ) ;
00173         
00174     }
00175 
00176 }
00177 

Generated on Fri Mar 30 14:46:59 2007 for OSDL by  doxygen 1.5.1