Merge "Use Mipmap level to sample specular texture" into devel/master
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / visuals / svg / svg-visual.cpp
index cd59107..265c2fe 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2023 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,7 +21,7 @@
 // INTERNAL INCLUDES
 #include <dali-toolkit/internal/visuals/image-atlas-manager.h>
 #include <dali-toolkit/internal/visuals/image-visual-shader-factory.h>
-#include <dali-toolkit/internal/visuals/svg/svg-rasterize-thread.h>
+#include <dali-toolkit/internal/visuals/svg/svg-task.h>
 #include <dali-toolkit/internal/visuals/visual-base-data-impl.h>
 #include <dali-toolkit/internal/visuals/visual-string-constants.h>
 #include <dali-toolkit/public-api/visuals/image-visual-properties.h>
@@ -81,6 +81,17 @@ SvgVisual::SvgVisual(VisualFactoryCache& factoryCache, ImageVisualShaderFactory&
 
 SvgVisual::~SvgVisual()
 {
+  if(Stage::IsInstalled())
+  {
+    if(mLoadingTask)
+    {
+      Dali::AsyncTaskManager::Get().RemoveTask(mLoadingTask);
+    }
+    if(mRasterizingTask)
+    {
+      Dali::AsyncTaskManager::Get().RemoveTask(mRasterizingTask);
+    }
+  }
 }
 
 void SvgVisual::OnInitialize()
@@ -93,15 +104,16 @@ void SvgVisual::OnInitialize()
   Vector2 dpi     = Stage::GetCurrent().GetDpi();
   float   meanDpi = (dpi.height + dpi.width) * 0.5f;
 
-  SvgTaskPtr newTask = new SvgLoadingTask(this, mVectorRenderer, mImageUrl, meanDpi);
+  mLoadingTask = new SvgLoadingTask(mVectorRenderer, mImageUrl, meanDpi, MakeCallback(this, &SvgVisual::ApplyRasterizedImage));
 
   if(IsSynchronousLoadingRequired() && mImageUrl.IsLocalResource())
   {
-    newTask->Process();
+    mLoadingTask->Process();
+    mLoadingTask.Reset(); // We don't need it now
   }
   else
   {
-    mFactoryCache.GetSVGRasterizationManager()->AddTask(newTask);
+    Dali::AsyncTaskManager::Get().AddTask(mLoadingTask);
   }
 }
 
@@ -218,7 +230,17 @@ void SvgVisual::DoSetOnScene(Actor& actor)
 
 void SvgVisual::DoSetOffScene(Actor& actor)
 {
-  mFactoryCache.GetSVGRasterizationManager()->RemoveTask(this);
+  // Remove loading & rasterizing task
+  if(mLoadingTask)
+  {
+    Dali::AsyncTaskManager::Get().RemoveTask(mLoadingTask);
+    mLoadingTask.Reset();
+  }
+  if(mRasterizingTask)
+  {
+    Dali::AsyncTaskManager::Get().RemoveTask(mRasterizingTask);
+    mRasterizingTask.Reset();
+  }
 
   actor.RemoveRenderer(mImpl->mRenderer);
   mPlacementActor.Reset();
@@ -291,27 +313,29 @@ void SvgVisual::AddRasterizationTask(const Vector2& size)
     unsigned int width  = static_cast<unsigned int>(size.width);
     unsigned int height = static_cast<unsigned int>(size.height);
 
-    SvgTaskPtr newTask = new SvgRasterizingTask(this, mVectorRenderer, width, height);
+    mRasterizingTask = new SvgRasterizingTask(mVectorRenderer, width, height, MakeCallback(this, &SvgVisual::ApplyRasterizedImage));
 
     if(IsSynchronousLoadingRequired() && mImageUrl.IsLocalResource())
     {
-      newTask->Process();
-      ApplyRasterizedImage(newTask->GetPixelData(), newTask->HasSucceeded());
+      mRasterizingTask->Process();
+      ApplyRasterizedImage(mRasterizingTask);
+      mRasterizingTask.Reset(); // We don't need it now
     }
     else
     {
-      mFactoryCache.GetSVGRasterizationManager()->AddTask(newTask);
+      Dali::AsyncTaskManager::Get().AddTask(mRasterizingTask);
     }
   }
 }
 
-void SvgVisual::ApplyRasterizedImage(PixelData rasterizedPixelData, bool success)
+void SvgVisual::ApplyRasterizedImage(SvgTaskPtr task)
 {
-  if(success)
+  if(task->HasSucceeded())
   {
+    PixelData rasterizedPixelData = task->GetPixelData();
     if(mDefaultWidth == 0 || mDefaultHeight == 0)
     {
-      mVectorRenderer.GetDefaultSize(mDefaultWidth, mDefaultHeight);
+      task->GetRenderer().GetDefaultSize(mDefaultWidth, mDefaultHeight);
     }
 
     // Rasterization success
@@ -382,7 +406,7 @@ void SvgVisual::ApplyRasterizedImage(PixelData rasterizedPixelData, bool success
       ResourceReady(Toolkit::Visual::ResourceStatus::READY);
     }
   }
-  else if(!success && !mLoadFailed)
+  else if(!mLoadFailed)
   {
     mLoadFailed = true;