X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Frenderers%2Frenderer-factory-impl.cpp;h=6b2e22e74eab1d2a79f2e6032192c1bd8ba75ce8;hp=4e6bd386e7ba6123406f8d4234486361e0a242d0;hb=76dead7c21ac57622ca1a70c156efddc017059cf;hpb=a073ebfd862b49692c8e6d7dff2b128e62a4f6df diff --git a/dali-toolkit/internal/controls/renderers/renderer-factory-impl.cpp b/dali-toolkit/internal/controls/renderers/renderer-factory-impl.cpp index 4e6bd38..6b2e22e 100644 --- a/dali-toolkit/internal/controls/renderers/renderer-factory-impl.cpp +++ b/dali-toolkit/internal/controls/renderers/renderer-factory-impl.cpp @@ -31,6 +31,7 @@ #include #include #include +#include namespace { @@ -42,6 +43,8 @@ const char * const GRADIENT_RENDERER("gradientRenderer"); const char * const IMAGE_RENDERER("imageRenderer"); const char * const N_PATCH_RENDERER("nPatchRenderer"); +const std::string TEXTURE_UNIFORM_NAME = "sTexture"; + const char * const BROKEN_RENDERER_IMAGE_URL( DALI_IMAGE_DIR "broken.png"); } @@ -100,7 +103,8 @@ Toolkit::ControlRenderer RendererFactory::GetControlRenderer( const Property::Ma } else if( typeValue == IMAGE_RENDERER ) { - rendererPtr = new ImageRenderer( *( mFactoryCache.Get() ) ); + CreateAtlasManager(); + rendererPtr = new ImageRenderer( *( mFactoryCache.Get() ), *( mAtlasManager.Get() ) ); } else if( typeValue == N_PATCH_RENDERER ) { @@ -140,20 +144,22 @@ Toolkit::ControlRenderer RendererFactory::GetControlRenderer( const Vector4& col void RendererFactory::ResetRenderer( Toolkit::ControlRenderer& renderer, Actor& actor, const Vector4& color ) { - ColorRenderer* rendererPtr = dynamic_cast< ColorRenderer* >( &GetImplementation( renderer ) ); - if( rendererPtr ) - { - rendererPtr->SetColor( color ); - } - else + if( renderer ) { - renderer.RemoveAndReset( actor ); - renderer = GetControlRenderer( color ); - - if( actor.OnStage() ) + ColorRenderer* rendererPtr = dynamic_cast< ColorRenderer* >( &GetImplementation( renderer ) ); + if( rendererPtr ) { - renderer.SetOnStage( actor ); + rendererPtr->SetColor( color ); + return; } + + renderer.RemoveAndReset( actor ); + } + + renderer = GetControlRenderer( color ); + if( actor && actor.OnStage() ) + { + renderer.SetOnStage( actor ); } } @@ -193,7 +199,8 @@ Toolkit::ControlRenderer RendererFactory::GetControlRenderer( const Image& image } else { - ImageRenderer* rendererPtr = new ImageRenderer( *( mFactoryCache.Get() ) ); + CreateAtlasManager(); + ImageRenderer* rendererPtr = new ImageRenderer( *( mFactoryCache.Get() ), *( mAtlasManager.Get() ) ); Actor actor; rendererPtr->SetImage( actor, image ); @@ -205,6 +212,13 @@ void RendererFactory::ResetRenderer( Toolkit::ControlRenderer& renderer, Actor& { if( renderer ) { + if( ! image ) + { + // If the image is empty, then reset the renderer and return + renderer.RemoveAndReset( actor ); + return; + } + NinePatchImage npatchImage = NinePatchImage::DownCast( image ); if( npatchImage ) { @@ -224,17 +238,18 @@ void RendererFactory::ResetRenderer( Toolkit::ControlRenderer& renderer, Actor& return; } } + + renderer.RemoveAndReset( actor ); } - renderer.RemoveAndReset( actor ); renderer = GetControlRenderer( image ); - if( actor.OnStage() ) + if( actor && actor.OnStage() ) { renderer.SetOnStage( actor ); } } -Toolkit::ControlRenderer RendererFactory::GetControlRenderer( const std::string& url ) +Toolkit::ControlRenderer RendererFactory::GetControlRenderer( const std::string& url, ImageDimensions size ) { if( !mFactoryCache ) { @@ -250,19 +265,26 @@ Toolkit::ControlRenderer RendererFactory::GetControlRenderer( const std::string& } else { - ImageRenderer* rendererPtr = new ImageRenderer( *( mFactoryCache.Get() ) ); + CreateAtlasManager(); + ImageRenderer* rendererPtr = new ImageRenderer( *( mFactoryCache.Get() ), *( mAtlasManager.Get() ) ); Actor actor; - rendererPtr->SetImage( actor, url ); + rendererPtr->SetImage( actor, url, size ); return Toolkit::ControlRenderer( rendererPtr ); } } -void RendererFactory::ResetRenderer( Toolkit::ControlRenderer& renderer, Actor& actor, const std::string& url ) +void RendererFactory::ResetRenderer( Toolkit::ControlRenderer& renderer, Actor& actor, const std::string& url, ImageDimensions size ) { if( renderer ) { - if( NinePatchImage::IsNinePatchUrl( url ) ) + if( url.empty() ) + { + // If the URL is empty, then reset the renderer and return + renderer.RemoveAndReset( actor ); + return; + } + else if( NinePatchImage::IsNinePatchUrl( url ) ) { NPatchRenderer* rendererPtr = dynamic_cast< NPatchRenderer* >( &GetImplementation( renderer ) ); if( rendererPtr ) @@ -276,15 +298,16 @@ void RendererFactory::ResetRenderer( Toolkit::ControlRenderer& renderer, Actor& ImageRenderer* rendererPtr = dynamic_cast< ImageRenderer* >( &GetImplementation( renderer ) ); if( rendererPtr ) { - rendererPtr->SetImage( actor, url ); + rendererPtr->SetImage( actor, url, size ); return; } } + + renderer.RemoveAndReset( actor ); } - renderer.RemoveAndReset( actor ); - renderer = GetControlRenderer( url ); - if( actor.OnStage() ) + renderer = GetControlRenderer( url, size ); + if( actor && actor.OnStage() ) { renderer.SetOnStage( actor ); } @@ -294,45 +317,31 @@ void RendererFactory::ResetRenderer( Toolkit::ControlRenderer& renderer, Actor& { if( renderer ) { + ControlRenderer& controlRenderer = GetImplementation( renderer ); + Property::Value* type = propertyMap.Find( RENDERER_TYPE_NAME ); std::string typeValue ; - if( type && type->Get( typeValue )) + + //If there's no renderer type specified or if there hasn't been a renderer type change then we can reuse the renderer + if( !type || !type->Get( typeValue ) || + ( typeValue == IMAGE_RENDERER && typeid( controlRenderer ) == typeid( ImageRenderer ) ) || + ( typeValue == N_PATCH_RENDERER && typeid( controlRenderer ) == typeid( NPatchRenderer ) ) || + ( typeValue == COLOR_RENDERER && typeid( controlRenderer ) == typeid( ColorRenderer ) )|| + ( typeValue == GRADIENT_RENDERER && typeid( controlRenderer ) == typeid( GradientRenderer ) ) || + ( typeValue == BORDER_RENDERER && typeid( controlRenderer ) == typeid( BorderRenderer ) ) ) { - //If there's been a renderer type change then we have to return a new shader - if( typeValue == COLOR_RENDERER && typeid( renderer ) != typeid( ColorRenderer ) ) - { - renderer = GetControlRenderer( propertyMap ); - return; - } - else if( typeValue == GRADIENT_RENDERER && typeid( renderer ) != typeid( GradientRenderer ) ) - { - renderer = GetControlRenderer( propertyMap ); - return; - } - else if( typeValue == IMAGE_RENDERER && typeid( renderer ) != typeid( ImageRenderer ) ) - { - renderer = GetControlRenderer( propertyMap ); - return; - } - else if( typeValue == N_PATCH_RENDERER && typeid( renderer ) != typeid( NPatchRenderer ) ) - { - renderer = GetControlRenderer( propertyMap ); - return; - } - else if( typeValue == BORDER_RENDERER && typeid( renderer ) != typeid( BorderRenderer ) ) - { - renderer = GetControlRenderer( propertyMap ); - return; - } + controlRenderer.Initialize( actor, propertyMap ); + return; } - GetImplementation( renderer ).Initialize( actor, propertyMap ); + renderer.RemoveAndReset( actor ); } - else + + renderer = GetControlRenderer( propertyMap ); + if( actor && actor.OnStage() ) { - renderer = GetControlRenderer( propertyMap ); + renderer.SetOnStage( actor ); } - } Image RendererFactory::GetBrokenRendererImage() @@ -340,6 +349,16 @@ Image RendererFactory::GetBrokenRendererImage() return ResourceImage::New( BROKEN_RENDERER_IMAGE_URL ); } +void RendererFactory::CreateAtlasManager() +{ + if( !mAtlasManager ) + { + Shader shader = ImageRenderer::GetImageShader( *( mFactoryCache.Get() ) ); + mAtlasManager = new ImageAtlasManager(shader, TEXTURE_UNIFORM_NAME); + mAtlasManager->SetBrokenImage( BROKEN_RENDERER_IMAGE_URL ); + } +} + } // namespace Internal } // namespace Toolkit