X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Frendering%2Fatlas%2Ftext-atlas-renderer.cpp;h=7c629fdc6e4aab2d7bef63b8a7d0f5a3b4ac4093;hp=026b4d67b00fcde05ae33835ad068b49d49002f9;hb=1303adb9af25ae1b954cbb9c59c643313c42b04a;hpb=2047844bb3b4a84231905c8c540d34d4c468e5ad diff --git a/dali-toolkit/internal/text/rendering/atlas/text-atlas-renderer.cpp b/dali-toolkit/internal/text/rendering/atlas/text-atlas-renderer.cpp index 026b4d6..7c629fd 100644 --- a/dali-toolkit/internal/text/rendering/atlas/text-atlas-renderer.cpp +++ b/dali-toolkit/internal/text/rendering/atlas/text-atlas-renderer.cpp @@ -358,6 +358,7 @@ struct AtlasRenderer::Impl : public ConnectionTracker // Now remove references for the old text RemoveText(); mTextCache.Swap( newTextCache ); + RemoveAllShadowRenderTasks(); if( thereAreUnderlinedGlyphs ) { @@ -723,8 +724,8 @@ struct AtlasRenderer::Impl : public ConnectionTracker Dali::Renderer renderer = Dali::Renderer::New( quadGeometry, material ); - // Ensure shadow is behind the text... - renderer.SetDepthIndex( CONTENT_DEPTH_INDEX + mDepth ); + // Set depth index to -1.0 to make sure shadow is rendered first in 3D layers + renderer.SetDepthIndex( -1.0f ); Actor actor = Actor::New(); actor.AddRenderer( renderer ); actor.SetParentOrigin( ParentOrigin::CENTER ); // Keep all of the origins aligned @@ -760,25 +761,37 @@ struct AtlasRenderer::Impl : public ConnectionTracker subActor.SetColor( shadowColor ); // Create a render task to render the effect - RenderTask task = Stage::GetCurrent().GetRenderTaskList().CreateTask(); - task.SetTargetFrameBuffer( meshRecord.mBuffer ); - task.SetSourceActor( subActor ); - task.SetClearEnabled( true ); - task.SetClearColor( Vector4::ZERO ); - task.SetExclusive( true ); - task.SetRefreshRate( RenderTask::REFRESH_ONCE ); - task.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 RenderComplete( RenderTask& renderTask ) + void RemoveShadowRenderTask( RenderTask renderTask ) { - // Disconnect and remove this single shot render task - renderTask.FinishedSignal().Disconnect( this, &AtlasRenderer::Impl::RenderComplete ); - Stage::GetCurrent().GetRenderTaskList().RemoveTask( renderTask ); + if( renderTask ) + { + renderTask.FinishedSignal().Disconnect( this, &AtlasRenderer::Impl::RenderComplete ); + // Guard to prevent accessing Stage after dali-core destruction + if( Stage::IsInstalled() ) + { + Stage::GetCurrent().GetRenderTaskList().RemoveTask( renderTask ); + } + renderTask.Reset(); + } + } + + void RenderComplete( RenderTask& renderTask ) + { // Get the actor used for render to buffer and remove it from the parent Actor renderActor = renderTask.GetSourceActor(); if ( renderActor ) @@ -789,10 +802,22 @@ struct AtlasRenderer::Impl : public ConnectionTracker parent.Remove( renderActor ); } } + + 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 + 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 @@ -847,6 +872,8 @@ AtlasRenderer::AtlasRenderer() AtlasRenderer::~AtlasRenderer() { + mImpl->RemoveAllShadowRenderTasks(); + mImpl->RemoveText(); delete mImpl; }