// CLASS HEADER
#include "renderer-factory-cache.h"
-// Internal HEADER
+// EXTERNAL HEADER
+#include <dali/devel-api/common/hash.h>
+
+// INTERNAL HEADER
#include <dali-toolkit/internal/controls/renderers/color/color-renderer.h>
namespace Dali
RendererFactoryCache::~RendererFactoryCache()
{
- for( int i=0; i<= SHADER_TYPE_MAX; i++)
- {
- if(mShader[i])
- {
- mShader[i].Reset();
- }
- }
-
- for( int i=0; i<= GEOMETRY_TYPE_MAX; i++)
- {
- if(mGeometry[i])
- {
- mGeometry[i].Reset();
- }
- }
}
-
Geometry RendererFactoryCache::GetGeometry( GeometryType type )
{
return mGeometry[type];
mShader[type] = shader;
}
+int RendererFactoryCache::FindRenderer( const std::string& key ) const
+{
+ int hash = Dali::CalculateHash( key );
+
+ HashVector::Iterator startIt = mRendererHashes.Begin();
+ HashVector::Iterator it;
+
+ for(;;)
+ {
+ it = std::find( startIt, mRendererHashes.End(), hash );
+ if( it != mRendererHashes.End() )
+ {
+ int index = it - mRendererHashes.Begin();
+ const CachedRendererPtr& cachedRenderer = mRenderers[ index ];
+
+ if( cachedRenderer && cachedRenderer->mKey == key )
+ {
+ return index;
+ }
+ }
+ else
+ {
+ break;
+ }
+ startIt = it + 1;
+ }
+
+ return -1;
+}
+
+RendererFactoryCache::CachedRendererPtr RendererFactoryCache::GetRenderer( const std::string& key ) const
+{
+ int index = FindRenderer( key );
+ if( index != -1 )
+ {
+ return mRenderers[ index ];
+ }
+ else
+ {
+ return CachedRendererPtr();
+ }
+}
+
+RendererFactoryCache::CachedRendererPtr RendererFactoryCache::SaveRenderer( const std::string& key, Renderer& renderer )
+{
+ int hash = Dali::CalculateHash( key );
+ CachedRendererPtr newCachedRenderer = new CachedRenderer( key, renderer );
+
+ CachedRenderers::iterator it = std::find(mRenderers.begin(), mRenderers.end(), CachedRendererPtr() );
+ if( it != mRenderers.end() )
+ {
+ *it = newCachedRenderer;
+ int index = it - mRenderers.begin();
+ mRendererHashes[ index ] = hash;
+ }
+ else
+ {
+ mRendererHashes.PushBack( hash );
+ mRenderers.push_back( newCachedRenderer );
+ }
+
+ return newCachedRenderer;
+}
+
+void RendererFactoryCache::RemoveRenderer( const std::string& key )
+{
+ int index = FindRenderer( key );
+ if( index != -1 )
+ {
+ mRendererHashes[ index ] = Dali::CalculateHash( "" );
+ mRenderers[ index ].Reset();
+ }
+}
+
Geometry RendererFactoryCache::CreateQuadGeometry()
{
const float halfWidth = 0.5f;