X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Frenderers%2Frenderer-factory-cache.cpp;h=ecfc6b5ca0b099956697d18b645562cbdd94274a;hb=bfdf7a73a4d50dfb60d0f7fa5b214f61c920bf9c;hp=cf8c47a6f2dfb1a2508a5d24d1c12b25c869a061;hpb=618c084142032296c60a188b9438d63a81a2d264;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..ecfc6b5 100644 --- a/dali-toolkit/internal/controls/renderers/renderer-factory-cache.cpp +++ b/dali-toolkit/internal/controls/renderers/renderer-factory-cache.cpp @@ -17,8 +17,12 @@ // CLASS HEADER #include "renderer-factory-cache.h" -// Internal HEADER +// EXTERNAL HEADER +#include + +// INTERNAL HEADER #include +#include namespace Dali { @@ -30,29 +34,15 @@ namespace Internal { RendererFactoryCache::RendererFactoryCache() +: mSvgRasterizeThread( NULL ) { } 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(); - } - } + SvgRasterizeThread::TerminateThread( mSvgRasterizeThread ); } - Geometry RendererFactoryCache::GetGeometry( GeometryType type ) { return mGeometry[type]; @@ -73,6 +63,96 @@ 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; +} + +void RendererFactoryCache::CacheDebugRenderer( Renderer& renderer ) +{ + mDebugRenderer = renderer; +} + +Renderer RendererFactoryCache::GetDebugRenderer() +{ + return mDebugRenderer; +} + Geometry RendererFactoryCache::CreateQuadGeometry() { const float halfWidth = 0.5f; @@ -88,25 +168,35 @@ Geometry RendererFactoryCache::CreateQuadGeometry() Property::Map quadVertexFormat; quadVertexFormat["aPosition"] = Property::VECTOR2; - 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); + PropertyBuffer quadVertices = PropertyBuffer::New( quadVertexFormat ); + quadVertices.SetData( quadVertexData, 4 ); // Create the geometry object Geometry geometry = Geometry::New(); geometry.AddVertexBuffer( quadVertices ); - geometry.SetIndexBuffer( indices ); + geometry.SetGeometryType( Geometry::TRIANGLE_STRIP ); return geometry; } +SvgRasterizeThread* RendererFactoryCache::GetSVGRasterizationThread() +{ + if( !mSvgRasterizeThread ) + { + mSvgRasterizeThread = new SvgRasterizeThread( new EventThreadCallback( MakeCallback( this, &RendererFactoryCache::ApplyRasterizedSVGToSampler ) ) ); + mSvgRasterizeThread->Start(); + } + return mSvgRasterizeThread; +} + +void RendererFactoryCache::ApplyRasterizedSVGToSampler() +{ + while( RasterizingTaskPtr task = mSvgRasterizeThread->NextCompletedTask() ) + { + task->GetSvgRenderer()->ApplyRasterizedImage( task->GetPixelData() ); + } +} + } // namespace Internal } // namespace Toolkit