From: Victor Cebollada Date: Fri, 25 Nov 2016 07:29:56 +0000 (+0000) Subject: TextVisual - Renderer life cycle. X-Git-Tag: dali_1.2.17~6^2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=0b4c2e43605425eb9f676824515370f541712d3f TextVisual - Renderer life cycle. * Creates the renderer as soon as the visual is on the stage, otherwise flags are not set/updated. Create the renderer even there is no text or the area's size is zero. * Only destroys the renderer when the visual is off the stage. Do not destroy the renderer if there is no text or the area's size is zero. Change-Id: I6d621399767dd7a603e758d59850d9f6ad1c81f1 Signed-off-by: Victor Cebollada --- diff --git a/automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp b/automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp index 04912a0..6e9f11f 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp @@ -924,6 +924,7 @@ int UtcDaliVisualGetPropertyMap10(void) Property::Map propertyMap; propertyMap.Insert( Visual::Property::TYPE, DevelVisual::TEXT ); propertyMap.Insert( "renderingBackend", static_cast( Toolkit::Text::DEFAULT_RENDERING_BACKEND ) ); + propertyMap.Insert( "enableMarkup", false ); propertyMap.Insert( "text", "Hello world" ); propertyMap.Insert( "fontFamily", "TizenSans" ); @@ -936,7 +937,6 @@ int UtcDaliVisualGetPropertyMap10(void) propertyMap.Insert( "horizontalAlignment", "CENTER" ); propertyMap.Insert( "verticalAlignment", "CENTER" ); propertyMap.Insert( "textColor", Color::RED ); - propertyMap.Insert( "enableMarkup", false ); Visual::Base textVisual = factory.CreateVisual( propertyMap ); Property::Map resultMap; @@ -1654,6 +1654,7 @@ int UtcDaliVisualTextVisualRender(void) Property::Map propertyMap; propertyMap.Insert( Visual::Property::TYPE, DevelVisual::TEXT ); propertyMap.Insert( "renderingBackend", static_cast( Toolkit::Text::DEFAULT_RENDERING_BACKEND ) ); + propertyMap.Insert( "enableMarkup", false ); propertyMap.Insert( "text", "Hello world" ); propertyMap.Insert( "fontFamily", "TizenSans" ); @@ -1666,7 +1667,6 @@ int UtcDaliVisualTextVisualRender(void) propertyMap.Insert( "horizontalAlignment", "CENTER" ); propertyMap.Insert( "verticalAlignment", "CENTER" ); propertyMap.Insert( "textColor", Color::RED ); - propertyMap.Insert( "enableMarkup", false ); Visual::Base textVisual = factory.CreateVisual( propertyMap ); textVisual.SetDepthIndex( 1.f ); @@ -1681,5 +1681,26 @@ int UtcDaliVisualTextVisualRender(void) application.SendNotification(); application.Render(); + + // Create a texture bigger than the maximum allowed by the image atlas. Used to increase coverage. + propertyMap.Clear(); + propertyMap.Insert( Visual::Property::TYPE, DevelVisual::TEXT ); + propertyMap.Insert( TextVisual::Property::ENABLE_MARKUP, true ); + propertyMap.Insert( TextVisual::Property::TEXT, "Hello world" ); + propertyMap.Insert( TextVisual::Property::MULTI_LINE, true ); + + Property::Map transformMap; + transformMap.Insert( DevelVisual::Transform::Property::SIZE, Vector2( 720.f, 640.f ) ); + propertyMap.Insert( DevelVisual::Property::TRANSFORM, transformMap ); + + textVisual = factory.CreateVisual( propertyMap ); + textVisual.SetDepthIndex( 1.f ); + + dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, textVisual ); + dummyControl.SetSize( 720.f, 640.f ); + + application.SendNotification(); + application.Render(); + END_TEST; } diff --git a/dali-toolkit/internal/visuals/text/text-visual.cpp b/dali-toolkit/internal/visuals/text/text-visual.cpp index e55b313..e7b40a8 100644 --- a/dali-toolkit/internal/visuals/text/text-visual.cpp +++ b/dali-toolkit/internal/visuals/text/text-visual.cpp @@ -199,49 +199,46 @@ void TextVisual::DoSetProperties( const Property::Map& propertyMap ) { case Property::Key::INDEX: { - if( Toolkit::DevelVisual::Property::TYPE != keyValue.first.indexKey ) // Toolkit::DevelVisual::Property::TYPE is not a TextVisual's property. - { - SetProperty( keyValue.first.indexKey, keyValue.second ); - } + DoSetProperty( keyValue.first.indexKey, keyValue.second ); break; } case Property::Key::STRING: { if( keyValue.first.stringKey == TEXT_PROPERTY ) { - SetProperty( Toolkit::TextVisual::Property::TEXT, keyValue.second ); + DoSetProperty( Toolkit::TextVisual::Property::TEXT, keyValue.second ); } else if( keyValue.first.stringKey == FONT_FAMILY_PROPERTY ) { - SetProperty( Toolkit::TextVisual::Property::FONT_FAMILY, keyValue.second ); + DoSetProperty( Toolkit::TextVisual::Property::FONT_FAMILY, keyValue.second ); } else if( keyValue.first.stringKey == FONT_STYLE_PROPERTY ) { - SetProperty( Toolkit::TextVisual::Property::FONT_STYLE, keyValue.second ); + DoSetProperty( Toolkit::TextVisual::Property::FONT_STYLE, keyValue.second ); } else if( keyValue.first.stringKey == POINT_SIZE_PROPERTY ) { - SetProperty( Toolkit::TextVisual::Property::POINT_SIZE, keyValue.second ); + DoSetProperty( Toolkit::TextVisual::Property::POINT_SIZE, keyValue.second ); } else if( keyValue.first.stringKey == MULTI_LINE_PROPERTY ) { - SetProperty( Toolkit::TextVisual::Property::MULTI_LINE, keyValue.second ); + DoSetProperty( Toolkit::TextVisual::Property::MULTI_LINE, keyValue.second ); } else if( keyValue.first.stringKey == HORIZONTAL_ALIGNMENT_PROPERTY ) { - SetProperty( Toolkit::TextVisual::Property::HORIZONTAL_ALIGNMENT, keyValue.second ); + DoSetProperty( Toolkit::TextVisual::Property::HORIZONTAL_ALIGNMENT, keyValue.second ); } else if( keyValue.first.stringKey == VERTICAL_ALIGNMENT_PROPERTY ) { - SetProperty( Toolkit::TextVisual::Property::VERTICAL_ALIGNMENT, keyValue.second ); + DoSetProperty( Toolkit::TextVisual::Property::VERTICAL_ALIGNMENT, keyValue.second ); } else if( keyValue.first.stringKey == TEXT_COLOR_PROPERTY ) { - SetProperty( Toolkit::TextVisual::Property::TEXT_COLOR, keyValue.second ); + DoSetProperty( Toolkit::TextVisual::Property::TEXT_COLOR, keyValue.second ); } else if( keyValue.first.stringKey == ENABLE_MARKUP_PROPERTY ) { - SetProperty( Toolkit::TextVisual::Property::ENABLE_MARKUP, keyValue.second ); + DoSetProperty( Toolkit::TextVisual::Property::ENABLE_MARKUP, keyValue.second ); } break; } @@ -262,7 +259,25 @@ void TextVisual::DoSetOnStage( Actor& actor ) { mControl = actor; - CreateRenderer(); + Geometry geometry = mFactoryCache.GetGeometry( VisualFactoryCache::QUAD_GEOMETRY ); + if( !geometry ) + { + geometry = VisualFactoryCache::CreateQuadGeometry(); + mFactoryCache.SaveGeometry( VisualFactoryCache::QUAD_GEOMETRY , geometry ); + } + + Shader shader = mFactoryCache.GetShader( VisualFactoryCache::IMAGE_SHADER_ATLAS_DEFAULT_WRAP ); + if( !shader ) + { + shader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER_ATLAS_CLAMP ); + mFactoryCache.SaveShader( VisualFactoryCache::IMAGE_SHADER_ATLAS_DEFAULT_WRAP, shader ); + } + shader.RegisterProperty( PIXEL_AREA_UNIFORM_NAME, FULL_TEXTURE_RECT ); + + mImpl->mRenderer = Renderer::New( geometry, shader ); + mImpl->mRenderer.SetProperty( Dali::Renderer::Property::DEPTH_INDEX, Toolkit::DepthIndex::TEXT ); + + UpdateRenderer(); } void TextVisual::DoSetOffStage( Actor& actor ) @@ -272,17 +287,31 @@ void TextVisual::DoSetOffStage( Actor& actor ) // Removes the renderer from the actor. actor.RemoveRenderer( mImpl->mRenderer ); - DestroyRenderer(); + RemoveTextureSet(); + + // Resets the renderer. + mImpl->mRenderer.Reset(); } // Resets the control handle. mControl.Reset(); } -void TextVisual::SetProperty( Dali::Property::Index index, const Dali::Property::Value& propertyValue ) +void TextVisual::OnSetTransform() +{ + UpdateRenderer(); +} + +void TextVisual::DoSetProperty( Dali::Property::Index index, const Dali::Property::Value& propertyValue ) { switch( index ) { + case Toolkit::TextVisual::Property::ENABLE_MARKUP: + { + const bool enableMarkup = propertyValue.Get(); + mController->SetMarkupProcessorEnabled( enableMarkup ); + break; + } case Toolkit::TextVisual::Property::TEXT: { mController->SetText( propertyValue.Get() ); @@ -301,7 +330,6 @@ void TextVisual::SetProperty( Dali::Property::Index index, const Dali::Property: case Toolkit::TextVisual::Property::POINT_SIZE: { const float pointSize = propertyValue.Get(); - if( !Equals( mController->GetDefaultPointSize(), pointSize ) ) { mController->SetDefaultPointSize( pointSize ); @@ -346,26 +374,10 @@ void TextVisual::SetProperty( Dali::Property::Index index, const Dali::Property: } break; } - case Toolkit::TextVisual::Property::ENABLE_MARKUP: - { - const bool enableMarkup = propertyValue.Get(); - mController->SetMarkupProcessorEnabled( enableMarkup ); - break; - } - default: - { - // Should not arrive here. - DALI_ASSERT_DEBUG( false ); - } } } -void TextVisual::OnSetTransform() -{ - CreateRenderer(); -} - -void TextVisual::CreateRenderer() +void TextVisual::UpdateRenderer() { Actor control = mControl.GetHandle(); if( !control ) @@ -386,12 +398,13 @@ void TextVisual::CreateRenderer() if( ( fabsf( relayoutSize.width ) < Math::MACHINE_EPSILON_1000 ) || ( fabsf( relayoutSize.height ) < Math::MACHINE_EPSILON_1000 ) ) { + // Removes the texture set. + RemoveTextureSet(); + // Remove any renderer previously set. if( mImpl->mRenderer ) { control.RemoveRenderer( mImpl->mRenderer ); - - DestroyRenderer(); } // Nothing else to do if the relayout size is zero. @@ -402,12 +415,13 @@ void TextVisual::CreateRenderer() if( Text::Controller::NONE_UPDATED != ( Text::Controller::MODEL_UPDATED & updateTextType ) ) { + // Removes the texture set. + RemoveTextureSet(); + // Remove any renderer previously set. if( mImpl->mRenderer ) { control.RemoveRenderer( mImpl->mRenderer ); - - DestroyRenderer(); } if( ( relayoutSize.width > Math::MACHINE_EPSILON_1000 ) && @@ -415,68 +429,65 @@ void TextVisual::CreateRenderer() { PixelData data = mTypesetter->Render( relayoutSize ); - Geometry geometry; - Shader shader; - TextureSet textureSet; + Vector4 atlasRect = FULL_TEXTURE_RECT; + TextureSet textureSet = mFactoryCache.GetAtlasManager()->Add( atlasRect, data ); - Vector4 atlasRect; + if( textureSet ) + { + mImpl->mFlags |= Impl::IS_ATLASING_APPLIED; + } + else + { + // It may happen the image atlas can't handle a pixel data it exceeds the maximum size. + // In that case, create a texture. TODO: should tile the text. - textureSet = mFactoryCache.GetAtlasManager()->Add( atlasRect, data ); - mImpl->mFlags |= Impl::IS_ATLASING_APPLIED; + Texture texture = Texture::New( Dali::TextureType::TEXTURE_2D, + data.GetPixelFormat(), + data.GetWidth(), + data.GetHeight() ); - // Filter mode needs to be set to nearest to avoid blurry text. - Sampler sampler = Sampler::New(); - sampler.SetFilterMode( FilterMode::NEAREST, FilterMode::NEAREST ); - textureSet.SetSampler( 0u, sampler ); + texture.Upload( data ); - geometry = mFactoryCache.GetGeometry( VisualFactoryCache::QUAD_GEOMETRY ); - if( !geometry ) - { - geometry = VisualFactoryCache::CreateQuadGeometry(); - mFactoryCache.SaveGeometry( VisualFactoryCache::QUAD_GEOMETRY , geometry ); - } + textureSet = TextureSet::New(); + textureSet.SetTexture( 0u, texture ); - shader = mFactoryCache.GetShader( VisualFactoryCache::IMAGE_SHADER_ATLAS_DEFAULT_WRAP ); - if( !shader ) - { - shader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER_ATLAS_CLAMP ); - mFactoryCache.SaveShader( VisualFactoryCache::IMAGE_SHADER_ATLAS_DEFAULT_WRAP, shader ); + mImpl->mFlags &= ~Impl::IS_ATLASING_APPLIED; } - shader.RegisterProperty( PIXEL_AREA_UNIFORM_NAME, FULL_TEXTURE_RECT ); - mImpl->mRenderer = Renderer::New( geometry, shader ); - mImpl->mRenderer.SetProperty( Dali::Renderer::Property::DEPTH_INDEX, Toolkit::DepthIndex::TEXT ); mImpl->mRenderer.RegisterProperty( ATLAS_RECT_UNIFORM_NAME, atlasRect ); - mImpl->mRenderer.SetTextures( textureSet ); - - control.AddRenderer( mImpl->mRenderer ); - //Register transform properties mImpl->mTransform.RegisterUniforms( mImpl->mRenderer, Direction::LEFT_TO_RIGHT ); - mImpl->mFlags |= Impl::IS_FROM_CACHE; + // Filter mode needs to be set to nearest to avoid blurry text. + Sampler sampler = Sampler::New(); + sampler.SetFilterMode( FilterMode::NEAREST, FilterMode::NEAREST ); + textureSet.SetSampler( 0u, sampler ); + + mImpl->mRenderer.SetTextures( textureSet ); + + control.AddRenderer( mImpl->mRenderer ); } } } -void TextVisual::DestroyRenderer() +void TextVisual::RemoveTextureSet() { - // Removes the text's image from the texture atlas. - Vector4 atlasRect; - - const Property::Index index = mImpl->mRenderer.GetPropertyIndex( ATLAS_RECT_UNIFORM_NAME ); - if( index != Property::INVALID_INDEX ) + if( mImpl->mFlags & Impl::IS_ATLASING_APPLIED ) { - const Property::Value& atlasRectValue = mImpl->mRenderer.GetProperty( index ); - atlasRectValue.Get( atlasRect ); + // Removes the text's image from the texture atlas. + Vector4 atlasRect; - const TextureSet& textureSet = mImpl->mRenderer.GetTextures(); - mFactoryCache.GetAtlasManager()->Remove( textureSet, atlasRect ); - } + const Property::Index index = mImpl->mRenderer.GetPropertyIndex( ATLAS_RECT_UNIFORM_NAME ); + if( index != Property::INVALID_INDEX ) + { + const Property::Value& atlasRectValue = mImpl->mRenderer.GetProperty( index ); + atlasRectValue.Get( atlasRect ); - // Resets the renderer. - mImpl->mRenderer.Reset(); + const TextureSet& textureSet = mImpl->mRenderer.GetTextures(); + mFactoryCache.GetAtlasManager()->Remove( textureSet, atlasRect ); + } + } } } // namespace Internal diff --git a/dali-toolkit/internal/visuals/text/text-visual.h b/dali-toolkit/internal/visuals/text/text-visual.h index f3d9516..7cee7bf 100644 --- a/dali-toolkit/internal/visuals/text/text-visual.h +++ b/dali-toolkit/internal/visuals/text/text-visual.h @@ -129,24 +129,24 @@ protected: virtual void OnSetTransform(); private: - /** - * Set the individual property to the given value - * @param[in] index The index key used to reference this value within the initial - * property map. - * @param[in] propertyValue The value to set + * @brief Set the individual property to the given value. + * + * @param[in] index The index key used to reference this value within the initial property map. + * + * @param[in] propertyValue The value to set. */ - void SetProperty( Dali::Property::Index index, const Dali::Property::Value& propertyValue ); + void DoSetProperty( Dali::Property::Index index, const Dali::Property::Value& propertyValue ); /** - * @brief Creates the text's renderer. + * @brief Updates the text's renderer. */ - void CreateRenderer(); + void UpdateRenderer(); /** - * @brief Destroys the text's renderer. + * @brief Removes the texture set from the renderer. */ - void DestroyRenderer(); + void RemoveTextureSet(); private: Text::ControllerPtr mController; ///< The text's controller.