Prevent Image visuals creating a renderer and putting it on stage even if url provide... 90/94390/7
authorAgnelo Vaz <agnelo.vaz@samsung.com>
Fri, 28 Oct 2016 13:28:20 +0000 (14:28 +0100)
committerAgnelo Vaz <agnelo.vaz@samsung.com>
Tue, 1 Nov 2016 13:42:04 +0000 (13:42 +0000)
Change-Id: I46751b4fbefe9e70a5a1e8da4d711c3038be8187

dali-toolkit/internal/controls/effects-view/effects-view-impl.cpp
dali-toolkit/internal/visuals/image/image-visual.cpp
dali-toolkit/internal/visuals/visual-base-impl.cpp

index 4c532fd..24f82bc 100644 (file)
@@ -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;
     InitializeVisual( self, mVisualPostFilter, dummyImage );
     Property::Map customShader;
     customShader[ Toolkit::Visual::Shader::Property::VERTEX_SHADER ] = EFFECTS_VIEW_VERTEX_SOURCE;
index 723afb6..d6cda4f 100644 (file)
@@ -551,13 +551,9 @@ TextureSet ImageVisual::CreateTextureSet( Vector4& textureRect, const std::strin
 
 void ImageVisual::InitializeRenderer( const std::string& imageUrl )
 {
 
 void ImageVisual::InitializeRenderer( const std::string& imageUrl )
 {
-  if( imageUrl.empty() )
-  {
-    return;
-  }
+  mImpl->mRenderer.Reset();
 
   mImageUrl = imageUrl;
 
   mImageUrl = imageUrl;
-  mImpl->mRenderer.Reset();
   mImpl->mFlags &= ~Impl::IS_ATLASING_APPLIED;
 
   if( !mImpl->mCustomShader &&
   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;
 void ImageVisual::InitializeRenderer( const Image& image )
 {
   mImpl->mFlags &= ~Impl::IS_FROM_CACHE;
+  mImpl->mRenderer.Reset();
 
   // don't reuse CreateTextureSet
   TextureSet textures = TextureSet::New();
 
   // 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 );
   }
     // reuse existing code for regular images
     CreateRenderer( textures );
   }
-
-  if( image )
-  {
-    ApplyImageToSampler( image );
-  }
+  ApplyImageToSampler( image );
 }
 
 void ImageVisual::UploadCompleted()
 }
 
 void ImageVisual::UploadCompleted()
@@ -657,17 +650,22 @@ void ImageVisual::UploadCompleted()
 
 void ImageVisual::DoSetOnStage( Actor& actor )
 {
 
 void ImageVisual::DoSetOnStage( Actor& actor )
 {
-  mPlacementActor = actor;
-
   if( !mImageUrl.empty() )
   {
     InitializeRenderer( mImageUrl );
   }
   if( !mImageUrl.empty() )
   {
     InitializeRenderer( mImageUrl );
   }
-  else
+  else if ( mImage )
   {
     InitializeRenderer( mImage );
   }
 
   {
     InitializeRenderer( mImage );
   }
 
+  if ( !mImpl->mRenderer)
+  {
+    return;
+  }
+
+  mPlacementActor = actor;
+
   if( mPixelArea != FULL_TEXTURE_RECT )
   {
     mImpl->mRenderer.RegisterProperty( PIXEL_AREA_UNIFORM_NAME, mPixelArea );
   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 )
 {
 
 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
   //If we own the image then make sure we release it when we go off stage
+  actor.RemoveRenderer( mImpl->mRenderer);
   if( !mImageUrl.empty() )
   {
   if( !mImageUrl.empty() )
   {
-    actor.RemoveRenderer( mImpl->mRenderer );
     CleanCache(mImageUrl);
     mImage.Reset();
   }
     CleanCache(mImageUrl);
     mImage.Reset();
   }
-  else
-  {
-    actor.RemoveRenderer( mImpl->mRenderer );
-    mImpl->mRenderer.Reset();
-  }
+
+  mImpl->mRenderer.Reset();
   mPlacementActor.Reset();
 }
 
   mPlacementActor.Reset();
 }
 
index d9da123..1b9cec7 100644 (file)
@@ -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 );
 
   // 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 )
 }
 
 void Visual::Base::SetOffStage( Actor& actor )
@@ -187,8 +190,8 @@ bool Visual::Base::IsPreMultipliedAlphaEnabled() const
 
 void Visual::Base::DoSetOffStage( Actor& actor )
 {
 
 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
 }
 
 bool Visual::Base::IsOnStage() const