Merge "Automatically update doxygen configuration to local version." into devel/master
authorAdeel Kazmi <adeel.kazmi@samsung.com>
Wed, 30 Nov 2016 09:17:33 +0000 (01:17 -0800)
committerGerrit Code Review <gerrit@review.vlan103.tizen.org>
Wed, 30 Nov 2016 09:17:33 +0000 (01:17 -0800)
automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp
dali-toolkit/internal/visuals/text/text-visual.cpp
dali-toolkit/internal/visuals/text/text-visual.h
dali-toolkit/public-api/controls/control-impl.cpp

index 04912a0..6e9f11f 100644 (file)
@@ -924,6 +924,7 @@ int UtcDaliVisualGetPropertyMap10(void)
   Property::Map propertyMap;
   propertyMap.Insert( Visual::Property::TYPE, DevelVisual::TEXT );
   propertyMap.Insert( "renderingBackend", static_cast<int>( 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<int>( 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, "<font family='TizenSans' size='12'>Hello world</font>" );
+  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;
 }
index e55b313..e7b40a8 100644 (file)
@@ -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<bool>();
+      mController->SetMarkupProcessorEnabled( enableMarkup );
+      break;
+    }
     case Toolkit::TextVisual::Property::TEXT:
     {
       mController->SetText( propertyValue.Get<std::string>() );
@@ -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<float>();
-
       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<bool>();
-      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
index f3d9516..7cee7bf 100644 (file)
@@ -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.
index 2bc13be..02bbf97 100644 (file)
@@ -584,6 +584,9 @@ void Control::SetBackground( const Property::Map& map )
   {
     RegisterVisual( Toolkit::Control::Property::BACKGROUND, visual );
     visual.SetDepthIndex( DepthIndex::BACKGROUND );
+
+    // Trigger a size negotiation request that may be needed by the new visual to relayout its contents.
+    RelayoutRequest();
   }
 }
 
@@ -602,6 +605,9 @@ void Control::ClearBackground()
 {
    UnregisterVisual( Toolkit::Control::Property::BACKGROUND );
    mImpl->mBackgroundColor = Color::TRANSPARENT;
+
+   // Trigger a size negotiation request that may be needed when unregistering a visual.
+   RelayoutRequest();
 }
 
 void Control::EnableGestureDetection(Gesture::Type type)