Merge "Text background support for TextLabel" into devel/master
authorAdeel Kazmi <adeel.kazmi@samsung.com>
Fri, 16 Feb 2018 15:30:21 +0000 (15:30 +0000)
committerGerrit Code Review <gerrit@review.ap-northeast-2.compute.internal>
Fri, 16 Feb 2018 15:30:21 +0000 (15:30 +0000)
1  2 
dali-toolkit/internal/visuals/text/text-visual.cpp

@@@ -61,6 -61,7 +61,7 @@@ const char * const ENABLE_MARKUP_PROPER
  const char * const SHADOW_PROPERTY( "shadow" );
  const char * const UNDERLINE_PROPERTY( "underline" );
  const char * const OUTLINE_PROPERTY( "outline" );
+ const char * const BACKGROUND_PROPERTY( "textBackground" );
  
  const Vector4 FULL_TEXTURE_RECT( 0.f, 0.f, 1.f, 1.f );
  
@@@ -335,6 -336,10 +336,10 @@@ Dali::Property::Index StringKeyToIndexK
    {
      result = Toolkit::DevelTextVisual::Property::OUTLINE;
    }
+   else if( stringKey == BACKGROUND_PROPERTY )
+   {
+     result = Toolkit::DevelTextVisual::Property::BACKGROUND;
+   }
  
    return result;
  }
@@@ -415,6 -420,9 +420,9 @@@ void TextVisual::DoCreatePropertyMap( P
  
    GetOutlineProperties( mController, value, Text::EffectStyle::DEFAULT );
    map.Insert( Toolkit::DevelTextVisual::Property::OUTLINE, value );
+   GetBackgroundProperties( mController, value, Text::EffectStyle::DEFAULT );
+   map.Insert( Toolkit::DevelTextVisual::Property::BACKGROUND, value );
  }
  
  void TextVisual::DoCreateInstancePropertyMap( Property::Map& map ) const
@@@ -608,6 -616,11 +616,11 @@@ void TextVisual::DoSetProperty( Dali::P
        SetOutlineProperties( mController, propertyValue, Text::EffectStyle::DEFAULT );
        break;
      }
+     case Toolkit::DevelTextVisual::Property::BACKGROUND:
+     {
+       SetBackgroundProperties( mController, propertyValue, Text::EffectStyle::DEFAULT );
+       break;
+     }
    }
  }
  
@@@ -672,21 -685,17 +685,21 @@@ void TextVisual::UpdateRenderer(
        const Vector4* const colorsBuffer = mController->GetTextModel()->GetColors();
        bool hasMultipleTextColors = ( NULL != colorsBuffer );
  
 -      // Check whether the text contains any emoji
 -      bool containsEmoji = false;
 +      // Check whether the text contains any color glyph
 +      bool containsColorGlyph = false;
  
 -      Text::ScriptRunIndex numberOfScripts = mController->GetTextModel()->GetNumberOfScripts();
 -      const Text::ScriptRun* scripts = mController->GetTextModel()->GetScriptRuns();
 -      for ( Text::ScriptRunIndex scriptIndex = 0u; scriptIndex < numberOfScripts; scriptIndex++ )
 +      TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
 +      const Text::GlyphInfo* const glyphsBuffer = mController->GetTextModel()->GetGlyphs();
 +      const Text::Length numberOfGlyphs = mController->GetTextModel()->GetNumberOfGlyphs();
 +      for ( Text::Length glyphIndex = 0; glyphIndex < numberOfGlyphs; glyphIndex++ )
        {
 -        const Text::ScriptRun& scriptRun = *( scripts + scriptIndex );
 -        if( TextAbstraction::EMOJI == scriptRun.script )
 +        // Retrieve the glyph's info.
 +        const Text::GlyphInfo* const glyphInfo = glyphsBuffer + glyphIndex;
 +
 +        // Whether the current glyph is a color one.
 +        if( fontClient.IsColorGlyph( glyphInfo->fontId, glyphInfo->index ) )
          {
 -          containsEmoji = true;
 +          containsColorGlyph = true;
            break;
          }
        }
  
        const bool underlineEnabled = mController->GetTextModel()->IsUnderlineEnabled();
        const bool outlineEnabled = ( mController->GetTextModel()->GetOutlineWidth() > Math::MACHINE_EPSILON_1 );
+       const bool backgroundEnabled = mController->GetTextModel()->IsBackgroundEnabled();;
  
-       const bool styleEnabled = ( shadowEnabled || underlineEnabled || outlineEnabled );
+       const bool styleEnabled = ( shadowEnabled || underlineEnabled || outlineEnabled || backgroundEnabled );
  
 -      TextureSet textureSet = GetTextTexture( relayoutSize, hasMultipleTextColors, containsEmoji, styleEnabled );
 +      TextureSet textureSet = GetTextTexture( relayoutSize, hasMultipleTextColors, containsColorGlyph, styleEnabled );
        mImpl->mRenderer.SetTextures( textureSet );
  
 -      Shader shader = GetTextShader( mFactoryCache, hasMultipleTextColors, containsEmoji, styleEnabled );
 +      Shader shader = GetTextShader( mFactoryCache, hasMultipleTextColors, containsColorGlyph, styleEnabled );
        mImpl->mRenderer.SetShader(shader);
  
        mImpl->mFlags &= ~Impl::IS_ATLASING_APPLIED;
@@@ -749,7 -759,7 +763,7 @@@ void TextVisual::RemoveTextureSet(
    }
  }
  
 -TextureSet TextVisual::GetTextTexture( const Vector2& size, bool hasMultipleTextColors, bool containsEmoji, bool styleEnabled )
 +TextureSet TextVisual::GetTextTexture( const Vector2& size, bool hasMultipleTextColors, bool containsColorGlyph, bool styleEnabled )
  {
    // Filter mode needs to be set to linear to produce better quality while scaling.
    Sampler sampler = Sampler::New();
    TextureSet textureSet = TextureSet::New();
  
    // Create RGBA texture if the text contains emojis or multiple text colors, otherwise L8 texture
 -  Pixel::Format textPixelFormat = ( containsEmoji || hasMultipleTextColors ) ? Pixel::RGBA8888 : Pixel::L8;
 +  Pixel::Format textPixelFormat = ( containsColorGlyph || hasMultipleTextColors ) ? Pixel::RGBA8888 : Pixel::L8;
  
    // Check the text direction
    Toolkit::DevelText::TextDirection::Type textDirection = mController->GetTextDirection();
      textureSet.SetSampler( 1u, sampler );
    }
  
 -  if ( containsEmoji && !hasMultipleTextColors )
 +  if ( containsColorGlyph && !hasMultipleTextColors )
    {
      // Create a L8 texture as a mask to avoid color glyphs (e.g. emojis) to be affected by text color animation
      PixelData maskData = mTypesetter->Render( size, textDirection, Text::Typesetter::RENDER_MASK, false, Pixel::L8 );
    return textureSet;
  }
  
 -Shader TextVisual::GetTextShader( VisualFactoryCache& factoryCache, bool hasMultipleTextColors, bool containsEmoji, bool styleEnabled )
 +Shader TextVisual::GetTextShader( VisualFactoryCache& factoryCache, bool hasMultipleTextColors, bool containsColorGlyph, bool styleEnabled )
  {
    Shader shader;
  
        factoryCache.SaveShader( VisualFactoryCache::TEXT_SHADER_MULTI_COLOR_TEXT_WITH_STYLE, shader );
      }
    }
 -  else if( !hasMultipleTextColors && !containsEmoji && !styleEnabled )
 +  else if( !hasMultipleTextColors && !containsColorGlyph && !styleEnabled )
    {
      shader = factoryCache.GetShader( VisualFactoryCache::TEXT_SHADER_SINGLE_COLOR_TEXT );
      if( !shader )
        factoryCache.SaveShader( VisualFactoryCache::TEXT_SHADER_SINGLE_COLOR_TEXT, shader );
      }
    }
 -  else if( !hasMultipleTextColors && !containsEmoji && styleEnabled )
 +  else if( !hasMultipleTextColors && !containsColorGlyph && styleEnabled )
    {
      shader = factoryCache.GetShader( VisualFactoryCache::TEXT_SHADER_SINGLE_COLOR_TEXT_WITH_STYLE );
      if( !shader )
        factoryCache.SaveShader( VisualFactoryCache::TEXT_SHADER_SINGLE_COLOR_TEXT_WITH_STYLE, shader );
      }
    }
 -  else if( !hasMultipleTextColors && containsEmoji && !styleEnabled )
 +  else if( !hasMultipleTextColors && containsColorGlyph && !styleEnabled )
    {
      shader = factoryCache.GetShader( VisualFactoryCache::TEXT_SHADER_SINGLE_COLOR_TEXT_WITH_EMOJI );
      if( !shader )
        factoryCache.SaveShader( VisualFactoryCache::TEXT_SHADER_SINGLE_COLOR_TEXT_WITH_EMOJI, shader );
      }
    }
 -  else // if( !hasMultipleTextColors && containsEmoji && styleEnabled )
 +  else // if( !hasMultipleTextColors && containsColorGlyph && styleEnabled )
    {
      shader = factoryCache.GetShader( VisualFactoryCache::TEXT_SHADER_SINGLE_COLOR_TEXT_WITH_STYLE_AND_EMOJI );
      if( !shader )