TextParameters object now contains only the specific parameters set
[platform/core/uifw/dali-core.git] / dali / internal / common / text-parameters.cpp
index 1ff5a13..8bf42b9 100644 (file)
@@ -27,20 +27,7 @@ namespace Internal
 {
 
 TextParameters::TextParameters()
-: mOutlineEnabled( false ),
-  mGlowEnabled( false ),
-  mDropShadowEnabled( false ),
-  mGradientEnabled( false ),
-  mOutlineColor( TextStyle::DEFAULT_OUTLINE_COLOR ),
-  mOutline( TextStyle::DEFAULT_OUTLINE_THICKNESS ),
-  mGlowColor( TextStyle::DEFAULT_GLOW_COLOR ),
-  mGlow( TextStyle::DEFAULT_GLOW_INTENSITY ),
-  mDropShadowColor( TextStyle::DEFAULT_SHADOW_COLOR ),
-  mDropShadow( TextStyle::DEFAULT_SHADOW_OFFSET ),
-  mDropShadowSize( TextStyle::DEFAULT_SHADOW_SIZE ),
-  mGradientColor( TextStyle::DEFAULT_GRADIENT_COLOR ),
-  mGradientStartPoint( TextStyle::DEFAULT_GRADIENT_START_POINT ),
-  mGradientEndPoint( TextStyle::DEFAULT_GRADIENT_END_POINT )
+: mFlags( 0 )
 {
 }
 
@@ -51,32 +38,272 @@ TextParameters::~TextParameters()
 
 void TextParameters::SetOutline( bool enable, const Vector4& color, const Vector2& thickness )
 {
-  mOutlineEnabled = enable;
-  mOutlineColor = color;
-  mOutline = thickness;
+  if ( mFlags & OUTLINE_ENABLED )
+  {
+    OutlineAttributes* attrPtr = AnyCast< OutlineAttributes >( &mParameters[ mFlags & TEXT_PARAMETER_MASK ] );
+    attrPtr->mOutlineColor = color;
+    attrPtr->mOutlineThickness = thickness;
+  }
+  else
+  {
+    OutlineAttributes attr;
+    attr.mOutlineColor = color;
+    attr.mOutlineThickness = thickness;
+    mParameters.push_back( attr );
+    mFlags |= ( ( mFlags & ~OUTLINE_INDEX ) | ( ( mParameters.size() - 1 ) & TEXT_PARAMETER_MASK ) | OUTLINE_ENABLED );
+  }
 }
 
 void TextParameters::SetGlow( bool enable, const Vector4& color, const float intensity)
 {
-  mGlowEnabled = enable;
-  mGlowColor = color;
-  mGlow = intensity;
+  if ( mFlags & GLOW_ENABLED )
+  {
+    GlowAttributes* attrPtr = AnyCast< GlowAttributes >( &mParameters[ ( mFlags >> GLOW_INDEX_SHIFT ) & TEXT_PARAMETER_MASK ] );
+    attrPtr->mGlowColor = color;
+    attrPtr->mGlowIntensity = intensity;
+  }
+  else
+  {
+    GlowAttributes attr;
+    attr.mGlowColor = color;
+    attr.mGlowIntensity = intensity;
+    mParameters.push_back( attr );
+    mFlags |= ( ( mFlags & ~GLOW_INDEX ) | ( ( ( mParameters.size() - 1 ) & TEXT_PARAMETER_MASK ) << GLOW_INDEX_SHIFT ) | GLOW_ENABLED );
+  }
 }
 
 void TextParameters::SetShadow( bool enable, const Vector4& color, const Vector2& offset, const float size )
 {
-  mDropShadowEnabled = enable;
-  mDropShadowColor = color;
-  mDropShadow = offset;
-  mDropShadowSize = size;
+  if ( mFlags & DROP_SHADOW_ENABLED )
+  {
+    DropShadowAttributes* attrPtr = AnyCast< DropShadowAttributes >( &mParameters[ ( mFlags >> DROP_SHADOW_INDEX_SHIFT ) & TEXT_PARAMETER_MASK ] );
+    attrPtr->mDropShadowColor = color;
+    attrPtr->mDropShadowOffset = offset;
+    attrPtr->mDropShadowSize = size;
+  }
+  else
+  {
+    DropShadowAttributes attr;
+    attr.mDropShadowColor = color;
+    attr.mDropShadowOffset = offset;
+    attr.mDropShadowSize = size;
+    mParameters.push_back( attr );
+    mFlags |= ( ( mFlags & ~DROP_SHADOW_INDEX ) | ( ( ( mParameters.size() - 1 ) & TEXT_PARAMETER_MASK ) << DROP_SHADOW_INDEX_SHIFT ) | DROP_SHADOW_ENABLED );
+  }
 }
 
 void TextParameters::SetGradient( const Vector4& color, const Vector2& start, const Vector2& end )
 {
-  mGradientEnabled = end != start;
-  mGradientColor = color;
-  mGradientStartPoint = start;
-  mGradientEndPoint = end;
+  if ( mFlags & GRADIENT_EXISTS )
+  {
+    GradientAttributes* attrPtr = AnyCast< GradientAttributes >( &mParameters[ ( mFlags >> GRADIENT_INDEX_SHIFT ) & TEXT_PARAMETER_MASK ] );
+    attrPtr->mGradientColor = color;
+    attrPtr->mGradientStartPoint = start;
+    attrPtr->mGradientEndPoint = end;
+  }
+  else
+  {
+    GradientAttributes attr;
+    attr.mGradientColor = color;
+    attr.mGradientStartPoint = start;
+    attr.mGradientEndPoint = end;
+    mParameters.push_back( attr );
+    mFlags |= ( ( mFlags & ~GRADIENT_INDEX ) | ( ( ( mParameters.size() - 1 ) & TEXT_PARAMETER_MASK ) << GRADIENT_INDEX_SHIFT ) | GRADIENT_EXISTS );
+  }
+
+  if ( end != start )
+  {
+    mFlags |= GRADIENT_ENABLED;
+  }
+  else
+  {
+    mFlags &=~GRADIENT_ENABLED;
+  }
+}
+
+void TextParameters::SetGradientColor( const Vector4& color )
+{
+  if ( mFlags & GRADIENT_EXISTS )
+  {
+    GradientAttributes* attrPtr = AnyCast< GradientAttributes >( &mParameters[ ( mFlags >> GRADIENT_INDEX_SHIFT ) & TEXT_PARAMETER_MASK ] );
+    attrPtr->mGradientColor = color;
+  }
+  else
+  {
+    GradientAttributes attr;
+    attr.mGradientColor = color;
+    attr.mGradientStartPoint = TextStyle::DEFAULT_GRADIENT_START_POINT;
+    attr.mGradientEndPoint = TextStyle::DEFAULT_GRADIENT_END_POINT;
+    mParameters.push_back( attr );
+    mFlags |= ( ( mFlags & ~GRADIENT_INDEX ) | ( ( ( mParameters.size() - 1 ) & TEXT_PARAMETER_MASK ) << GRADIENT_INDEX_SHIFT ) | GRADIENT_EXISTS );
+  }
+}
+
+void TextParameters::SetGradientStartPoint( const Vector2& start )
+{
+  if ( mFlags & GRADIENT_EXISTS )
+  {
+    GradientAttributes* attrPtr = AnyCast< GradientAttributes >( &mParameters[ ( mFlags >> GRADIENT_INDEX_SHIFT ) & TEXT_PARAMETER_MASK ] );
+    attrPtr->mGradientStartPoint = start;
+  }
+  else
+  {
+    GradientAttributes attr;
+    attr.mGradientStartPoint = start;
+    attr.mGradientEndPoint = TextStyle::DEFAULT_GRADIENT_END_POINT;
+    attr.mGradientColor = TextStyle::DEFAULT_GRADIENT_COLOR;
+    mParameters.push_back( attr );
+    mFlags |= ( ( mFlags & ~GRADIENT_INDEX ) | ( ( ( mParameters.size() - 1 ) & TEXT_PARAMETER_MASK ) << GRADIENT_INDEX_SHIFT ) | GRADIENT_EXISTS );
+  }
+}
+
+void TextParameters::SetGradientEndPoint( const Vector2& end )
+{
+  if ( mFlags & GRADIENT_EXISTS )
+  {
+    GradientAttributes* attrPtr = AnyCast< GradientAttributes >( &mParameters[ ( mFlags >> GRADIENT_INDEX_SHIFT ) & TEXT_PARAMETER_MASK ] );
+    attrPtr->mGradientEndPoint = end;
+  }
+  else
+  {
+    GradientAttributes attr;
+    attr.mGradientEndPoint = end;
+    attr.mGradientStartPoint = TextStyle::DEFAULT_GRADIENT_START_POINT;
+    attr.mGradientColor = TextStyle::DEFAULT_GRADIENT_COLOR;
+    mParameters.push_back( attr );
+    mFlags |= ( ( mFlags & ~GRADIENT_INDEX ) | ( ( ( mParameters.size() - 1 ) & TEXT_PARAMETER_MASK ) << GRADIENT_INDEX_SHIFT ) | GRADIENT_EXISTS );
+  }
+}
+
+const Vector4& TextParameters::GetOutlineColor()
+{
+  if ( mFlags & OUTLINE_ENABLED )
+  {
+    const OutlineAttributes* attrPtr = AnyCast< OutlineAttributes >( &mParameters[ mFlags & TEXT_PARAMETER_MASK ] );
+    return attrPtr->mOutlineColor;
+  }
+  else
+  {
+    return TextStyle::DEFAULT_OUTLINE_COLOR;
+  }
+}
+
+const Vector2& TextParameters::GetOutlineThickness()
+{
+  if ( mFlags & OUTLINE_ENABLED )
+  {
+    const OutlineAttributes* attrPtr = AnyCast< OutlineAttributes >( &mParameters[ mFlags & TEXT_PARAMETER_MASK ] );
+    return attrPtr->mOutlineThickness;
+  }
+  else
+  {
+    return TextStyle::DEFAULT_OUTLINE_THICKNESS;
+  }
+}
+
+const Vector4& TextParameters::GetGlowColor()
+{
+  if ( mFlags & GLOW_ENABLED )
+  {
+    const GlowAttributes* attrPtr = AnyCast< GlowAttributes >( &mParameters[ ( mFlags >> GLOW_INDEX_SHIFT ) & TEXT_PARAMETER_MASK ] );
+    return attrPtr->mGlowColor;
+  }
+  else
+  {
+    return TextStyle::DEFAULT_GLOW_COLOR;
+  }
+}
+
+float TextParameters::GetGlowIntensity()
+{
+  if ( mFlags & GLOW_ENABLED )
+  {
+    const GlowAttributes* attrPtr = AnyCast< GlowAttributes >( &mParameters[ ( mFlags >> GLOW_INDEX_SHIFT ) & TEXT_PARAMETER_MASK ] );
+    return attrPtr->mGlowIntensity;
+  }
+  else
+  {
+    return TextStyle::DEFAULT_GLOW_INTENSITY;
+  }
+}
+
+const Vector4& TextParameters::GetDropShadowColor()
+{
+  if ( mFlags & DROP_SHADOW_ENABLED )
+  {
+    const DropShadowAttributes* attrPtr = AnyCast< DropShadowAttributes >( &mParameters[ ( mFlags >> DROP_SHADOW_INDEX_SHIFT ) & TEXT_PARAMETER_MASK ] );
+    return attrPtr->mDropShadowColor;
+  }
+  else
+  {
+    return TextStyle::DEFAULT_SHADOW_COLOR;
+  }
+}
+
+const Vector2& TextParameters::GetDropShadowOffset()
+{
+  if ( mFlags & DROP_SHADOW_ENABLED )
+  {
+
+    const DropShadowAttributes* attrPtr = AnyCast< DropShadowAttributes >( &mParameters[ ( mFlags >> DROP_SHADOW_INDEX_SHIFT ) & TEXT_PARAMETER_MASK ] );
+    return attrPtr->mDropShadowOffset;
+  }
+  else
+  {
+    return TextStyle::DEFAULT_SHADOW_OFFSET;
+  }
+}
+
+float TextParameters::GetDropShadowSize()
+{
+  if ( mFlags & DROP_SHADOW_ENABLED )
+  {
+    const DropShadowAttributes* attrPtr = AnyCast< DropShadowAttributes >( &mParameters[ ( mFlags >> DROP_SHADOW_INDEX_SHIFT ) & TEXT_PARAMETER_MASK ] );
+    return attrPtr->mDropShadowSize;
+  }
+  else
+  {
+    return TextStyle::DEFAULT_SHADOW_SIZE;
+  }
+}
+
+const Vector4& TextParameters::GetGradientColor()
+{
+  if ( mFlags & GRADIENT_EXISTS )
+  {
+    const GradientAttributes* attrPtr = AnyCast< GradientAttributes >( &mParameters[ ( mFlags >> GRADIENT_INDEX_SHIFT ) & TEXT_PARAMETER_MASK ] );
+    return attrPtr->mGradientColor;
+  }
+  else
+  {
+    return TextStyle::DEFAULT_GRADIENT_COLOR;
+  }
+}
+
+const Vector2& TextParameters::GetGradientStartPoint()
+{
+  if ( mFlags & GRADIENT_EXISTS )
+  {
+    const GradientAttributes* attrPtr = AnyCast< GradientAttributes >( &mParameters[ ( mFlags >> GRADIENT_INDEX_SHIFT ) & TEXT_PARAMETER_MASK ] );
+    return attrPtr->mGradientStartPoint;
+  }
+  else
+  {
+    return TextStyle::DEFAULT_GRADIENT_START_POINT;
+  }
+}
+
+const Vector2& TextParameters::GetGradientEndPoint()
+{
+  if ( mFlags & GRADIENT_EXISTS )
+  {
+    const GradientAttributes* attrPtr = AnyCast< GradientAttributes >( &mParameters[ ( mFlags >> GRADIENT_INDEX_SHIFT ) & TEXT_PARAMETER_MASK ] );
+    return attrPtr->mGradientEndPoint;
+  }
+  else
+  {
+    return TextStyle::DEFAULT_GRADIENT_END_POINT;
+  }
 }
 
 } // namespace Internal