[dali_1.2.22] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / super-blur-view / super-blur-view-impl.cpp
index 305db7d..a93257d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2017 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.
@@ -162,21 +162,20 @@ void SuperBlurView::OnInitialize()
 
 void SuperBlurView::SetImage(Image inputImage)
 {
-  if( mTargetSize == Vector2::ZERO || mInputImage == inputImage)
+  mInputImage = inputImage;
+  if( mTargetSize == Vector2::ZERO )
   {
     return;
   }
 
   ClearBlurResource();
 
-  mInputImage = inputImage;
   Actor self( Self() );
 
-  mVisuals[0].RemoveAndReset( self );
   mVisuals[0] = Toolkit::VisualFactory::Get().CreateVisual( mInputImage );
-  RegisterVisual( 0, mVisuals[0] );
+  RegisterVisual( 0, mVisuals[0] ); // Will clean up previously registered visuals for this index.
   mVisuals[0].SetDepthIndex(0);
-  SetShaderEffect( mVisuals[0] );
+  // custom shader is not applied on the original image.
 
   BlurImage( 0,  inputImage);
   for(unsigned int i=1; i<mBlurLevels;i++)
@@ -265,8 +264,8 @@ void SuperBlurView::SetShaderEffect( Toolkit::Visual::Base& visual )
   std::stringstream verterShaderString;
   shaderMap[ "fragmentShader" ] = FRAGMENT_SHADER;
 
-  Internal::Visual::Base& rendererImpl = Toolkit::GetImplementation( visual );
-  rendererImpl.SetCustomShader( shaderMap );
+  Internal::Visual::Base& visualImpl = Toolkit::GetImplementation( visual );
+  visualImpl.SetCustomShader( shaderMap );
 }
 
 void SuperBlurView::OnSizeSet( const Vector3& targetSize )
@@ -282,9 +281,8 @@ void SuperBlurView::OnSizeSet( const Vector3& targetSize )
       mBlurredImage[i-1] = FrameBufferImage::New( mTargetSize.width/std::pow(2.f,exponent) , mTargetSize.height/std::pow(2.f,exponent),
                                                 GAUSSIAN_BLUR_RENDER_TARGET_PIXEL_FORMAT );
 
-      mVisuals[i].RemoveAndReset( self );
-      mVisuals[i] =  Toolkit::VisualFactory::Get().CreateVisual( mBlurredImage[i - 1] );
-      RegisterVisual( i, mVisuals[i] );
+      mVisuals[i] = Toolkit::VisualFactory::Get().CreateVisual( mBlurredImage[i - 1] );
+      RegisterVisual( i, mVisuals[i] ); // Will clean up existing visual with same index.
       mVisuals[i].SetDepthIndex( i );
       SetShaderEffect( mVisuals[i] );
     }
@@ -294,34 +292,39 @@ void SuperBlurView::OnSizeSet( const Vector3& targetSize )
       SetImage( mInputImage );
     }
   }
+
+  Control::OnSizeSet( targetSize );
 }
 
 void SuperBlurView::OnStageConnection( int depth )
 {
-  // Chaining up first ensures visuals have SetOnStage called to create their renderers
-  Control::OnStageConnection( depth );
-
   if( mTargetSize == Vector2::ZERO )
   {
     return;
   }
 
+  // Exception to the rule, chaining up first ensures visuals have SetOnStage called to create their renderers
+  Control::OnStageConnection( depth );
+
   Actor self = Self();
-  for(unsigned int i=1; i<=mBlurLevels;i++)
+  for(unsigned int i=0; i<=mBlurLevels;i++)
   {
+    // Note that the renderer indices are depending on the order they been added to the actor
+    // which might be different from the blur level of its texture.
+    // We can check the depth index of the renderer to know which blurred image it renders.
+    // All visuals WILL have renderers at this point as we are simply creating visuals with an Image handle.
     Renderer renderer = self.GetRendererAt( i );
-    Property::Index index = renderer.RegisterProperty( ALPHA_UNIFORM_NAME, 0.f );
-    Constraint constraint = Constraint::New<float>( renderer, index, ActorOpacityConstraint(mBlurLevels, i-1) );
-    constraint.AddSource( Source( self, mBlurStrengthPropertyIndex ) );
-    constraint.Apply();
+    int depthIndex = renderer.GetProperty<int>(Renderer::Property::DEPTH_INDEX);
+    if( depthIndex > 0 )
+    {
+      Property::Index index = renderer.RegisterProperty( ALPHA_UNIFORM_NAME, 0.f );
+      Constraint constraint = Constraint::New<float>( renderer, index, ActorOpacityConstraint(mBlurLevels, depthIndex-1) );
+      constraint.AddSource( Source( self, mBlurStrengthPropertyIndex ) );
+      constraint.Apply();
+    }
   }
 }
 
-void SuperBlurView::OnStageDisconnection( )
-{
-  Control::OnStageDisconnection();
-}
-
 Vector3 SuperBlurView::GetNaturalSize()
 {
   if( mInputImage )