Add animated vector image visual
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / visuals / visual-factory-impl.cpp
index 90bb937..d30729b 100644 (file)
 #include <dali-toolkit/internal/visuals/svg/svg-visual.h>
 #include <dali-toolkit/internal/visuals/text/text-visual.h>
 #include <dali-toolkit/internal/visuals/animated-image/animated-image-visual.h>
+#include <dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.h>
 #include <dali-toolkit/internal/visuals/wireframe/wireframe-visual.h>
 #include <dali-toolkit/internal/visuals/visual-factory-cache.h>
 #include <dali-toolkit/internal/visuals/visual-url.h>
 #include <dali-toolkit/internal/visuals/visual-string-constants.h>
+#include <dali-toolkit/internal/visuals/image-visual-shader-factory.h>
 
 namespace Dali
 {
@@ -67,11 +69,15 @@ BaseHandle Create()
 
 DALI_TYPE_REGISTRATION_BEGIN_CREATE( Toolkit::VisualFactory, Dali::BaseHandle, Create, true )
 DALI_TYPE_REGISTRATION_END()
+const char * const  BROKEN_IMAGE_URL( DALI_IMAGE_DIR "broken.png" ); ///< URL For the broken image
 
 } // namespace
 
 VisualFactory::VisualFactory( bool debugEnabled )
-: mDebugEnabled( debugEnabled ),
+: mFactoryCache(),
+  mImageVisualShaderFactory(),
+  mSlotDelegate(this),
+  mDebugEnabled( debugEnabled ),
   mPreMultiplyOnLoad( true )
 {
 }
@@ -80,6 +86,22 @@ VisualFactory::~VisualFactory()
 {
 }
 
+void VisualFactory::OnStyleChangedSignal( Toolkit::StyleManager styleManager, StyleChange::Type type)
+{
+  if( type == StyleChange::THEME_CHANGE )
+  {
+    std::string brokenImageUrl(BROKEN_IMAGE_URL);
+
+    Property::Map config = Toolkit::DevelStyleManager::GetConfigurations( styleManager );
+    config["brokenImageUrl"].Get( brokenImageUrl );
+
+    if( mFactoryCache )
+    {
+      mFactoryCache->SetBrokenImageUrl(brokenImageUrl);
+    }
+  }
+}
+
 Toolkit::Visual::Base VisualFactory::CreateVisual( const Property::Map& propertyMap )
 {
   Visual::BasePtr visualPtr;
@@ -132,17 +154,22 @@ Toolkit::Visual::Base VisualFactory::CreateVisual( const Property::Map& property
               }
               case VisualUrl::SVG:
               {
-                visualPtr = SvgVisual::New( GetFactoryCache(), visualUrl, propertyMap );
+                visualPtr = SvgVisual::New( GetFactoryCache(), GetImageVisualShaderFactory(), visualUrl, propertyMap );
                 break;
               }
               case VisualUrl::GIF:
               {
-                visualPtr = AnimatedImageVisual::New( GetFactoryCache(), visualUrl, propertyMap );
+                visualPtr = AnimatedImageVisual::New( GetFactoryCache(), GetImageVisualShaderFactory(), visualUrl, propertyMap );
+                break;
+              }
+              case VisualUrl::JSON:
+              {
+                visualPtr = AnimatedVectorImageVisual::New( GetFactoryCache(),  GetImageVisualShaderFactory(), imageUrl, propertyMap );
                 break;
               }
               case VisualUrl::REGULAR_IMAGE:
               {
-                visualPtr = ImageVisual::New( GetFactoryCache(), visualUrl, propertyMap );
+                visualPtr = ImageVisual::New( GetFactoryCache(), GetImageVisualShaderFactory(), visualUrl, propertyMap );
                 break;
               }
             }
@@ -153,7 +180,7 @@ Toolkit::Visual::Base VisualFactory::CreateVisual( const Property::Map& property
           Property::Array* array = imageURLValue->GetArray();
           if( array )
           {
-            visualPtr = AnimatedImageVisual::New( GetFactoryCache(), *array, propertyMap );
+            visualPtr = AnimatedImageVisual::New( GetFactoryCache(), GetImageVisualShaderFactory(), *array, propertyMap );
           }
         }
       }
@@ -201,7 +228,7 @@ Toolkit::Visual::Base VisualFactory::CreateVisual( const Property::Map& property
       std::string imageUrl;
       if( imageURLValue && imageURLValue->Get( imageUrl ) )
       {
-        visualPtr = SvgVisual::New( GetFactoryCache(), imageUrl, propertyMap );
+        visualPtr = SvgVisual::New( GetFactoryCache(), GetImageVisualShaderFactory(), imageUrl, propertyMap );
       }
       break;
     }
@@ -214,14 +241,14 @@ Toolkit::Visual::Base VisualFactory::CreateVisual( const Property::Map& property
       {
         if( imageURLValue->Get( imageUrl ) )
         {
-          visualPtr = AnimatedImageVisual::New( GetFactoryCache(), imageUrl, propertyMap );
+          visualPtr = AnimatedImageVisual::New( GetFactoryCache(), GetImageVisualShaderFactory(), imageUrl, propertyMap );
         }
         else
         {
           Property::Array* array = imageURLValue->GetArray();
           if( array )
           {
-            visualPtr = AnimatedImageVisual::New( GetFactoryCache(), *array, propertyMap );
+            visualPtr = AnimatedImageVisual::New( GetFactoryCache(), GetImageVisualShaderFactory(), *array, propertyMap );
           }
         }
       }
@@ -233,6 +260,17 @@ Toolkit::Visual::Base VisualFactory::CreateVisual( const Property::Map& property
       visualPtr = AnimatedGradientVisual::New( GetFactoryCache(), propertyMap );
       break;
     }
+
+    case Toolkit::DevelVisual::ANIMATED_VECTOR_IMAGE:
+    {
+      Property::Value* imageURLValue = propertyMap.Find( Toolkit::ImageVisual::Property::URL, IMAGE_URL_NAME );
+      std::string imageUrl;
+      if( imageURLValue && imageURLValue->Get( imageUrl ) )
+      {
+        visualPtr = AnimatedVectorImageVisual::New( GetFactoryCache(),  GetImageVisualShaderFactory(), imageUrl, propertyMap );
+      }
+      break;
+    }
   }
 
   if( !visualPtr )
@@ -262,7 +300,7 @@ Toolkit::Visual::Base VisualFactory::CreateVisual( const Image& image )
     }
     else
     {
-      visualPtr = ImageVisual::New(GetFactoryCache(), image );
+      visualPtr = ImageVisual::New(GetFactoryCache(), GetImageVisualShaderFactory(), image );
     }
   }
 
@@ -292,17 +330,22 @@ Toolkit::Visual::Base VisualFactory::CreateVisual( const std::string& url, Image
       }
       case VisualUrl::SVG:
       {
-        visualPtr = SvgVisual::New( GetFactoryCache(), visualUrl );
+        visualPtr = SvgVisual::New( GetFactoryCache(), GetImageVisualShaderFactory(), visualUrl );
         break;
       }
       case VisualUrl::GIF:
       {
-        visualPtr = AnimatedImageVisual::New( GetFactoryCache(), visualUrl );
+        visualPtr = AnimatedImageVisual::New( GetFactoryCache(), GetImageVisualShaderFactory(), visualUrl );
+        break;
+      }
+      case VisualUrl::JSON:
+      {
+        visualPtr = AnimatedVectorImageVisual::New( GetFactoryCache(),  GetImageVisualShaderFactory(), visualUrl );
         break;
       }
       case VisualUrl::REGULAR_IMAGE:
       {
-        visualPtr = ImageVisual::New(GetFactoryCache(), visualUrl, size );
+        visualPtr = ImageVisual::New(GetFactoryCache(), GetImageVisualShaderFactory(), visualUrl, size );
         break;
       }
     }
@@ -341,10 +384,30 @@ Internal::VisualFactoryCache& VisualFactory::GetFactoryCache()
   if( !mFactoryCache )
   {
     mFactoryCache = std::unique_ptr<VisualFactoryCache>( new VisualFactoryCache( mPreMultiplyOnLoad ) );
+
+    std::string brokenImageUrl(BROKEN_IMAGE_URL);
+    Toolkit::StyleManager styleManager = Toolkit::StyleManager::Get();
+    if( styleManager )
+    {
+      Property::Map config = Toolkit::DevelStyleManager::GetConfigurations( styleManager );
+      config["brokenImageUrl"].Get( brokenImageUrl );
+      styleManager.StyleChangedSignal().Connect( mSlotDelegate, &VisualFactory::OnStyleChangedSignal );
+    }
+
+    mFactoryCache->SetBrokenImageUrl(brokenImageUrl);
   }
   return *mFactoryCache;
 }
 
+ImageVisualShaderFactory& VisualFactory::GetImageVisualShaderFactory()
+{
+  if( !mImageVisualShaderFactory )
+  {
+    mImageVisualShaderFactory = std::unique_ptr< ImageVisualShaderFactory >( new ImageVisualShaderFactory() );
+  }
+  return *mImageVisualShaderFactory;
+}
+
 } // namespace Internal
 
 } // namespace Toolkit