Merge "Implemented custom shader in ImageRenderer and changed Dissolve-effect to...
authorKimmo Hoikka <kimmo.hoikka@samsung.com>
Thu, 1 Oct 2015 18:03:03 +0000 (11:03 -0700)
committerGerrit Code Review <gerrit@review.vlan103.tizen.org>
Thu, 1 Oct 2015 18:03:03 +0000 (11:03 -0700)
dali-toolkit/internal/text/decorator/text-decorator.cpp
dali-toolkit/internal/text/rendering/atlas/text-atlas-renderer.cpp

index c94129f..6541b77 100644 (file)
@@ -273,6 +273,7 @@ struct Decorator::Impl : public ConnectionTracker
     mScrollDistance( SCROLL_DISTANCE ),
     mTextDepth( 0u ),
     mActiveCopyPastePopup( false ),
+    mPopupSetNewPosition( true ),
     mCursorBlinkStatus( true ),
     mDelayCursorBlink( false ),
     mPrimaryCursorVisible( false ),
@@ -422,6 +423,7 @@ struct Decorator::Impl : public ConnectionTracker
       if( mCopyPastePopup.actor )
       {
         mCopyPastePopup.actor.HidePopup();
+        mPopupSetNewPosition = true;
       }
     }
   }
@@ -459,19 +461,22 @@ struct Decorator::Impl : public ConnectionTracker
       return;
     }
 
-    if ( mHandle[LEFT_SELECTION_HANDLE].active || mHandle[RIGHT_SELECTION_HANDLE].active )
+    if( mPopupSetNewPosition )
     {
-      float minHandleXPosition = std::min (  mHandle[LEFT_SELECTION_HANDLE].position.x, mHandle[RIGHT_SELECTION_HANDLE].position.x );
-      float maxHandleXPosition = std::max (  mHandle[LEFT_SELECTION_HANDLE].position.x, mHandle[RIGHT_SELECTION_HANDLE].position.x );
+      if ( mHandle[LEFT_SELECTION_HANDLE].active || mHandle[RIGHT_SELECTION_HANDLE].active )
+      {
+        float minHandleXPosition = std::min (  mHandle[LEFT_SELECTION_HANDLE].position.x, mHandle[RIGHT_SELECTION_HANDLE].position.x );
+        float maxHandleXPosition = std::max (  mHandle[LEFT_SELECTION_HANDLE].position.x, mHandle[RIGHT_SELECTION_HANDLE].position.x );
 
-      float minHandleYPosition = std::min (  mHandle[LEFT_SELECTION_HANDLE].position.y, mHandle[RIGHT_SELECTION_HANDLE].position.y );
+        float minHandleYPosition = std::min (  mHandle[LEFT_SELECTION_HANDLE].position.y, mHandle[RIGHT_SELECTION_HANDLE].position.y );
 
-      mCopyPastePopup.position.x = minHandleXPosition + ( ( maxHandleXPosition - minHandleXPosition ) *0.5f );
-      mCopyPastePopup.position.y = minHandleYPosition + mCopyPastePopup.offset;
-    }
-    else
-    {
-      mCopyPastePopup.position = Vector3( mCursor[PRIMARY_CURSOR].position.x, mCursor[PRIMARY_CURSOR].position.y -100.0f , 0.0f ); //todo 100 to be an offset Property
+        mCopyPastePopup.position.x = minHandleXPosition + ( ( maxHandleXPosition - minHandleXPosition ) *0.5f );
+        mCopyPastePopup.position.y = minHandleYPosition + mCopyPastePopup.offset;
+      }
+      else
+      {
+        mCopyPastePopup.position = Vector3( mCursor[PRIMARY_CURSOR].position.x, mCursor[PRIMARY_CURSOR].position.y -100.0f , 0.0f ); //todo 100 to be an offset Property
+      }
     }
 
     Vector3 popupSize = Vector3( mCopyPastePopup.actor.GetRelayoutSize( Dimension::WIDTH ), mCopyPastePopup.actor.GetRelayoutSize( Dimension::HEIGHT ), 0.0f );
@@ -481,6 +486,7 @@ struct Decorator::Impl : public ConnectionTracker
     SetUpPopupPositionNotifications();
 
     mCopyPastePopup.actor.SetPosition( mCopyPastePopup.position );
+    mPopupSetNewPosition = false;
   }
 
   void PopupRelayoutComplete( Actor actor )
@@ -1405,6 +1411,7 @@ struct Decorator::Impl : public ConnectionTracker
   int                 mTextDepth;               ///< The depth used to render the text.
 
   bool                mActiveCopyPastePopup              : 1;
+  bool                mPopupSetNewPosition               : 1;
   bool                mCursorBlinkStatus                 : 1; ///< Flag to switch between blink on and blink off.
   bool                mDelayCursorBlink                  : 1; ///< Used to avoid cursor blinking when entering text.
   bool                mPrimaryCursorVisible              : 1; ///< Whether the primary cursor is visible.
@@ -1677,19 +1684,19 @@ bool Decorator::IsPopupActive() const
 
 void Decorator::SetEnabledPopupButtons( TextSelectionPopup::Buttons& enabledButtonsBitMask )
 {
-   mImpl->mEnabledPopupButtons = enabledButtonsBitMask;
+  mImpl->mEnabledPopupButtons = enabledButtonsBitMask;
 
-   if ( !mImpl->mCopyPastePopup.actor )
-   {
-     mImpl->mCopyPastePopup.actor = TextSelectionPopup::New( &mImpl->mTextSelectionPopupCallbackInterface );
+  if ( !mImpl->mCopyPastePopup.actor )
+  {
+    mImpl->mCopyPastePopup.actor = TextSelectionPopup::New( &mImpl->mTextSelectionPopupCallbackInterface );
 #ifdef DECORATOR_DEBUG
-     mImpl->mCopyPastePopup.actor.SetName("mCopyPastePopup");
+    mImpl->mCopyPastePopup.actor.SetName("mCopyPastePopup");
 #endif
-     mImpl->mCopyPastePopup.actor.SetAnchorPoint( AnchorPoint::CENTER );
-     mImpl->mCopyPastePopup.actor.OnRelayoutSignal().Connect( mImpl,  &Decorator::Impl::PopupRelayoutComplete  ); // Position popup after size negotiation
-   }
+    mImpl->mCopyPastePopup.actor.SetAnchorPoint( AnchorPoint::CENTER );
+    mImpl->mCopyPastePopup.actor.OnRelayoutSignal().Connect( mImpl,  &Decorator::Impl::PopupRelayoutComplete  ); // Position popup after size negotiation
+  }
 
-   mImpl->mCopyPastePopup.actor.EnableButtons( mImpl->mEnabledPopupButtons );
+  mImpl->mCopyPastePopup.actor.EnableButtons( mImpl->mEnabledPopupButtons );
 }
 
 TextSelectionPopup::Buttons& Decorator::GetEnabledPopupButtons()
index b655772..7c629fd 100644 (file)
@@ -358,6 +358,7 @@ struct AtlasRenderer::Impl : public ConnectionTracker
     // Now remove references for the old text
     RemoveText();
     mTextCache.Swap( newTextCache );
+    RemoveAllShadowRenderTasks();
 
     if( thereAreUnderlinedGlyphs )
     {
@@ -759,36 +760,33 @@ struct AtlasRenderer::Impl : public ConnectionTracker
     subActor.SetSize( actorSize );
     subActor.SetColor( shadowColor );
 
-    // Discard redundant render-tasks
-    RemoveShadowRenderTask();
-
     // Create a render task to render the effect
-    mShadowTask = Stage::GetCurrent().GetRenderTaskList().CreateTask();
-    mShadowTask.SetTargetFrameBuffer( meshRecord.mBuffer );
-    mShadowTask.SetSourceActor( subActor );
-    mShadowTask.SetClearEnabled( true );
-    mShadowTask.SetClearColor( Vector4::ZERO );
-    mShadowTask.SetExclusive( true );
-    mShadowTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
-    mShadowTask.FinishedSignal().Connect( this, &AtlasRenderer::Impl::RenderComplete );
+    RenderTask shadowTask = Stage::GetCurrent().GetRenderTaskList().CreateTask();
+    shadowTask.SetTargetFrameBuffer( meshRecord.mBuffer );
+    shadowTask.SetSourceActor( subActor );
+    shadowTask.SetClearEnabled( true );
+    shadowTask.SetClearColor( Vector4::ZERO );
+    shadowTask.SetExclusive( true );
+    shadowTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
+    shadowTask.FinishedSignal().Connect( this, &AtlasRenderer::Impl::RenderComplete );
+    mShadowTasks.push_back( shadowTask );
     actor.Add( subActor );
 
     return actor;
   }
 
-  void RemoveShadowRenderTask()
+  void RemoveShadowRenderTask( RenderTask renderTask )
   {
-    if( mShadowTask )
+    if( renderTask )
     {
-      mShadowTask.FinishedSignal().Disconnect( this, &AtlasRenderer::Impl::RenderComplete );
+      renderTask.FinishedSignal().Disconnect( this, &AtlasRenderer::Impl::RenderComplete );
 
       // Guard to prevent accessing Stage after dali-core destruction
       if( Stage::IsInstalled() )
       {
-        Stage::GetCurrent().GetRenderTaskList().RemoveTask( mShadowTask );
+        Stage::GetCurrent().GetRenderTaskList().RemoveTask( renderTask );
       }
-
-      mShadowTask.Reset();
+      renderTask.Reset();
     }
   }
 
@@ -805,12 +803,21 @@ struct AtlasRenderer::Impl : public ConnectionTracker
       }
     }
 
-    RemoveShadowRenderTask();
+    RemoveShadowRenderTask( renderTask );
+  }
+
+  void RemoveAllShadowRenderTasks()
+  {
+    for ( std::vector< RenderTask >::iterator shadowIterator = mShadowTasks.begin();
+          shadowIterator != mShadowTasks.end(); ++shadowIterator )
+    {
+      RemoveShadowRenderTask( *shadowIterator );
+    }
   }
 
   Actor mActor;                                       ///< The actor parent which renders the text
   AtlasGlyphManager mGlyphManager;                    ///< Glyph Manager to handle upload and caching
-  RenderTask mShadowTask;                             ///< Used to render shadows
+  std::vector< RenderTask > mShadowTasks;             ///< Used to render shadows
   TextAbstraction::FontClient mFontClient;            ///> The font client used to supply glyph information
   std::vector< MaxBlockSize > mBlockSizes;            ///> Maximum size needed to contain a glyph in a block within a new atlas
   std::vector< uint32_t > mFace;                      ///> Face indices for a quad
@@ -865,7 +872,7 @@ AtlasRenderer::AtlasRenderer()
 
 AtlasRenderer::~AtlasRenderer()
 {
-  mImpl->RemoveShadowRenderTask();
+  mImpl->RemoveAllShadowRenderTasks();
 
   mImpl->RemoveText();
   delete mImpl;