};
std::string mCachedRendererKey; ///< The key to use for caching of the renderer. If it is empty then no caching will occur
- RendererFactoryCache::CachedRendererPtr mCachedRenderer; ///< The current cached renderer from the Factory Cache. mCachedRenderer == null whilst this control render is offstage
Renderer mRenderer;
CustomShader* mCustomShader;
}
else
{
- //remove the cached renderer from the cache if we and the cache are the only things that hold a reference to it
- if( mImpl->mCachedRenderer && mImpl->mCachedRenderer->ReferenceCount() == 2 )
- {
- mFactoryCache.RemoveRenderer( mImpl->mCachedRenderer->mKey );
- }
- mImpl->mCachedRenderer.Reset();
+ //clean the renderer from the cache since it may no longer be in use
+ mFactoryCache.CleanRendererCache( mImpl->mCachedRendererKey );
//add the new renderer
mImpl->mCachedRendererKey = cachedRendererKey;
if( !mImpl->mCachedRendererKey.empty() && !mImpl->mCustomShader )
{
DALI_ASSERT_DEBUG( mImpl->mRenderer && "The control render is on stage but it doesn't have a valid renderer.");
- mImpl->mCachedRenderer = mFactoryCache.SaveRenderer( mImpl->mCachedRendererKey, mImpl->mRenderer );
+ mFactoryCache.SaveRenderer( mImpl->mCachedRendererKey, mImpl->mRenderer );
}
}
}
{
if( !mImpl->mCachedRendererKey.empty() && !mImpl->mCustomShader )
{
- mImpl->mCachedRenderer = mFactoryCache.GetRenderer( mImpl->mCachedRendererKey );
- if( !mImpl->mCachedRenderer || !mImpl->mCachedRenderer->mRenderer )
+ mImpl->mRenderer = mFactoryCache.GetRenderer( mImpl->mCachedRendererKey );
+ if( !mImpl->mRenderer )
{
InitializeRenderer( mImpl->mRenderer );
- mImpl->mCachedRenderer = mFactoryCache.SaveRenderer( mImpl->mCachedRendererKey, mImpl->mRenderer );
- }
-
- if( mImpl->mCachedRenderer && mImpl->mCachedRenderer->mRenderer )
- {
- mImpl->mRenderer = mImpl->mCachedRenderer->mRenderer;
+ mFactoryCache.SaveRenderer( mImpl->mCachedRendererKey, mImpl->mRenderer );
}
}
if( mImpl->mIsOnStage )
{
DoSetOffStage( actor );
-
- //remove the cached renderer from the cache if we and the cache are the only things that hold a reference to it
- if( mImpl->mCachedRenderer && mImpl->mCachedRenderer->ReferenceCount() == 2 )
- {
- mFactoryCache.RemoveRenderer( mImpl->mCachedRenderer->mKey );
- }
- mImpl->mCachedRenderer.Reset();
-
actor.RemoveRenderer( mImpl->mRenderer );
mImpl->mRenderer.Reset();
+ //clean the renderer from the cache since it may no longer be in use
+ mFactoryCache.CleanRendererCache( mImpl->mCachedRendererKey );
+
mImpl->mIsOnStage = false;
}
}
if( it != mRendererHashes.End() )
{
int index = it - mRendererHashes.Begin();
- const CachedRendererPtr& cachedRenderer = mRenderers[ index ];
+ const CachedRenderer* cachedRenderer = mRenderers[ index ];
if( cachedRenderer && cachedRenderer->mKey == key )
{
return -1;
}
-RendererFactoryCache::CachedRendererPtr RendererFactoryCache::GetRenderer( const std::string& key ) const
+Renderer RendererFactoryCache::GetRenderer( const std::string& key ) const
{
int index = FindRenderer( key );
if( index != -1 )
{
- return mRenderers[ index ];
+ return mRenderers[ index ]->mRenderer.GetHandle();
}
else
{
- return CachedRendererPtr();
+ return Renderer();
}
}
-RendererFactoryCache::CachedRendererPtr RendererFactoryCache::SaveRenderer( const std::string& key, Renderer& renderer )
+void RendererFactoryCache::SaveRenderer( const std::string& key, Renderer& renderer )
{
int hash = Dali::CalculateHash( key );
- CachedRendererPtr newCachedRenderer = new CachedRenderer( key, renderer );
+ const CachedRenderer* cachedRenderer = new CachedRenderer( key, renderer );
- CachedRenderers::iterator it = std::find(mRenderers.begin(), mRenderers.end(), CachedRendererPtr() );
- if( it != mRenderers.end() )
+ CachedRenderers::Iterator it = std::find( mRenderers.Begin(), mRenderers.End(), static_cast< CachedRenderer* >( NULL ) );
+ if( it != mRenderers.End() )
{
- *it = newCachedRenderer;
- int index = it - mRenderers.begin();
+ *it = cachedRenderer;
+ int index = it - mRenderers.Begin();
mRendererHashes[ index ] = hash;
}
else
{
mRendererHashes.PushBack( hash );
- mRenderers.push_back( newCachedRenderer );
+ mRenderers.PushBack( cachedRenderer );
}
-
- return newCachedRenderer;
}
-void RendererFactoryCache::RemoveRenderer( const std::string& key )
+void RendererFactoryCache::CleanRendererCache( const std::string& key )
{
int index = FindRenderer( key );
if( index != -1 )
{
- mRendererHashes[ index ] = Dali::CalculateHash( "" );
- mRenderers[ index ].Reset();
+ const CachedRenderer*& cachedRenderer = mRenderers[ index ];
+ if( !cachedRenderer->mRenderer.GetHandle() )
+ {
+ mRendererHashes[ index ] = Dali::INITIAL_HASH_VALUE;
+
+ delete cachedRenderer;
+ cachedRenderer = NULL;
+ }
}
}
#include <dali/devel-api/rendering/geometry.h>
#include <dali/devel-api/rendering/shader.h>
#include <dali/devel-api/rendering/renderer.h>
+#include <dali/devel-api/common/owner-container.h>
+#include <dali/devel-api/object/weak-handle.h>
+
namespace Dali
{
static Geometry CreateQuadGeometry();
public:
- struct CachedRenderer : RefObject
- {
- std::string mKey;
- Renderer mRenderer;
-
- CachedRenderer( const std::string& key, const Renderer& renderer )
- : mKey( key ),
- mRenderer( renderer )
- {}
- };
-
- typedef IntrusivePtr< CachedRenderer > CachedRendererPtr;
/**
* @brief Request renderer from the url
*
- * @return The cached renderer if exist in the cache. Otherwise null is returned.
+ * @return The cached renderer if exist in the cache. Otherwise an empty handle is returned.
*/
- CachedRendererPtr GetRenderer( const std::string& key ) const;
+ Renderer GetRenderer( const std::string& key ) const;
/**
* @brief Cache the renderer based on the given key.
*
* @param[in] key The key to use for caching
* @param[in] renderer The Renderer to be cached
- *
- * @return The cached renderer stored in the cache
*/
- CachedRendererPtr SaveRenderer( const std::string& key, Renderer& renderer );
+ void SaveRenderer( const std::string& key, Renderer& renderer );
/**
- * @brief Removes the renderer from the cache based on the given key
+ * @brief Cleans the renderer cache by removing the renderer from the cache based on the given key if there are no longer any references to it
*
* @param[in] key The key used for caching
*/
- void RemoveRenderer( const std::string& key );
+ void CleanRendererCache( const std::string& key );
protected:
RendererFactoryCache& operator=(const RendererFactoryCache& rhs);
private:
+ struct CachedRenderer
+ {
+ std::string mKey;
+ WeakHandle< Renderer > mRenderer;
+
+ CachedRenderer( const std::string& key, Renderer& renderer )
+ : mKey( key ),
+ mRenderer( renderer)
+ {}
+ };
+
typedef Dali::Vector< std::size_t > HashVector;
- typedef std::vector< CachedRendererPtr > CachedRenderers;
+ typedef Dali::OwnerContainer< const CachedRenderer* > CachedRenderers;
/**
* @brief Finds the first index into the cached renderers from the url