textCacheEntry.mIndex = glyph.index;
newTextCache.PushBack( textCacheEntry );
+ // Adjust the vertices if the fixed-size font should be down-scaled
+ if( glyph.scaleFactor > 0 )
+ {
+ for( unsigned int i=0; i<newMesh.mVertices.Count(); ++i )
+ {
+ newMesh.mVertices[i].mPosition.x = position.x + ( ( newMesh.mVertices[i].mPosition.x - position.x ) * glyph.scaleFactor );
+ newMesh.mVertices[i].mPosition.y = position.y + ( ( newMesh.mVertices[i].mPosition.y - position.y ) * glyph.scaleFactor );
+ }
+ }
+
// Find an existing mesh data object to attach to ( or create a new one, if we can't find one using the same atlas)
StitchTextMesh( meshContainer,
newMesh,
// Create an effect if necessary
if ( style == STYLE_DROP_SHADOW )
{
- actor.Add( GenerateShadow( *mIt, actorSize, shadowOffset, shadowColor ) );
+ Actor shadowActor = GenerateShadow( *mIt, actorSize, shadowOffset, shadowColor );
+ shadowActor.Add( actor );
+ actor = shadowActor;
}
if( mActor )
Dali::Renderer renderer = Dali::Renderer::New( quadGeometry, material );
- // Ensure shadow is behind the text...
- renderer.SetDepthIndex( CONTENT_DEPTH_INDEX + mDepth - 1 );
+ // 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
subActor.AddRenderer( normRenderer );
subActor.SetParentOrigin( ParentOrigin::CENTER ); // Keep all of the origins aligned
subActor.SetSize( actorSize );
- subActor.SetColorMode( USE_OWN_MULTIPLY_PARENT_COLOR );
subActor.SetColor( shadowColor );
+ // Discard redundant render-tasks
+ RemoveShadowRenderTask();
+
// 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 );
+ 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 );
actor.Add( subActor );
return actor;
}
- void RenderComplete( RenderTask& renderTask )
+ void RemoveShadowRenderTask()
{
- // Disconnect and remove this single shot render task
- renderTask.FinishedSignal().Disconnect( this, &AtlasRenderer::Impl::RenderComplete );
- Stage::GetCurrent().GetRenderTaskList().RemoveTask( renderTask );
+ if( mShadowTask )
+ {
+ mShadowTask.FinishedSignal().Disconnect( this, &AtlasRenderer::Impl::RenderComplete );
+
+ // Guard to prevent accessing Stage after dali-core destruction
+ if( Stage::IsInstalled() )
+ {
+ Stage::GetCurrent().GetRenderTaskList().RemoveTask( mShadowTask );
+ }
+
+ mShadowTask.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();
}
Actor mActor; ///< The actor parent which renders the text
AtlasGlyphManager mGlyphManager; ///< Glyph Manager to handle upload and caching
+ RenderTask mShadowTask; ///< 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->RemoveShadowRenderTask();
+
mImpl->RemoveText();
delete mImpl;
}