[AT-SPI] Fix role setting
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / effects-view / effects-view-impl.cpp
index 9d4d089..f23d985 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2020 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.
 // EXTERNAL INCLUDES
 #include <dali/public-api/animation/constraint.h>
 #include <dali/public-api/animation/constraints.h>
-#include <dali/public-api/common/stage.h>
+#include <dali/devel-api/common/stage.h>
+#include <dali/public-api/object/property.h>
 #include <dali/public-api/object/property-map.h>
 #include <dali/public-api/object/type-registry.h>
 #include <dali/public-api/object/type-registry-helper.h>
 #include <dali/public-api/render-tasks/render-task-list.h>
 #include <dali/public-api/rendering/renderer.h>
-#include <dali/devel-api/images/texture-set-image.h>
 
 // INTERNAL INCLUDES
 #include <dali-toolkit/devel-api/controls/control-depth-index-ranges.h>
-#include <dali-toolkit/devel-api/controls/renderer-factory/renderer-factory.h>
+#include <dali-toolkit/devel-api/controls/control-devel.h>
 #include <dali-toolkit/internal/filters/blur-two-pass-filter.h>
 #include <dali-toolkit/internal/filters/emboss-filter.h>
 #include <dali-toolkit/internal/filters/spread-filter.h>
+#include <dali-toolkit/internal/controls/control/control-renderers.h>
+#include <dali-toolkit/internal/controls/control/control-data-impl.h>
 
 namespace Dali
 {
@@ -61,7 +63,7 @@ DALI_TYPE_REGISTRATION_END()
 
 const Pixel::Format EFFECTS_VIEW_DEFAULT_PIXEL_FORMAT = Pixel::RGBA8888;
 const float         ARBITRARY_FIELD_OF_VIEW = Math::PI / 4.0f;
-const Vector4       EFFECTS_VIEW_DEFAULT_BACKGROUND_COLOR( 1.0f, 1.0f, 1.0f, 0.0 );
+const Vector4       EFFECTS_VIEW_DEFAULT_BACKGROUND_COLOR( 0.0f, 0.0f, 0.0f, 0.0 );
 const bool          EFFECTS_VIEW_REFRESH_ON_DEMAND(false);
 
 #define DALI_COMPOSE_SHADER(STR) #STR
@@ -135,7 +137,7 @@ Toolkit::EffectsView EffectsView::New()
 }
 
 EffectsView::EffectsView()
-: Control( ControlBehaviour( ACTOR_BEHAVIOUR_NONE ) ),
+: Control( ControlBehaviour( CONTROL_BEHAVIOUR_DEFAULT ) ),
   mChildrenRoot(Actor::New()),
   mBackgroundColor( EFFECTS_VIEW_DEFAULT_BACKGROUND_COLOR ),
   mTargetSize( Vector2::ZERO ),
@@ -144,7 +146,7 @@ EffectsView::EffectsView()
   mEffectType( Toolkit::EffectsView::INVALID_TYPE ),
   mPixelFormat( EFFECTS_VIEW_DEFAULT_PIXEL_FORMAT ),
   mEnabled( false ),
-  mRefreshOnDemand(EFFECTS_VIEW_REFRESH_ON_DEMAND)
+  mRefreshOnDemand( EFFECTS_VIEW_REFRESH_ON_DEMAND )
 {
 }
 
@@ -160,8 +162,6 @@ void EffectsView::SetType( Toolkit::EffectsView::EffectType type )
     RemoveFilters();
 
     Actor self = Self();
-    Property::Map rendererMap;
-    rendererMap.Insert( "rendererType", "image" );
 
     switch( type )
     {
@@ -184,12 +184,6 @@ void EffectsView::SetType( Toolkit::EffectsView::EffectType type )
       }
     }
 
-    Property::Map customShader;
-    customShader[ "vertexShader" ] = EFFECTS_VIEW_VERTEX_SOURCE;
-    customShader[ "fragmentShader" ] = EFFECTS_VIEW_FRAGMENT_SOURCE;
-    rendererMap[ "shader" ] = customShader;
-    InitializeControlRenderer( self, mRendererPostFilter, rendererMap );
-
     mEffectType = type;
   }
 }
@@ -210,8 +204,8 @@ void EffectsView::Enable()
 void EffectsView::Disable()
 {
   // stop render tasks processing
-  // Note: render target resources are automatically freed since we set the Image::Unused flag
   RemoveRenderTasks();
+  mLastSize = Vector2::ZERO; // Ensure resources are reallocated on subsequent enable
   mEnabled = false;
 }
 
@@ -272,14 +266,17 @@ int EffectsView::GetEffectSize()
 void EffectsView::OnInitialize()
 {
   CustomActor self = Self();
-  mChildrenRoot.SetParentOrigin( ParentOrigin::CENTER );
+  mChildrenRoot.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
   self.Add( mChildrenRoot );
+
+  DevelControl::SetAccessibilityConstructor( self, []( Dali::Actor actor ) {
+    return std::unique_ptr< Dali::Accessibility::Accessible >(
+      new Control::Impl::AccessibleImpl( actor, Dali::Accessibility::Role::FILLER ) );
+  } );
 }
 
 void EffectsView::OnSizeSet(const Vector3& targetSize)
 {
-  Control::OnSizeSet( targetSize );
-
   mTargetSize = Vector2(targetSize);
 
   // if we are already on stage, need to update render target sizes now to reflect the new size of this actor
@@ -292,28 +289,33 @@ void EffectsView::OnSizeSet(const Vector3& targetSize)
     Enable();
   }
 
-  mChildrenRoot.SetSize( targetSize );
+  mChildrenRoot.SetProperty( Actor::Property::SIZE, targetSize );
+
+  Control::OnSizeSet( targetSize );
 }
 
-void EffectsView::OnStageConnection( int depth )
+void EffectsView::OnSceneConnection( int depth )
 {
-  Control::OnStageConnection( depth );
+  Actor self( Self() );
+
+  // Create renderers
+  mRendererPostFilter = CreateRenderer( EFFECTS_VIEW_VERTEX_SOURCE, EFFECTS_VIEW_FRAGMENT_SOURCE );
+  mRendererPostFilter.SetProperty( Dali::Renderer::Property::DEPTH_INDEX, DepthIndex::CONTENT );
+  self.AddRenderer( mRendererPostFilter );
+
+  mRendererForChildren = CreateRenderer( BASIC_VERTEX_SOURCE, BASIC_FRAGMENT_SOURCE );
+  mRendererForChildren.SetProperty( Dali::Renderer::Property::DEPTH_INDEX, DepthIndex::CONTENT + 1 );
+  self.AddRenderer( mRendererForChildren );
 
   Enable();
 
-  Actor self = Self();
-  if( mRendererPostFilter )
-  {
-    mRendererPostFilter.SetOnStage( self );
-  }
-  if( mRendererForChildren )
-  {
-    mRendererForChildren.SetOnStage( self );
-  }
+  Control::OnSceneConnection( depth );
 }
 
-void EffectsView::OnStageDisconnection()
+void EffectsView::OnSceneDisconnection()
 {
+  Actor self( Self() );
+
   Disable();
 
   const size_t numFilters( mFilters.Size() );
@@ -322,27 +324,24 @@ void EffectsView::OnStageDisconnection()
     mFilters[i]->Disable();
   }
 
-  Actor self = Self();
-  if( mRendererPostFilter )
-  {
-    mRendererPostFilter.SetOffStage( self );
-  }
-  if( mRendererForChildren )
-  {
-    mRendererForChildren.SetOffStage( self );
-  }
+  // Remove renderers
+  self.RemoveRenderer( mRendererForChildren );
+  mRendererForChildren.Reset();
+
+  self.RemoveRenderer( mRendererPostFilter );
+  mRendererPostFilter.Reset();
 
-  Control::OnStageDisconnection();
+  Control::OnSceneDisconnection();
 }
 
 void EffectsView::OnChildAdd( Actor& child )
 {
-  Control::OnChildAdd( child );
-
   if( child != mChildrenRoot && child != mCameraForChildren )
   {
     mChildrenRoot.Add( child );
   }
+
+  Control::OnChildAdd( child );
 }
 
 void EffectsView::OnChildRemove( Actor& child )
@@ -359,8 +358,8 @@ void EffectsView::SetupFilters()
     case Toolkit::EffectsView::DROP_SHADOW:
     {
       SpreadFilter* spreadFilter = static_cast< SpreadFilter* >( mFilters[0] );
-      spreadFilter->SetInputImage( mImageForChildren );
-      spreadFilter->SetOutputImage( mImagePostFilter );
+      spreadFilter->SetInputTexture( mFrameBufferForChildren.GetColorTexture() );
+      spreadFilter->SetOutputFrameBuffer( mFrameBufferPostFilter );
       spreadFilter->SetRootActor( mChildrenRoot );
       spreadFilter->SetBackgroundColor( mBackgroundColor );
       spreadFilter->SetPixelFormat( mPixelFormat );
@@ -368,8 +367,8 @@ void EffectsView::SetupFilters()
       spreadFilter->SetSpread( mEffectSize );
 
       BlurTwoPassFilter* blurFilter = static_cast< BlurTwoPassFilter* >( mFilters[1] );
-      blurFilter->SetInputImage( mImagePostFilter );
-      blurFilter->SetOutputImage( mImagePostFilter );
+      blurFilter->SetInputTexture( mFrameBufferPostFilter.GetColorTexture() );
+      blurFilter->SetOutputFrameBuffer( mFrameBufferPostFilter );
       blurFilter->SetRootActor( mChildrenRoot );
       blurFilter->SetBackgroundColor( mBackgroundColor );
       blurFilter->SetPixelFormat( mPixelFormat );
@@ -392,8 +391,8 @@ void EffectsView::SetupFilters()
     case Toolkit::EffectsView::EMBOSS:
     {
       SpreadFilter* spreadFilter = static_cast< SpreadFilter* >( mFilters[0] );
-      spreadFilter->SetInputImage( mImageForChildren );
-      spreadFilter->SetOutputImage( mImagePostFilter );
+      spreadFilter->SetInputTexture( mFrameBufferForChildren.GetColorTexture() );
+      spreadFilter->SetOutputFrameBuffer( mFrameBufferPostFilter );
       spreadFilter->SetRootActor( mChildrenRoot );
       spreadFilter->SetBackgroundColor( mBackgroundColor );
       spreadFilter->SetPixelFormat( Pixel::RGBA8888 );
@@ -401,16 +400,16 @@ void EffectsView::SetupFilters()
       spreadFilter->SetSpread( mEffectSize );
 
       EmbossFilter* embossFilter = static_cast< EmbossFilter* >( mFilters[1] );
-      embossFilter->SetInputImage( mImagePostFilter );
-      embossFilter->SetOutputImage( mImagePostFilter );
+      embossFilter->SetInputTexture( mFrameBufferPostFilter.GetColorTexture() );
+      embossFilter->SetOutputFrameBuffer( mFrameBufferPostFilter );
       embossFilter->SetRootActor( mChildrenRoot );
       embossFilter->SetBackgroundColor( mBackgroundColor );
       embossFilter->SetPixelFormat( Pixel::RGBA8888 );
       embossFilter->SetSize( mTargetSize );
 
       BlurTwoPassFilter* blurFilter = static_cast< BlurTwoPassFilter* >( mFilters[2] );
-      blurFilter->SetInputImage( mImagePostFilter );
-      blurFilter->SetOutputImage( mImagePostFilter );
+      blurFilter->SetInputTexture( mFrameBufferPostFilter.GetColorTexture() );
+      blurFilter->SetOutputFrameBuffer( mFrameBufferPostFilter );
       blurFilter->SetRootActor( mChildrenRoot );
       blurFilter->SetBackgroundColor( Vector4( 0.5f, 0.5f, 0.5f, 0.0 ) );
       blurFilter->SetPixelFormat( Pixel::RGBA8888 );
@@ -425,6 +424,7 @@ void EffectsView::SetupFilters()
     }
   }
 }
+
 void EffectsView::AllocateResources()
 {
   if(mTargetSize != mLastSize)
@@ -434,15 +434,17 @@ void EffectsView::AllocateResources()
 
     Actor self( Self() );
 
-    mImageForChildren = FrameBufferImage::New( mTargetSize.width, mTargetSize.height, mPixelFormat, Dali::Image::UNUSED );
-    InitializeControlRenderer( self, mRendererForChildren, mImageForChildren );
-    mRendererForChildren.SetDepthIndex( DepthIndex::CONTENT+1 );
+    mFrameBufferForChildren = FrameBuffer::New( mTargetSize.width, mTargetSize.height, FrameBuffer::Attachment::NONE );
+    Texture textureForChildren = Texture::New( TextureType::TEXTURE_2D, mPixelFormat, unsigned(mTargetSize.width), unsigned(mTargetSize.height) );
+    mFrameBufferForChildren.AttachColorTexture( textureForChildren );
+
+    SetRendererTexture( mRendererForChildren, textureForChildren );
+
+    mFrameBufferPostFilter = FrameBuffer::New( mTargetSize.width, mTargetSize.height, FrameBuffer::Attachment::NONE );
+    Texture texturePostFilter = Texture::New( TextureType::TEXTURE_2D, mPixelFormat, unsigned(mTargetSize.width), unsigned(mTargetSize.height) );
+    mFrameBufferPostFilter.AttachColorTexture( texturePostFilter );
 
-    mImagePostFilter = FrameBufferImage::New( mTargetSize.width, mTargetSize.height, mPixelFormat, Dali::Image::UNUSED );
-    TextureSet textureSet = TextureSet::New();
-    TextureSetImage( textureSet, 0u,  mImagePostFilter );
-    self.GetRendererAt( 0 ).SetTextures( textureSet );
-    mRendererPostFilter.SetDepthIndex( DepthIndex::CONTENT );
+    SetRendererTexture( mRendererPostFilter, texturePostFilter );
 
     SetupFilters();
   }
@@ -454,7 +456,7 @@ void EffectsView::SetupCameras()
   {
     // Create a camera for the children render, corresponding to its render target size
     mCameraForChildren = CameraActor::New(mTargetSize);
-    mCameraForChildren.SetParentOrigin(ParentOrigin::CENTER);
+    mCameraForChildren.SetProperty( Actor::Property::PARENT_ORIGIN,ParentOrigin::CENTER );
     mCameraForChildren.SetInvertYAxis( true );
     Self().Add( mCameraForChildren );
   }
@@ -466,8 +468,8 @@ void EffectsView::SetupCameras()
     mCameraForChildren.SetNearClippingPlane(1.0f);
     mCameraForChildren.SetAspectRatio(mTargetSize.width / mTargetSize.height);
     mCameraForChildren.SetType(Dali::Camera::FREE_LOOK); // camera orientation based solely on actor
-    mCameraForChildren.SetPosition(0.0f, 0.0f, mTargetSize.height * cameraPosScale);
-    mCameraForChildren.SetZ( mTargetSize.height * cameraPosScale );
+    mCameraForChildren.SetProperty( Actor::Property::POSITION, Vector3( 0.0f, 0.0f, mTargetSize.height * cameraPosScale ) );
+    mCameraForChildren.SetProperty( Actor::Property::POSITION_Z,  mTargetSize.height * cameraPosScale );
   }
 }
 
@@ -487,7 +489,7 @@ void EffectsView::CreateRenderTasks()
   mRenderTaskForChildren.SetInputEnabled( false );
   mRenderTaskForChildren.SetClearColor( mBackgroundColor );
   mRenderTaskForChildren.SetClearEnabled( true );
-  mRenderTaskForChildren.SetTargetFrameBuffer( mImageForChildren );
+  mRenderTaskForChildren.SetFrameBuffer( mFrameBufferForChildren );
   mRenderTaskForChildren.SetCameraActor(mCameraForChildren); // use camera that covers render target exactly
 
   // Enable image filters