X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Frenderers%2Frenderer-factory-cache.cpp;h=4fd7424beb9cd9c2b981d29f19fc64c81f67f2df;hb=526ca8a3ad82b0a08c0f0580284f28f0d647098d;hp=47fd771484dffa5e450b794c7ada94a3dc767a1e;hpb=959a76e8792179bc02979c66737b747ab931aff9;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 47fd771..4fd7424 100644 --- a/dali-toolkit/internal/controls/renderers/renderer-factory-cache.cpp +++ b/dali-toolkit/internal/controls/renderers/renderer-factory-cache.cpp @@ -22,6 +22,7 @@ // INTERNAL HEADER #include +#include namespace Dali { @@ -33,11 +34,13 @@ namespace Internal { RendererFactoryCache::RendererFactoryCache() +: mSvgRasterizeThread( NULL ) { } RendererFactoryCache::~RendererFactoryCache() { + SvgRasterizeThread::TerminateThread( mSvgRasterizeThread ); } Geometry RendererFactoryCache::GetGeometry( GeometryType type ) @@ -158,15 +161,15 @@ Geometry RendererFactoryCache::CreateQuadGeometry() QuadVertex quadVertexData[4] = { { Vector2(-halfWidth, -halfHeight) }, - { Vector2( halfWidth, -halfHeight) }, { Vector2(-halfWidth, halfHeight) }, + { Vector2( halfWidth, -halfHeight) }, { Vector2( halfWidth, halfHeight) } }; Property::Map quadVertexFormat; quadVertexFormat["aPosition"] = Property::VECTOR2; - PropertyBuffer quadVertices = PropertyBuffer::New( quadVertexFormat, 4 ); - quadVertices.SetData(quadVertexData); + PropertyBuffer quadVertices = PropertyBuffer::New( quadVertexFormat ); + quadVertices.SetData( quadVertexData, 4 ); // Create the geometry object Geometry geometry = Geometry::New(); @@ -176,6 +179,93 @@ Geometry RendererFactoryCache::CreateQuadGeometry() 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() ); + } +} + +Geometry RendererFactoryCache::CreateGridGeometry( Uint16Pair gridSize ) +{ + uint16_t gridWidth = gridSize.GetWidth(); + uint16_t gridHeight = gridSize.GetHeight(); + + // Create vertices + Vector< Vector2 > vertices; + vertices.Reserve( ( gridWidth + 1 ) * ( gridHeight + 1 ) ); + + for( int y = 0; y < gridHeight + 1; ++y ) + { + for( int x = 0; x < gridWidth + 1; ++x ) + { + vertices.PushBack( Vector2( (float)x/gridWidth - 0.5f, (float)y/gridHeight - 0.5f) ); + } + } + + // Create indices + Vector< unsigned short > indices; + indices.Reserve( (gridWidth+2)*gridHeight*2 - 2); + + for( unsigned int row = 0u; row < gridHeight; ++row ) + { + unsigned int rowStartIndex = row*(gridWidth+1u); + unsigned int nextRowStartIndex = rowStartIndex + gridWidth +1u; + + if( row != 0u ) // degenerate index on non-first row + { + indices.PushBack( rowStartIndex ); + } + + for( unsigned int column = 0u; column < gridWidth+1u; column++) // main strip + { + indices.PushBack( rowStartIndex + column); + indices.PushBack( nextRowStartIndex + column); + } + + if( row != gridHeight-1u ) // degenerate index on non-last row + { + indices.PushBack( nextRowStartIndex + gridWidth ); + } + } + + Property::Map vertexFormat; + vertexFormat[ "aPosition" ] = Property::VECTOR2; + PropertyBuffer vertexPropertyBuffer = PropertyBuffer::New( vertexFormat ); + if( vertices.Size() > 0 ) + { + vertexPropertyBuffer.SetData( &vertices[ 0 ], vertices.Size() ); + } + + Property::Map indexFormat; + indexFormat[ "indices" ] = Property::INTEGER; + PropertyBuffer indexPropertyBuffer = PropertyBuffer::New( indexFormat ); + + + // Create the geometry object + Geometry geometry = Geometry::New(); + geometry.AddVertexBuffer( vertexPropertyBuffer ); + if( indices.Size() > 0 ) + { + geometry.SetIndexBuffer( &indices[ 0 ], indices.Size() ); + } + + geometry.SetGeometryType( Geometry::TRIANGLE_STRIP ); + + return geometry; +} + } // namespace Internal } // namespace Toolkit