// Now remove references for the old text
RemoveText();
mTextCache.Swap( newTextCache );
+ RemoveAllShadowRenderTasks();
if( thereAreUnderlinedGlyphs )
{
quadGeometry.AddVertexBuffer( quadVertices );
quadGeometry.SetIndexBuffer( quadIndices );
- Sampler sampler = Sampler::New( meshRecord.mBuffer, "sTexture" );
Material material = Material::New( mGlyphManager.GetEffectBufferShader() );
- material.AddSampler( sampler );
+ material.AddTexture(meshRecord.mBuffer, "sTexture");
Dali::Renderer renderer = Dali::Renderer::New( quadGeometry, material );
normGeometry.SetIndexBuffer( normIndices );
Material normMaterial = Material::New( mGlyphManager.GetGlyphShadowShader() );
- Sampler normSampler = mGlyphManager.GetSampler( meshRecord.mAtlasId );
- normMaterial.AddSampler( normSampler );
+ Image normImage = mGlyphManager.GetImage( meshRecord.mAtlasId );
+ normMaterial.AddTexture( normImage, "sTexture" );
Dali::Renderer normRenderer = Dali::Renderer::New( normGeometry, normMaterial );
Actor subActor = Actor::New();
subActor.AddRenderer( normRenderer );
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 )
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
AtlasRenderer::~AtlasRenderer()
{
+ mImpl->RemoveAllShadowRenderTasks();
+
mImpl->RemoveText();
delete mImpl;
}