Fix the text visual shaders to work with pre-multiplied alpha
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / visuals / visual-base-impl.cpp
index bfd5293..bd31fe7 100644 (file)
@@ -26,7 +26,7 @@
 //INTERNAL HEARDER
 #include <dali-toolkit/public-api/visuals/color-visual-properties.h>
 #include <dali-toolkit/public-api/visuals/primitive-visual-properties.h>
-#include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
+#include <dali-toolkit/public-api/visuals/visual-properties.h>
 #include <dali-toolkit/internal/visuals/visual-base-data-impl.h>
 #include <dali-toolkit/internal/visuals/visual-string-constants.h>
 
@@ -35,6 +35,8 @@ namespace
 #if defined(DEBUG_ENABLED)
 Debug::Filter* gVisualBaseLogFilter = Debug::Filter::New( Debug::NoLogging, false, "LOG_VISUAL_BASE" );
 #endif
+
+const char * const PRE_MULTIPLIED_ALPHA_PROPERTY( "preMultipliedAlpha" );
 }
 
 namespace Dali
@@ -82,29 +84,29 @@ void Visual::Base::SetProperties( const Property::Map& propertyMap )
     {
       if( matchKey == CUSTOM_SHADER )
       {
-        matchKey = Property::Key( DevelVisual::Property::SHADER );
+        matchKey = Property::Key( Toolkit::Visual::Property::SHADER );
       }
       else if( matchKey == TRANSFORM )
       {
-        matchKey = Property::Key( DevelVisual::Property::TRANSFORM );
+        matchKey = Property::Key( Toolkit::Visual::Property::TRANSFORM );
       }
       else if( matchKey == PREMULTIPLIED_ALPHA )
       {
-        matchKey = Property::Key( DevelVisual::Property::PREMULTIPLIED_ALPHA );
+        matchKey = Property::Key( Toolkit::Visual::Property::PREMULTIPLIED_ALPHA );
       }
       else if( matchKey == MIX_COLOR )
       {
-        matchKey = Property::Key( DevelVisual::Property::MIX_COLOR );
+        matchKey = Property::Key( Toolkit::Visual::Property::MIX_COLOR );
       }
       else if( matchKey == OPACITY )
       {
-        matchKey = Property::Key( DevelVisual::Property::OPACITY );
+        matchKey = Property::Key( Toolkit::Visual::Property::OPACITY );
       }
     }
 
     switch( matchKey.indexKey )
     {
-      case DevelVisual::Property::SHADER:
+      case Toolkit::Visual::Property::SHADER:
       {
         Property::Map shaderMap;
         if( value.Get( shaderMap ) )
@@ -114,7 +116,7 @@ void Visual::Base::SetProperties( const Property::Map& propertyMap )
         break;
       }
 
-      case DevelVisual::Property::TRANSFORM:
+      case Toolkit::Visual::Property::TRANSFORM:
       {
         Property::Map map;
         if( value.Get( map ) )
@@ -124,7 +126,7 @@ void Visual::Base::SetProperties( const Property::Map& propertyMap )
         break;
       }
 
-      case DevelVisual::Property::PREMULTIPLIED_ALPHA:
+      case Toolkit::Visual::Property::PREMULTIPLIED_ALPHA:
       {
         bool premultipliedAlpha = false;
         if( value.Get( premultipliedAlpha ) )
@@ -134,7 +136,7 @@ void Visual::Base::SetProperties( const Property::Map& propertyMap )
         break;
       }
 
-      case DevelVisual::Property::MIX_COLOR:
+      case Toolkit::Visual::Property::MIX_COLOR:
       {
         Vector4 mixColor;
         if( value.Get( mixColor ) )
@@ -151,7 +153,7 @@ void Visual::Base::SetProperties( const Property::Map& propertyMap )
         }
         break;
       }
-      case DevelVisual::Property::OPACITY:
+      case Toolkit::Visual::Property::OPACITY:
       {
         float opacity;
         if( value.Get( opacity ) )
@@ -221,7 +223,7 @@ void Visual::Base::GetNaturalSize( Vector2& naturalSize )
   naturalSize = Vector2::ZERO;
 }
 
-void Visual::Base::SetDepthIndex( float index )
+void Visual::Base::SetDepthIndex( int index )
 {
   mImpl->mDepthIndex = index;
   if( mImpl->mRenderer )
@@ -230,7 +232,7 @@ void Visual::Base::SetDepthIndex( float index )
   }
 }
 
-float Visual::Base::GetDepthIndex() const
+int Visual::Base::GetDepthIndex() const
 {
   return mImpl->mDepthIndex;
 }
@@ -276,15 +278,15 @@ void Visual::Base::CreatePropertyMap( Property::Map& map ) const
 
   Property::Map transform;
   mImpl->mTransform.GetPropertyMap( transform );
-  map.Insert( DevelVisual::Property::TRANSFORM, transform );
+  map.Insert( Toolkit::Visual::Property::TRANSFORM, transform );
 
   bool premultipliedAlpha( IsPreMultipliedAlphaEnabled() );
-  map.Insert( DevelVisual::Property::PREMULTIPLIED_ALPHA, premultipliedAlpha );
+  map.Insert( Toolkit::Visual::Property::PREMULTIPLIED_ALPHA, premultipliedAlpha );
 
   // Note, Color and Primitive will also insert their own mix color into the map
   // which is ok, because they have a different key value range.
-  map.Insert( DevelVisual::Property::MIX_COLOR, mImpl->mMixColor ); // vec4
-  map.Insert( DevelVisual::Property::OPACITY, mImpl->mMixColor.a );
+  map.Insert( Toolkit::Visual::Property::MIX_COLOR, mImpl->mMixColor ); // vec4
+  map.Insert( Toolkit::Visual::Property::OPACITY, mImpl->mMixColor.a );
 }
 
 void Visual::Base::CreateInstancePropertyMap( Property::Map& map ) const
@@ -296,14 +298,14 @@ void Visual::Base::CreateInstancePropertyMap( Property::Map& map ) const
     mImpl->mCustomShader->CreatePropertyMap( map );
   }
 
-  //map.Insert( DevelVisual::Property::DEPTH_INDEX, mImpl->mDepthIndex );
-  //map.Insert( DevelVisual::Property::ENABLED, (bool) mImpl->mRenderer );
+  //map.Insert( Toolkit::Visual::Property::DEPTH_INDEX, mImpl->mDepthIndex );
+  //map.Insert( Toolkit::Visual::Property::ENABLED, (bool) mImpl->mRenderer );
 }
 
 
-void Visual::Base::EnablePreMultipliedAlpha( bool preMultipled )
+void Visual::Base::EnablePreMultipliedAlpha( bool preMultiplied )
 {
-  if( preMultipled )
+  if( preMultiplied )
   {
     mImpl->mFlags |= Impl::IS_PREMULTIPLIED_ALPHA;
   }
@@ -314,7 +316,8 @@ void Visual::Base::EnablePreMultipliedAlpha( bool preMultipled )
 
   if( mImpl->mRenderer )
   {
-    mImpl->mRenderer.SetProperty(Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA, preMultipled);
+    mImpl->mRenderer.SetProperty(Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA, preMultiplied);
+    mImpl->mRenderer.RegisterProperty( PRE_MULTIPLIED_ALPHA_PROPERTY, static_cast<float>( preMultiplied ) );
   }
 }
 
@@ -334,11 +337,6 @@ bool Visual::Base::IsOnStage() const
   return mImpl->mFlags & Impl::IS_ON_STAGE;
 }
 
-bool Visual::Base::IsFromCache() const
-{
-  return mImpl->mFlags & Impl::IS_FROM_CACHE;
-}
-
 void Visual::Base::RegisterMixColor()
 {
   // Only register if not already registered.
@@ -347,7 +345,7 @@ void Visual::Base::RegisterMixColor()
   {
     mImpl->mMixColorIndex = DevelHandle::RegisterProperty(
       mImpl->mRenderer,
-      Toolkit::DevelVisual::Property::MIX_COLOR,
+      Toolkit::Visual::Property::MIX_COLOR,
       MIX_COLOR,
       Vector3(mImpl->mMixColor) );
   }
@@ -361,7 +359,7 @@ void Visual::Base::RegisterMixColor()
   {
     mImpl->mOpacityIndex = DevelHandle::RegisterProperty(
       mImpl->mRenderer,
-      Toolkit::DevelVisual::Property::OPACITY,
+      Toolkit::Visual::Property::OPACITY,
       OPACITY,
       mImpl->mMixColor.a );
   }
@@ -371,7 +369,7 @@ void Visual::Base::RegisterMixColor()
   {
     preMultipliedAlpha = 1.0f;
   }
-  mImpl->mRenderer.RegisterProperty( "preMultipliedAlpha", preMultipliedAlpha );
+  mImpl->mRenderer.RegisterProperty( PRE_MULTIPLIED_ALPHA_PROPERTY, preMultipliedAlpha );
 }
 
 void Visual::Base::SetMixColor( const Vector4& color )
@@ -406,6 +404,37 @@ const Vector4& Visual::Base::GetMixColor() const
   return mImpl->mMixColor;
 }
 
+void Visual::Base::AddResourceObserver( Visual::ResourceObserver& observer)
+{
+  mImpl->mResourceObserver = &observer;
+}
+
+void Visual::Base::RemoveResourceObserver( Visual::ResourceObserver& observer )
+{
+  mImpl->mResourceObserver = NULL;
+}
+
+void Visual::Base::ResourceReady()
+{
+  if( mImpl->mResourceReady )
+  {
+    // only inform the observer the first time the resource is ready
+    return;
+  }
+  mImpl->mResourceReady = true;
+
+  if( mImpl->mResourceObserver )
+  {
+    // observer is currently a control impl
+    mImpl->mResourceObserver->ResourceReady( *this );
+  }
+}
+
+bool Visual::Base::IsResourceReady() const
+{
+  return mImpl->mResourceReady;
+}
+
 Renderer Visual::Base::GetRenderer()
 {
   return mImpl->mRenderer;
@@ -494,11 +523,14 @@ void Visual::Base::AnimateProperty(
 
   Property::Map map;
   DoCreatePropertyMap( map );
-  Property::Value* valuePtr = map.Find( Toolkit::DevelVisual::Property::TYPE );
-  int visualType;
-  valuePtr->Get(visualType);
+  Property::Value* valuePtr = map.Find( Toolkit::Visual::Property::TYPE );
+  int visualType = -1;
+  if( valuePtr )
+  {
+    valuePtr->Get( visualType );
+  }
 
-  if( animator.propertyKey == Toolkit::DevelVisual::Property::MIX_COLOR ||
+  if( animator.propertyKey == Toolkit::Visual::Property::MIX_COLOR ||
       animator.propertyKey == MIX_COLOR ||
       ( visualType == Toolkit::Visual::COLOR &&
         animator.propertyKey == ColorVisual::Property::MIX_COLOR ) ||
@@ -507,14 +539,14 @@ void Visual::Base::AnimateProperty(
   {
     AnimateMixColorProperty( transition, animator );
   }
-  else if(animator.propertyKey == Toolkit::DevelVisual::Property::OPACITY ||
+  else if(animator.propertyKey == Toolkit::Visual::Property::OPACITY ||
           animator.propertyKey == OPACITY )
   {
     AnimateOpacityProperty( transition, animator );
   }
   else if( mImpl->mRenderer )
   {
-    AnimateRendererProperty(transition, animator);
+    AnimateRendererProperty( transition, animator );
   }
 }