X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fvisuals%2Fvisual-factory-cache.cpp;h=ad5bcb35860dfc8e26d544baa78df9df8c28d87e;hp=248270b454cfe37f6b07a55e80206a01e657b736;hb=bb764a75b719ea839f4c255ab015b8fa54fd8039;hpb=27833bb592e5b8a271f12754dee5f1836becab51 diff --git a/dali-toolkit/internal/visuals/visual-factory-cache.cpp b/dali-toolkit/internal/visuals/visual-factory-cache.cpp index 248270b..ad5bcb3 100644 --- a/dali-toolkit/internal/visuals/visual-factory-cache.cpp +++ b/dali-toolkit/internal/visuals/visual-factory-cache.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 Samsung Electronics Co., Ltd. + * Copyright (c) 2020 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,19 +17,15 @@ // CLASS HEADER #include "visual-factory-cache.h" -// EXTERNAL HEADER +// EXTERNAL INCLUDES #include -#include +#include -// INTERNAL HEADER +// INTERNAL INCLUDES #include #include #include - -namespace -{ -const char * const BROKEN_VISUAL_IMAGE_URL( DALI_IMAGE_DIR "broken.png"); -} +#include namespace Dali { @@ -40,8 +36,11 @@ namespace Toolkit namespace Internal { -VisualFactoryCache::VisualFactoryCache() -: mSvgRasterizeThread( NULL ) +VisualFactoryCache::VisualFactoryCache( bool preMultiplyOnLoad ) +: mSvgRasterizeThread( NULL ), + mVectorAnimationManager(), + mBrokenImageUrl(""), + mPreMultiplyOnLoad( preMultiplyOnLoad ) { } @@ -52,6 +51,11 @@ VisualFactoryCache::~VisualFactoryCache() Geometry VisualFactoryCache::GetGeometry( GeometryType type ) { + if( !mGeometry[type] && type == QUAD_GEOMETRY ) + { + mGeometry[type] = CreateQuadGeometry(); + } + return mGeometry[type]; } @@ -70,96 +74,6 @@ void VisualFactoryCache::SaveShader( ShaderType type, Shader shader ) mShader[type] = shader; } -int VisualFactoryCache::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 VisualFactoryCache::GetRenderer( const std::string& key ) const -{ - int index = FindRenderer( key ); - if( index != -1 ) - { - return mRenderers[ index ]->mRenderer.GetHandle(); - } - else - { - return Renderer(); - } -} - -void VisualFactoryCache::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 VisualFactoryCache::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 VisualFactoryCache::CacheWireframeRenderer( Renderer& renderer ) -{ - mWireframeRenderer = renderer; -} - -Renderer VisualFactoryCache::GetWireframeRenderer() -{ - return mWireframeRenderer; -} - Geometry VisualFactoryCache::CreateQuadGeometry() { const float halfWidth = 0.5f; @@ -175,7 +89,7 @@ Geometry VisualFactoryCache::CreateQuadGeometry() Property::Map quadVertexFormat; quadVertexFormat["aPosition"] = Property::VECTOR2; - PropertyBuffer quadVertices = PropertyBuffer::New( quadVertexFormat ); + VertexBuffer quadVertices = VertexBuffer::New( quadVertexFormat ); quadVertices.SetData( quadVertexData, 4 ); // Create the geometry object @@ -191,12 +105,22 @@ ImageAtlasManagerPtr VisualFactoryCache::GetAtlasManager() if( !mAtlasManager ) { mAtlasManager = new ImageAtlasManager(); - mAtlasManager->SetBrokenImage( BROKEN_VISUAL_IMAGE_URL ); + mAtlasManager->SetBrokenImage( mBrokenImageUrl ); } return mAtlasManager; } +TextureManager& VisualFactoryCache::GetTextureManager() +{ + return mTextureManager; +} + +NPatchLoader& VisualFactoryCache::GetNPatchLoader() +{ + return mNPatchLoader; +} + SvgRasterizeThread* VisualFactoryCache::GetSVGRasterizationThread() { if( !mSvgRasterizeThread ) @@ -207,11 +131,24 @@ SvgRasterizeThread* VisualFactoryCache::GetSVGRasterizationThread() return mSvgRasterizeThread; } +VectorAnimationManager& VisualFactoryCache::GetVectorAnimationManager() +{ + if( !mVectorAnimationManager ) + { + mVectorAnimationManager = std::unique_ptr< VectorAnimationManager >( new VectorAnimationManager() ); + } + return *mVectorAnimationManager; +} + void VisualFactoryCache::ApplyRasterizedSVGToSampler() { while( RasterizingTaskPtr task = mSvgRasterizeThread->NextCompletedTask() ) { - task->GetSvgVisual()->ApplyRasterizedImage( task->GetPixelData() ); +#ifdef NO_THORVG + task->GetSvgVisual()->ApplyRasterizedImage( task->GetParsedImage(), task->GetPixelData() ); +#else /* NO_THORVG */ + task->GetSvgVisual()->ApplyRasterizedImage( task->GetVectorRenderer(), task->GetPixelData(), task->IsLoaded() ); +#endif /* NO_THORVG */ } } @@ -260,20 +197,20 @@ Geometry VisualFactoryCache::CreateGridGeometry( Uint16Pair gridSize ) Property::Map vertexFormat; vertexFormat[ "aPosition" ] = Property::VECTOR2; - PropertyBuffer vertexPropertyBuffer = PropertyBuffer::New( vertexFormat ); + VertexBuffer vertexBuffer = VertexBuffer::New( vertexFormat ); if( vertices.Size() > 0 ) { - vertexPropertyBuffer.SetData( &vertices[ 0 ], vertices.Size() ); + vertexBuffer.SetData( &vertices[ 0 ], vertices.Size() ); } Property::Map indexFormat; indexFormat[ "indices" ] = Property::INTEGER; - PropertyBuffer indexPropertyBuffer = PropertyBuffer::New( indexFormat ); + VertexBuffer indexVertexBuffer = VertexBuffer::New( indexFormat ); // Create the geometry object Geometry geometry = Geometry::New(); - geometry.AddVertexBuffer( vertexPropertyBuffer ); + geometry.AddVertexBuffer( vertexBuffer ); if( indices.Size() > 0 ) { geometry.SetIndexBuffer( &indices[ 0 ], indices.Size() ); @@ -284,52 +221,44 @@ Geometry VisualFactoryCache::CreateGridGeometry( Uint16Pair gridSize ) return geometry; } -Geometry VisualFactoryCache::CreateBatchQuadGeometry( Vector4 texCoords ) +Texture VisualFactoryCache::GetBrokenVisualImage() { - const float halfWidth = 0.5f; - const float halfHeight = 0.5f; - struct QuadVertex { - QuadVertex( const Vector2& vertexPosition, const Vector2& vertexTexCoords ) - : position( vertexPosition ), - texCoords( vertexTexCoords ) - {} - Vector2 position; - Vector2 texCoords; - }; - - // special case, when texture takes whole space - if( texCoords == Vector4::ZERO ) + if(!mBrokenImageTexture && mBrokenImageUrl.size()) { - texCoords = Vector4(0.0f, 0.0f, 1.0f, 1.0f); + PixelData data; + Devel::PixelBuffer pixelBuffer = LoadImageFromFile( mBrokenImageUrl ); + if( pixelBuffer ) + { + data = Devel::PixelBuffer::Convert(pixelBuffer); // takes ownership of buffer + mBrokenImageTexture = Texture::New( Dali::TextureType::TEXTURE_2D, data.GetPixelFormat(), + data.GetWidth(), data.GetHeight() ); + mBrokenImageTexture.Upload( data ); + } } + return mBrokenImageTexture; +} - QuadVertex quadVertexData[6] = - { - QuadVertex( Vector2(-halfWidth, -halfHeight ), Vector2(texCoords.x, texCoords.y) ), - QuadVertex( Vector2( halfWidth, -halfHeight ), Vector2(texCoords.z, texCoords.y) ), - QuadVertex( Vector2(-halfWidth, halfHeight ), Vector2(texCoords.x, texCoords.w) ), - QuadVertex( Vector2( halfWidth, -halfHeight ), Vector2(texCoords.z, texCoords.y) ), - QuadVertex( Vector2(-halfWidth, halfHeight ), Vector2(texCoords.x, texCoords.w) ), - QuadVertex( Vector2( halfWidth, halfHeight ), Vector2(texCoords.z, texCoords.w) ), - }; - - Property::Map vertexFormat; - vertexFormat[ "aPosition" ] = Property::VECTOR2; - vertexFormat[ "aTexCoord" ] = Property::VECTOR2; - PropertyBuffer vertexBuffer = PropertyBuffer::New( vertexFormat ); - vertexBuffer.SetData( quadVertexData, 6 ); - - // create geometry as normal, single quad - Geometry geometry = Geometry::New(); - geometry.AddVertexBuffer( vertexBuffer ); - geometry.SetType( Geometry::TRIANGLES ); +void VisualFactoryCache::SetPreMultiplyOnLoad( bool preMultiply ) +{ + mPreMultiplyOnLoad = preMultiply; +} - return geometry; +bool VisualFactoryCache::GetPreMultiplyOnLoad() +{ + return mPreMultiplyOnLoad; } -Image VisualFactoryCache::GetBrokenVisualImage() +void VisualFactoryCache::SetBrokenImageUrl(const std::string& brokenImageUrl) { - return ResourceImage::New( BROKEN_VISUAL_IMAGE_URL ); + mBrokenImageUrl = brokenImageUrl; + + if( !mAtlasManager ) + { + mAtlasManager = new ImageAtlasManager(); + } + + mAtlasManager->SetBrokenImage( mBrokenImageUrl ); + mTextureManager.SetBrokenImageUrl( mBrokenImageUrl ); } } // namespace Internal @@ -337,4 +266,3 @@ Image VisualFactoryCache::GetBrokenVisualImage() } // namespace Toolkit } // namespace Dali -