+ Actor self = Self();
+ for( unsigned int i = 1; i <= mBlurLevels; i++ )
+ {
+ float exponent = static_cast<float>(i);
+
+ unsigned int width = mTargetSize.width/std::pow(2.f,exponent);
+ unsigned int height = mTargetSize.height/std::pow(2.f,exponent);
+
+ mBlurredImage[i-1] = FrameBuffer::New( width, height, FrameBuffer::Attachment::NONE );
+ Texture texture = Texture::New( TextureType::TEXTURE_2D, GAUSSIAN_BLUR_RENDER_TARGET_PIXEL_FORMAT, unsigned(width), unsigned(height) );
+ mBlurredImage[i-1].AttachColorTexture( texture );
+ }
+
+ if( mInputTexture )
+ {
+ SetTexture( mInputTexture );
+ }
+ }
+
+ Control::OnSizeSet( targetSize );
+}
+
+void SuperBlurView::OnSceneConnection( int depth )
+{
+ if( mTargetSize == Vector2::ZERO )
+ {
+ return;
+ }
+
+ // Exception to the rule, chaining up first ensures visuals have SetOnScene called to create their renderers
+ Control::OnSceneConnection( depth );
+
+ Actor self = Self();
+
+ for(unsigned int i=0; i<mBlurLevels+1;i++)
+ {
+ mRenderers[i] = CreateRenderer( BASIC_VERTEX_SOURCE, FRAGMENT_SHADER );
+ mRenderers[i].SetProperty( Dali::Renderer::Property::DEPTH_INDEX, (int)i );
+ self.AddRenderer( mRenderers[i] );
+
+ if( i > 0 )
+ {
+ Renderer renderer = mRenderers[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();
+ }
+ }
+
+ if( mInputTexture )
+ {
+ SetRendererTexture( mRenderers[0], mInputTexture );
+ unsigned int i = 1;
+ for(; i<mBlurLevels; i++)