X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Frenderers%2Frenderer-factory-cache.cpp;h=524137a3abb353b5bd0216883a24bd26c0f2f909;hb=f3c7e52f300fc2f6d07bcbd75ad3b992e19083f5;hp=cf8c47a6f2dfb1a2508a5d24d1c12b25c869a061;hpb=389ff4cd5d493e8eb284ec716545ddaa8b7b8f7b;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/controls/renderers/renderer-factory-cache.cpp b/dali-toolkit/internal/controls/renderers/renderer-factory-cache.cpp index cf8c47a..524137a 100644 --- a/dali-toolkit/internal/controls/renderers/renderer-factory-cache.cpp +++ b/dali-toolkit/internal/controls/renderers/renderer-factory-cache.cpp @@ -17,7 +17,10 @@ // CLASS HEADER #include "renderer-factory-cache.h" -// Internal HEADER +// EXTERNAL HEADER +#include + +// INTERNAL HEADER #include namespace Dali @@ -35,24 +38,8 @@ RendererFactoryCache::RendererFactoryCache() 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]; @@ -73,6 +60,86 @@ void RendererFactoryCache::SaveShader( ShaderType type, Shader shader ) 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 CachedRenderer* cachedRenderer = mRenderers[ index ]; + + if( cachedRenderer && cachedRenderer->mKey == key ) + { + return index; + } + } + else + { + break; + } + startIt = it + 1; + } + + return -1; +} + +Renderer RendererFactoryCache::GetRenderer( const std::string& key ) const +{ + int index = FindRenderer( key ); + if( index != -1 ) + { + return mRenderers[ index ]->mRenderer.GetHandle(); + } + else + { + return Renderer(); + } +} + +void RendererFactoryCache::SaveRenderer( const std::string& key, Renderer& renderer ) +{ + int hash = Dali::CalculateHash( key ); + const CachedRenderer* cachedRenderer = new CachedRenderer( key, renderer ); + + CachedRenderers::Iterator it = std::find( mRenderers.Begin(), mRenderers.End(), static_cast< CachedRenderer* >( NULL ) ); + if( it != mRenderers.End() ) + { + *it = cachedRenderer; + int index = it - mRenderers.Begin(); + mRendererHashes[ index ] = hash; + } + else + { + mRendererHashes.PushBack( hash ); + mRenderers.PushBack( cachedRenderer ); + } +} + +bool RendererFactoryCache::CleanRendererCache( const std::string& key ) +{ + int index = FindRenderer( key ); + if( index != -1 ) + { + const CachedRenderer*& cachedRenderer = mRenderers[ index ]; + if( !cachedRenderer->mRenderer.GetHandle() ) + { + mRendererHashes[ index ] = Dali::INITIAL_HASH_VALUE; + + delete cachedRenderer; + cachedRenderer = NULL; + return true; + } + } + return false; +} + Geometry RendererFactoryCache::CreateQuadGeometry() { const float halfWidth = 0.5f; @@ -91,18 +158,10 @@ Geometry RendererFactoryCache::CreateQuadGeometry() PropertyBuffer quadVertices = PropertyBuffer::New( quadVertexFormat, 4 ); quadVertices.SetData(quadVertexData); - // Create indices - //TODO: replace with triangle strip when Geometry supports it - unsigned int indexData[6] = { 0, 3, 1, 0, 2, 3 }; - Property::Map indexFormat; - indexFormat["indices"] = Property::INTEGER; - PropertyBuffer indices = PropertyBuffer::New( indexFormat, 6 ); - indices.SetData(indexData); - // Create the geometry object Geometry geometry = Geometry::New(); geometry.AddVertexBuffer( quadVertices ); - geometry.SetIndexBuffer( indices ); + geometry.SetGeometryType( Geometry::TRIANGLE_STRIP ); return geometry; }