/*
- * 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.
// 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>
SvgVisual::~SvgVisual()
{
+ if(Stage::IsInstalled())
+ {
+ if(mLoadingTask)
+ {
+ Dali::AsyncTaskManager::Get().RemoveTask(mLoadingTask);
+ }
+ if(mRasterizingTask)
+ {
+ Dali::AsyncTaskManager::Get().RemoveTask(mRasterizingTask);
+ }
+ }
}
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();
+ if(!mLoadingTask->HasSucceeded())
+ {
+ mLoadFailed = true;
+ }
+ mLoadingTask.Reset(); // We don't need it anymore.
}
else
{
- mFactoryCache.GetSVGRasterizationManager()->AddTask(newTask);
+ Dali::AsyncTaskManager::Get().AddTask(mLoadingTask);
}
}
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();
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 anymore.
}
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
ResourceReady(Toolkit::Visual::ResourceStatus::READY);
}
}
- else if(!success && !mLoadFailed)
+ else if(!mLoadFailed)
{
mLoadFailed = true;
ResourceReady(Toolkit::Visual::ResourceStatus::FAILED);
}
+
+ // We don't need to keep tasks anymore. reset now.
+ if(task == mLoadingTask)
+ {
+ mLoadingTask.Reset();
+ }
+ if(task == mRasterizingTask)
+ {
+ mRasterizingTask.Reset();
+ }
}
void SvgVisual::OnSetTransform()