[4.0] If a RenderTask's exclusive actor is destoryed, then ensure the RenderTaskList... 00/211200/1 submit/tizen_4.0/20191001.070109
authorAdeel Kazmi <adeel.kazmi@samsung.com>
Tue, 30 Jul 2019 15:43:25 +0000 (16:43 +0100)
committerHeeyong Song <heeyong.song@samsung.com>
Wed, 31 Jul 2019 06:11:32 +0000 (15:11 +0900)
Change-Id: I59d797854242e2f2f204087b52c90c53946dfa9a

dali/internal/event/events/actor-observer.cpp
dali/internal/event/events/actor-observer.h
dali/internal/event/events/hit-test-algorithm-impl.cpp
dali/internal/event/render-tasks/render-task-list-impl.cpp
dali/internal/event/render-tasks/render-task-list-impl.h

index 42b9120..5d74088 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2019 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.
@@ -34,11 +34,8 @@ Debug::Filter* gLogFilter = Debug::Filter::New(Debug::NoLogging, false, "LOG_ACT
 }
 
 ActorObserver::ActorObserver()
-: mActor ( NULL ),
-  mActorDisconnected( false ),
-  mRemoveCallback( NULL )
+: ActorObserver( NULL )
 {
-  DALI_LOG_TRACE_METHOD( gLogFilter );
 }
 
 ActorObserver::ActorObserver( CallbackBase* callback )
@@ -46,6 +43,7 @@ ActorObserver::ActorObserver( CallbackBase* callback )
   mActorDisconnected( false ),
   mRemoveCallback( callback )
 {
+  DALI_LOG_TRACE_METHOD( gLogFilter );
 }
 
 ActorObserver::~ActorObserver()
@@ -56,7 +54,27 @@ ActorObserver::~ActorObserver()
   delete mRemoveCallback;
 }
 
-Actor* ActorObserver::GetActor()
+ActorObserver::ActorObserver( ActorObserver&& other )
+: ActorObserver( other.mRemoveCallback )
+{
+  SetActor( other.mActor );
+  mActorDisconnected = other.mActorDisconnected;
+  other.ResetActor();
+}
+
+ActorObserver& ActorObserver::operator=( ActorObserver&& other )
+{
+  if( this != &other )
+  {
+    SetActor( other.mActor );
+    mActorDisconnected = other.mActorDisconnected;
+    mRemoveCallback = other.mRemoveCallback;
+    other.ResetActor();
+  }
+  return *this;
+}
+
+Actor* ActorObserver::GetActor() const
 {
   return mActorDisconnected ? NULL : mActor;
 }
index bb9e5aa..9e42a19 100644 (file)
@@ -64,13 +64,31 @@ public:
    */
   ~ActorObserver();
 
+  // Movable.
+
+  /**
+   *
+   */
+  ActorObserver( ActorObserver&& other );
+
+  /**
+   *
+   */
+  ActorObserver& operator=( ActorObserver&& other );
+
+  // Not copyable
+
+  ActorObserver( const ActorObserver& ) = delete;   ///< Deleted copy constructor.
+  ActorObserver& operator=( const ActorObserver& ) = delete;   ///< Deleted copy assignment operator.
+
+
   // Methods
 
   /**
    * Return the stored Actor pointer.
    * @return The Actor pointer.
    */
-  Actor* GetActor();
+  Actor* GetActor() const;
 
   /**
    * Assignment operator.
@@ -86,12 +104,6 @@ public:
 
 private:
 
-  // Undefined
-  ActorObserver( const ActorObserver& );
-  ActorObserver& operator=( const ActorObserver& );
-
-private:
-
   /**
    * This will never get called as we do not observe objects that have not been added to the scene.
    * @param[in] object The object object.
index 56027a0..218b260 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2019 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.
@@ -127,14 +127,14 @@ struct ActorTouchableCheck : public HitTestInterface
  */
 bool IsActorExclusiveToAnotherRenderTask( const Actor& actor,
                                           const RenderTask& renderTask,
-                                          const Vector< RenderTaskList::Exclusive >& exclusives )
+                                          const RenderTaskList::ExclusivesContainer& exclusives )
 
 {
-  if( exclusives.Size() )
+  if( exclusives.size() )
   {
-    for( Vector< RenderTaskList::Exclusive >::Iterator exclusiveIt = exclusives.Begin(); exclusives.End() != exclusiveIt; ++exclusiveIt )
+    for( const auto& exclusive : exclusives )
     {
-      if( ( exclusiveIt->renderTaskPtr != &renderTask ) && ( exclusiveIt->actorPtr == &actor ) )
+      if( ( exclusive.renderTaskPtr != &renderTask ) && ( exclusive.actor.GetActor() == &actor ) )
       {
         return true;
       }
@@ -154,7 +154,7 @@ bool IsActorExclusiveToAnotherRenderTask( const Actor& actor,
  */
 HitActor HitTestWithinLayer( Actor& actor,
                              const RenderTask& renderTask,
-                             const Vector< RenderTaskList::Exclusive >& exclusives,
+                             const RenderTaskList::ExclusivesContainer& exclusives,
                              const Vector4& rayOrigin,
                              const Vector4& rayDir,
                              float& nearClippingPlane,
@@ -404,7 +404,7 @@ void GetCameraClippingPlane( RenderTask& renderTask, float& nearClippingPlane, f
 /**
  * Hit test a RenderTask
  */
-bool HitTestRenderTask( const Vector< RenderTaskList::Exclusive >& exclusives,
+bool HitTestRenderTask( const RenderTaskList::ExclusivesContainer& exclusives,
                         Stage& stage,
                         LayerList& layers,
                         RenderTask& renderTask,
@@ -545,7 +545,7 @@ bool HitTestRenderTaskList( Stage& stage,
 {
   RenderTaskList::RenderTaskContainer& tasks = taskList.GetTasks();
   RenderTaskList::RenderTaskContainer::reverse_iterator endIter = tasks.rend();
-  const Vector< RenderTaskList::Exclusive >& exclusives = taskList.GetExclusivesList();
+  const auto& exclusives = taskList.GetExclusivesList();
 
   for( RenderTaskList::RenderTaskContainer::reverse_iterator iter = tasks.rbegin(); endIter != iter; ++iter )
   {
@@ -661,9 +661,8 @@ bool HitTest( Stage& stage, RenderTask& renderTask, const Vector2& screenCoordin
   bool wasHit( false );
   Results hitTestResults;
 
-  const Vector< RenderTaskList::Exclusive >& exclusives = stage.GetRenderTaskList().GetExclusivesList();
   HitTestFunctionWrapper hitTestFunctionWrapper( func );
-  if( HitTestRenderTask( exclusives, stage, stage.GetLayerList(), renderTask, screenCoordinates, hitTestResults, hitTestFunctionWrapper ) )
+  if( HitTestRenderTask( stage.GetRenderTaskList().GetExclusivesList(), stage, stage.GetLayerList(), renderTask, screenCoordinates, hitTestResults, hitTestFunctionWrapper ) )
   {
     results.actor = hitTestResults.actor;
     results.actorCoordinates = hitTestResults.actorCoordinates;
index 61a9803..8f1a06c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2019 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.
@@ -95,11 +95,11 @@ void RenderTaskList::RemoveTask( Dali::RenderTask task )
 
       mTasks.erase( iter );
 
-      for ( Vector< Exclusive >::Iterator exclusiveIt = mExclusives.Begin(); exclusiveIt != mExclusives.End(); ++exclusiveIt )
+      for ( auto exclusiveIt = mExclusives.begin(); exclusiveIt != mExclusives.end(); ++exclusiveIt )
       {
         if ( exclusiveIt->renderTaskPtr == &taskImpl )
         {
-          mExclusives.Erase( exclusiveIt );
+          mExclusives.erase( exclusiveIt );
           break;
         }
       }
@@ -123,18 +123,18 @@ Dali::RenderTask RenderTaskList::GetTask( unsigned int index ) const
 void RenderTaskList::SetExclusive( RenderTask* task, bool exclusive )
 {
   // Check to see if this rendertask has an entry?
-  for ( Vector< Exclusive >::Iterator exclusiveIt = mExclusives.Begin(); exclusiveIt != mExclusives.End(); ++exclusiveIt )
+  for ( auto exclusiveIt = mExclusives.begin(); exclusiveIt != mExclusives.end(); ++exclusiveIt )
   {
     if ( exclusiveIt->renderTaskPtr == task )
     {
       if ( !exclusive )
       {
-        mExclusives.Erase( exclusiveIt );
+        mExclusives.erase( exclusiveIt );
         break;
       }
       else
       {
-        exclusiveIt->actorPtr = task->GetSourceActor();
+        exclusiveIt->actor.SetActor( task->GetSourceActor() );
         exclusive = false;
         break;
       }
@@ -144,8 +144,8 @@ void RenderTaskList::SetExclusive( RenderTask* task, bool exclusive )
   {
     Exclusive exclusiveSlot;
     exclusiveSlot.renderTaskPtr = task;
-    exclusiveSlot.actorPtr = task->GetSourceActor();
-    mExclusives.PushBack( exclusiveSlot );
+    exclusiveSlot.actor.SetActor( task->GetSourceActor() );
+    mExclusives.emplace_back( std::move( exclusiveSlot ) );
   }
 }
 
index 3216793..3e7395d 100644 (file)
@@ -2,7 +2,7 @@
 #define __DALI_INTERNAL_RENDER_TASK_LIST_H__
 
 /*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2019 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.
@@ -24,6 +24,7 @@
 #include <dali/public-api/render-tasks/render-task.h>
 #include <dali/public-api/render-tasks/render-task-list.h>
 #include <dali/internal/event/common/complete-notification-interface.h>
+#include <dali/internal/event/events/actor-observer.h>
 
 namespace Dali
 {
@@ -54,9 +55,11 @@ public:
   struct Exclusive
   {
     RenderTask* renderTaskPtr;        ///< Pointer for comparison with current rendertask.
-    Actor* actorPtr;                  ///< Pointer for comparison with current actor.
+    ActorObserver actor;              ///< For comparison with current actor.
   };
 
+  using ExclusivesContainer = std::vector< Exclusive >;
+
   /**
    * Create a RenderTaskList.
    * @param[in] eventServices Used for sending message to the scene graph.
@@ -108,7 +111,7 @@ public:
    *
    * @return [description]
    */
-  const Vector< Exclusive >& GetExclusivesList() const
+  const ExclusivesContainer& GetExclusivesList() const
   {
     return mExclusives;
   }
@@ -164,7 +167,7 @@ private:
   SceneGraph::RenderTaskList* mSceneObject; ///< Raw-pointer to the scene-graph object; not owned.
 
   RenderTaskContainer mTasks;           ///< Reference counted render-tasks
-  Vector< Exclusive > mExclusives;      ///< List of rendertasks with exclusively owned source actors.
+  ExclusivesContainer mExclusives;      ///< List of rendertasks with exclusively owned source actors.
 };
 
 } // namespace Internal