[Tizen](SVG) Support desired size
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / visuals / svg / svg-visual.cpp
index 9d0a2cc..cd59107 100644 (file)
@@ -48,20 +48,20 @@ const Dali::Vector4 FULL_TEXTURE_RECT(0.f, 0.f, 1.f, 1.f);
 
 SvgVisualPtr SvgVisual::New(VisualFactoryCache& factoryCache, ImageVisualShaderFactory& shaderFactory, const VisualUrl& imageUrl, const Property::Map& properties)
 {
-  SvgVisualPtr svgVisual(new SvgVisual(factoryCache, shaderFactory, imageUrl));
+  SvgVisualPtr svgVisual(new SvgVisual(factoryCache, shaderFactory, imageUrl, ImageDimensions{}));
   svgVisual->SetProperties(properties);
   svgVisual->Initialize();
   return svgVisual;
 }
 
-SvgVisualPtr SvgVisual::New(VisualFactoryCache& factoryCache, ImageVisualShaderFactory& shaderFactory, const VisualUrl& imageUrl)
+SvgVisualPtr SvgVisual::New(VisualFactoryCache& factoryCache, ImageVisualShaderFactory& shaderFactory, const VisualUrl& imageUrl, ImageDimensions size)
 {
-  SvgVisualPtr svgVisual(new SvgVisual(factoryCache, shaderFactory, imageUrl));
+  SvgVisualPtr svgVisual(new SvgVisual(factoryCache, shaderFactory, imageUrl, size));
   svgVisual->Initialize();
   return svgVisual;
 }
 
-SvgVisual::SvgVisual(VisualFactoryCache& factoryCache, ImageVisualShaderFactory& shaderFactory, const VisualUrl& imageUrl)
+SvgVisual::SvgVisual(VisualFactoryCache& factoryCache, ImageVisualShaderFactory& shaderFactory, const VisualUrl& imageUrl, ImageDimensions size)
 : Visual::Base(factoryCache, Visual::FittingMode::FILL, Toolkit::Visual::SVG),
   mImageVisualShaderFactory(shaderFactory),
   mAtlasRect(FULL_TEXTURE_RECT),
@@ -71,6 +71,7 @@ SvgVisual::SvgVisual(VisualFactoryCache& factoryCache, ImageVisualShaderFactory&
   mDefaultHeight(0),
   mPlacementActor(),
   mRasterizedSize(Vector2::ZERO),
+  mDesiredSize(size),
   mLoadFailed(false),
   mAttemptAtlasing(false)
 {
@@ -100,7 +101,7 @@ void SvgVisual::OnInitialize()
   }
   else
   {
-    mFactoryCache.GetSVGRasterizationThread()->AddTask(newTask);
+    mFactoryCache.GetSVGRasterizationManager()->AddTask(newTask);
   }
 }
 
@@ -122,6 +123,14 @@ void SvgVisual::DoSetProperties(const Property::Map& propertyMap)
     {
       DoSetProperty(Toolkit::ImageVisual::Property::SYNCHRONOUS_LOADING, keyValue.second);
     }
+    else if(keyValue.first == IMAGE_DESIRED_WIDTH)
+    {
+      DoSetProperty(Toolkit::ImageVisual::Property::DESIRED_WIDTH, keyValue.second);
+    }
+    else if(keyValue.first == IMAGE_DESIRED_HEIGHT)
+    {
+      DoSetProperty(Toolkit::ImageVisual::Property::DESIRED_HEIGHT, keyValue.second);
+    }
   }
 }
 
@@ -154,6 +163,24 @@ void SvgVisual::DoSetProperty(Property::Index index, const Property::Value& valu
       }
       break;
     }
+    case Toolkit::ImageVisual::Property::DESIRED_WIDTH:
+    {
+      int32_t desiredWidth = 0;
+      if(value.Get(desiredWidth))
+      {
+        mDesiredSize.SetWidth(desiredWidth);
+      }
+      break;
+    }
+    case Toolkit::ImageVisual::Property::DESIRED_HEIGHT:
+    {
+      int32_t desiredHeight = 0;
+      if(value.Get(desiredHeight))
+      {
+        mDesiredSize.SetHeight(desiredHeight);
+      }
+      break;
+    }
   }
 }
 
@@ -191,7 +218,7 @@ void SvgVisual::DoSetOnScene(Actor& actor)
 
 void SvgVisual::DoSetOffScene(Actor& actor)
 {
-  mFactoryCache.GetSVGRasterizationThread()->RemoveTask(this);
+  mFactoryCache.GetSVGRasterizationManager()->RemoveTask(this);
 
   actor.RemoveRenderer(mImpl->mRenderer);
   mPlacementActor.Reset();
@@ -202,7 +229,12 @@ void SvgVisual::DoSetOffScene(Actor& actor)
 
 void SvgVisual::GetNaturalSize(Vector2& naturalSize)
 {
-  if(mLoadFailed && mImpl->mRenderer)
+  if(mDesiredSize.GetWidth() > 0 && mDesiredSize.GetHeight() > 0)
+  {
+    naturalSize.x = mDesiredSize.GetWidth();
+    naturalSize.y = mDesiredSize.GetHeight();
+  }
+  else if(mLoadFailed && mImpl->mRenderer)
   {
     // Load failed, use broken image size
     auto textureSet = mImpl->mRenderer.GetTextures();
@@ -234,6 +266,8 @@ void SvgVisual::DoCreatePropertyMap(Property::Map& map) const
     map.Insert(Toolkit::ImageVisual::Property::ATLASING, mAttemptAtlasing);
   }
   map.Insert(Toolkit::ImageVisual::Property::SYNCHRONOUS_LOADING, IsSynchronousLoadingRequired());
+  map.Insert(Toolkit::ImageVisual::Property::DESIRED_WIDTH, mDesiredSize.GetWidth());
+  map.Insert(Toolkit::ImageVisual::Property::DESIRED_HEIGHT, mDesiredSize.GetHeight());
 }
 
 void SvgVisual::DoCreateInstancePropertyMap(Property::Map& map) const
@@ -266,7 +300,7 @@ void SvgVisual::AddRasterizationTask(const Vector2& size)
     }
     else
     {
-      mFactoryCache.GetSVGRasterizationThread()->AddTask(newTask);
+      mFactoryCache.GetSVGRasterizationManager()->AddTask(newTask);
     }
   }
 }
@@ -367,14 +401,24 @@ void SvgVisual::ApplyRasterizedImage(PixelData rasterizedPixelData, bool success
 
 void SvgVisual::OnSetTransform()
 {
-  Vector2 visualSize = mImpl->mTransform.GetVisualSize(mImpl->mControlSize);
-
   if(IsOnScene() && !mLoadFailed)
   {
-    if(visualSize != mRasterizedSize || mDefaultWidth == 0 || mDefaultHeight == 0)
+    Vector2 size;
+    if(mDesiredSize.GetWidth() > 0 && mDesiredSize.GetHeight() > 0)
+    {
+      // Use desired size
+      size = Vector2(mDesiredSize.GetWidth(), mDesiredSize.GetHeight());
+    }
+    else
+    {
+      // Use visual size
+      size = mImpl->mTransform.GetVisualSize(mImpl->mControlSize);
+    }
+
+    if(size != mRasterizedSize || mDefaultWidth == 0 || mDefaultHeight == 0)
     {
-      mRasterizedSize = visualSize;
-      AddRasterizationTask(visualSize);
+      mRasterizedSize = size;
+      AddRasterizationTask(size);
     }
   }