X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fvisuals%2Ftext%2Ftext-visual.cpp;h=abca28163e8a8201f5c59a4d9d9b033d2712ed42;hb=45fc50ae7d1c0b9d33d47da82e2ac8e928e992f9;hp=b67617abc47626da49f796314efd0cb8eb8784b6;hpb=ee431c9e2b342243f9e0e2b6bafca7505d321457;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/visuals/text/text-visual.cpp b/dali-toolkit/internal/visuals/text/text-visual.cpp index b67617a..abca281 100644 --- a/dali-toolkit/internal/visuals/text/text-visual.cpp +++ b/dali-toolkit/internal/visuals/text/text-visual.cpp @@ -19,7 +19,6 @@ #include // INTERNAL HEADER -#include #include #include #include @@ -41,8 +40,7 @@ namespace Internal namespace { -// Property names. -const char * const TEXT_PROPERTY( "text" ); +// Property names - common properties defined in visual-string-constants.h/cpp const char * const FONT_FAMILY_PROPERTY( "fontFamily" ); const char * const FONT_STYLE_PROPERTY( "fontStyle" ); const char * const POINT_SIZE_PROPERTY( "pointSize" ); @@ -95,9 +93,13 @@ const char* VERTEX_SHADER = DALI_COMPOSE_SHADER( uniform mediump mat4 uMvpMatrix;\n uniform mediump vec3 uSize;\n uniform mediump vec4 pixelArea; + + uniform mediump mat4 uModelMatrix;\n + uniform mediump mat4 uViewMatrix;\n + uniform mediump mat4 uProjection;\n + varying mediump vec2 vTexCoord;\n \n - //Visual size and offset uniform mediump vec2 offset;\n uniform mediump vec2 size;\n @@ -114,7 +116,10 @@ const char* VERTEX_SHADER = DALI_COMPOSE_SHADER( void main()\n {\n - mediump vec4 vertexPosition = uMvpMatrix *ComputeVertexPosition();\n + mediump vec4 nonAlignedVertex = uViewMatrix*uModelMatrix*ComputeVertexPosition();\n + mediump vec4 pixelAlignedVertex = vec4 ( floor(nonAlignedVertex.xyz), 1.0 );\n + mediump vec4 vertexPosition = uProjection*pixelAlignedVertex;\n + vTexCoord = pixelArea.xy+pixelArea.zw*(aPosition + vec2(0.5) );\n gl_Position = vertexPosition;\n }\n @@ -125,22 +130,25 @@ const char* FRAGMENT_SHADER_ATLAS_CLAMP = DALI_COMPOSE_SHADER( uniform sampler2D sTexture;\n uniform mediump vec4 uAtlasRect;\n uniform lowp vec4 uColor;\n + uniform lowp vec4 mixColor;\n \n void main()\n {\n mediump vec2 texCoord = clamp( mix( uAtlasRect.xy, uAtlasRect.zw, vTexCoord ), uAtlasRect.xy, uAtlasRect.zw );\n - gl_FragColor = texture2D( sTexture, texCoord ) * uColor;\n + gl_FragColor = texture2D( sTexture, texCoord ) * uColor * mixColor;\n }\n ); } // unnamed namespace -TextVisualPtr TextVisual::New( VisualFactoryCache& factoryCache ) +TextVisualPtr TextVisual::New( VisualFactoryCache& factoryCache, const Property::Map& properties ) { - return new TextVisual( factoryCache ); + TextVisualPtr TextVisualPtr( new TextVisual( factoryCache ) ); + TextVisualPtr->SetProperties( properties ); + return TextVisualPtr; } -float TextVisual::GetHeightForWidth( float width ) const +float TextVisual::GetHeightForWidth( float width ) { return mController->GetHeightForWidth( width ); } @@ -155,7 +163,7 @@ void TextVisual::DoCreatePropertyMap( Property::Map& map ) const Property::Value value; map.Clear(); - map.Insert( Toolkit::VisualProperty::TYPE, Toolkit::DevelVisual::TEXT ); + map.Insert( Toolkit::DevelVisual::Property::TYPE, Toolkit::DevelVisual::TEXT ); std::string text; mController->GetText( text ); @@ -200,10 +208,7 @@ void TextVisual::DoSetProperties( const Property::Map& propertyMap ) { case Property::Key::INDEX: { - if( Toolkit::VisualProperty::TYPE != keyValue.first.indexKey ) // Toolkit::VisualProperty::TYPE is not a TextVisual's property. - { - DoSetProperty( keyValue.first.indexKey, keyValue.second ); - } + DoSetProperty( keyValue.first.indexKey, keyValue.second ); break; } case Property::Key::STRING: @@ -263,7 +268,21 @@ void TextVisual::DoSetOnStage( Actor& actor ) { mControl = actor; - CreateRenderer(); + Geometry geometry = mFactoryCache.GetGeometry( VisualFactoryCache::QUAD_GEOMETRY ); + + Shader shader = mFactoryCache.GetShader( VisualFactoryCache::TEXT_SHADER ); + if( ! shader ) + { + shader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER_ATLAS_CLAMP ); + shader.RegisterProperty( PIXEL_AREA_UNIFORM_NAME, FULL_TEXTURE_RECT ); + + mFactoryCache.SaveShader( VisualFactoryCache::TEXT_SHADER, shader ); + } + + mImpl->mRenderer = Renderer::New( geometry, shader ); + mImpl->mRenderer.SetProperty( Dali::Renderer::Property::DEPTH_INDEX, Toolkit::DepthIndex::TEXT ); + + UpdateRenderer(); } void TextVisual::DoSetOffStage( Actor& actor ) @@ -273,17 +292,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::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() ); @@ -302,7 +335,6 @@ void TextVisual::DoSetProperty( Dali::Property::Index index, const Dali::Propert case Toolkit::TextVisual::Property::POINT_SIZE: { const float pointSize = propertyValue.Get(); - if( !Equals( mController->GetDefaultPointSize(), pointSize ) ) { mController->SetDefaultPointSize( pointSize ); @@ -347,101 +379,10 @@ void TextVisual::DoSetProperty( Dali::Property::Index index, const Dali::Propert } 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 ); - } - } -} - -Dali::Property::Value TextVisual::DoGetProperty( Dali::Property::Index index ) -{ - Dali::Property::Value value; - - switch( index ) - { - case Toolkit::TextVisual::Property::TEXT: - { - std::string text; - mController->GetText( text ); - value = text; - break; - } - case Toolkit::TextVisual::Property::FONT_FAMILY: - { - value = mController->GetDefaultFontFamily(); - break; - } - case Toolkit::TextVisual::Property::FONT_STYLE: - { - GetFontStyleProperty( mController, value, Text::FontStyle::DEFAULT ); - break; - } - case Toolkit::TextVisual::Property::POINT_SIZE: - { - value = mController->GetDefaultPointSize(); - break; - } - case Toolkit::TextVisual::Property::MULTI_LINE: - { - value = mController->IsMultiLineEnabled(); - break; - } - case Toolkit::TextVisual::Property::HORIZONTAL_ALIGNMENT: - { - const char* name = Scripting::GetEnumerationName< Toolkit::Text::Layout::HorizontalAlignment >( mController->GetHorizontalAlignment(), - HORIZONTAL_ALIGNMENT_STRING_TABLE, - HORIZONTAL_ALIGNMENT_STRING_TABLE_COUNT ); - if( name ) - { - value = std::string( name ); - } - break; - } - case Toolkit::TextVisual::Property::VERTICAL_ALIGNMENT: - { - const char* name = Scripting::GetEnumerationName< Toolkit::Text::Layout::VerticalAlignment >( mController->GetVerticalAlignment(), - VERTICAL_ALIGNMENT_STRING_TABLE, - VERTICAL_ALIGNMENT_STRING_TABLE_COUNT ); - if( name ) - { - value = std::string( name ); - } - break; - } - case Toolkit::TextVisual::Property::TEXT_COLOR: - { - value = mController->GetDefaultColor(); - break; - } - case Toolkit::TextVisual::Property::ENABLE_MARKUP: - { - value = mController->IsMarkupProcessorEnabled(); - break; - } - default: - { - // Should not arrive here. - DALI_ASSERT_DEBUG( false ); - } } - - return value; } -void TextVisual::OnSetTransform() -{ - CreateRenderer(); -} - -void TextVisual::CreateRenderer() +void TextVisual::UpdateRenderer() { Actor control = mControl.GetHandle(); if( !control ) @@ -462,12 +403,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. @@ -478,12 +420,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 ) && @@ -491,68 +434,59 @@ void TextVisual::CreateRenderer() { PixelData data = mTypesetter->Render( relayoutSize ); - Geometry geometry; - Shader shader; - TextureSet textureSet; + Vector4 atlasRect = FULL_TEXTURE_RECT; - Vector4 atlasRect; + // Texture set not retrieved from Atlas Manager whilst pixel offset visible. - textureSet = mFactoryCache.GetAtlasManager()->Add( atlasRect, data ); - mImpl->mFlags |= Impl::IS_ATLASING_APPLIED; + // 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. - // 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 texture = Texture::New( Dali::TextureType::TEXTURE_2D, + data.GetPixelFormat(), + data.GetWidth(), + data.GetHeight() ); - geometry = mFactoryCache.GetGeometry( VisualFactoryCache::QUAD_GEOMETRY ); - if( !geometry ) - { - geometry = VisualFactoryCache::CreateQuadGeometry(); - mFactoryCache.SaveGeometry( VisualFactoryCache::QUAD_GEOMETRY , geometry ); - } + texture.Upload( data ); - 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 ); + TextureSet textureSet = TextureSet::New(); + textureSet.SetTexture( 0u, texture ); - 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->mFlags &= ~Impl::IS_ATLASING_APPLIED; - mImpl->mRenderer.SetTextures( textureSet ); - - control.AddRenderer( mImpl->mRenderer ); + mImpl->mRenderer.RegisterProperty( ATLAS_RECT_UNIFORM_NAME, atlasRect ); //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