From: Agnelo Vaz Date: Fri, 28 Oct 2016 13:28:20 +0000 (+0100) Subject: Prevent Image visuals creating a renderer and putting it on stage even if url provide... X-Git-Tag: dali_1.2.13~5^2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=338e77da9020278bb4e8874e9791da96bd2717eb;hp=-c Prevent Image visuals creating a renderer and putting it on stage even if url provided is empty Change-Id: I46751b4fbefe9e70a5a1e8da4d711c3038be8187 --- 338e77da9020278bb4e8874e9791da96bd2717eb diff --git a/dali-toolkit/internal/controls/effects-view/effects-view-impl.cpp b/dali-toolkit/internal/controls/effects-view/effects-view-impl.cpp index 4c532fd..24f82bc 100644 --- a/dali-toolkit/internal/controls/effects-view/effects-view-impl.cpp +++ b/dali-toolkit/internal/controls/effects-view/effects-view-impl.cpp @@ -184,7 +184,8 @@ void EffectsView::SetType( Toolkit::EffectsView::EffectType type ) } } - Image dummyImage; // Dummy image, force creation of an image visual + FrameBufferImage dummyImage = FrameBufferImage::New( mTargetSize.width, mTargetSize.height, mPixelFormat ); + InitializeVisual( self, mVisualPostFilter, dummyImage ); Property::Map customShader; customShader[ Toolkit::Visual::Shader::Property::VERTEX_SHADER ] = EFFECTS_VIEW_VERTEX_SOURCE; diff --git a/dali-toolkit/internal/visuals/image/image-visual.cpp b/dali-toolkit/internal/visuals/image/image-visual.cpp index 723afb6..d6cda4f 100644 --- a/dali-toolkit/internal/visuals/image/image-visual.cpp +++ b/dali-toolkit/internal/visuals/image/image-visual.cpp @@ -551,13 +551,9 @@ TextureSet ImageVisual::CreateTextureSet( Vector4& textureRect, const std::strin void ImageVisual::InitializeRenderer( const std::string& imageUrl ) { - if( imageUrl.empty() ) - { - return; - } + mImpl->mRenderer.Reset(); mImageUrl = imageUrl; - mImpl->mRenderer.Reset(); mImpl->mFlags &= ~Impl::IS_ATLASING_APPLIED; if( !mImpl->mCustomShader && @@ -620,6 +616,7 @@ void ImageVisual::InitializeRenderer( const std::string& imageUrl ) void ImageVisual::InitializeRenderer( const Image& image ) { mImpl->mFlags &= ~Impl::IS_FROM_CACHE; + mImpl->mRenderer.Reset(); // don't reuse CreateTextureSet TextureSet textures = TextureSet::New(); @@ -636,11 +633,7 @@ void ImageVisual::InitializeRenderer( const Image& image ) // reuse existing code for regular images CreateRenderer( textures ); } - - if( image ) - { - ApplyImageToSampler( image ); - } + ApplyImageToSampler( image ); } void ImageVisual::UploadCompleted() @@ -657,17 +650,22 @@ void ImageVisual::UploadCompleted() void ImageVisual::DoSetOnStage( Actor& actor ) { - mPlacementActor = actor; - if( !mImageUrl.empty() ) { InitializeRenderer( mImageUrl ); } - else + else if ( mImage ) { InitializeRenderer( mImage ); } + if ( !mImpl->mRenderer) + { + return; + } + + mPlacementActor = actor; + if( mPixelArea != FULL_TEXTURE_RECT ) { mImpl->mRenderer.RegisterProperty( PIXEL_AREA_UNIFORM_NAME, mPixelArea ); @@ -682,18 +680,17 @@ void ImageVisual::DoSetOnStage( Actor& actor ) void ImageVisual::DoSetOffStage( Actor& actor ) { + // Visual::Base::SetOffStage only calls DoSetOffStage if mRenderer exists (is on onstage) + //If we own the image then make sure we release it when we go off stage + actor.RemoveRenderer( mImpl->mRenderer); if( !mImageUrl.empty() ) { - actor.RemoveRenderer( mImpl->mRenderer ); CleanCache(mImageUrl); mImage.Reset(); } - else - { - actor.RemoveRenderer( mImpl->mRenderer ); - mImpl->mRenderer.Reset(); - } + + mImpl->mRenderer.Reset(); mPlacementActor.Reset(); } diff --git a/dali-toolkit/internal/visuals/visual-base-impl.cpp b/dali-toolkit/internal/visuals/visual-base-impl.cpp index d9da123..1b9cec7 100644 --- a/dali-toolkit/internal/visuals/visual-base-impl.cpp +++ b/dali-toolkit/internal/visuals/visual-base-impl.cpp @@ -134,9 +134,12 @@ void Visual::Base::SetOnStage( Actor& actor ) // Thus the calling of actor.AddRenderer() should happen inside derived class as base class does not know the exact timing. DoSetOnStage( actor ); - mImpl->mRenderer.SetProperty(Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA, IsPreMultipliedAlphaEnabled()); - mImpl->mRenderer.SetProperty( Renderer::Property::DEPTH_INDEX, mImpl->mDepthIndex ); - mImpl->mFlags |= Impl::IS_ON_STAGE; + if( mImpl->mRenderer ) + { + mImpl->mRenderer.SetProperty( Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA, IsPreMultipliedAlphaEnabled()); + mImpl->mRenderer.SetProperty( Renderer::Property::DEPTH_INDEX, mImpl->mDepthIndex ); + mImpl->mFlags |= Impl::IS_ON_STAGE; // Only sets the flag if renderer exists + } } void Visual::Base::SetOffStage( Actor& actor ) @@ -187,8 +190,8 @@ bool Visual::Base::IsPreMultipliedAlphaEnabled() const void Visual::Base::DoSetOffStage( Actor& actor ) { - actor.RemoveRenderer( mImpl->mRenderer ); - mImpl->mRenderer.Reset(); + actor.RemoveRenderer( mImpl->mRenderer ); + mImpl->mRenderer.Reset(); } bool Visual::Base::IsOnStage() const