X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fvisuals%2Fsvg%2Fsvg-visual.cpp;h=15e42802f7271c4f88123c71c439704594233cbe;hb=5228f6ff17ec780703df247d6e849fe5b216c593;hp=cd59107306ef868ab277195ab7647b80ac56d441;hpb=af65398903c4746d0075232911444af8f3b695d8;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/visuals/svg/svg-visual.cpp b/dali-toolkit/internal/visuals/svg/svg-visual.cpp index cd59107..15e4280 100644 --- a/dali-toolkit/internal/visuals/svg/svg-visual.cpp +++ b/dali-toolkit/internal/visuals/svg/svg-visual.cpp @@ -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. @@ -16,12 +16,13 @@ */ // CLASS HEADER -#include "svg-visual.h" +#include // INTERNAL INCLUDES #include #include -#include +#include +#include #include #include #include @@ -81,6 +82,23 @@ SvgVisual::SvgVisual(VisualFactoryCache& factoryCache, ImageVisualShaderFactory& SvgVisual::~SvgVisual() { + if(Stage::IsInstalled()) + { + if(mLoadingTask) + { + Dali::AsyncTaskManager::Get().RemoveTask(mLoadingTask); + } + if(mRasterizingTask) + { + Dali::AsyncTaskManager::Get().RemoveTask(mRasterizingTask); + } + + if(mImageUrl.IsBufferResource()) + { + TextureManager& textureManager = mFactoryCache.GetTextureManager(); + textureManager.RemoveEncodedImageBuffer(mImageUrl.GetUrl()); + } + } } void SvgVisual::OnInitialize() @@ -93,15 +111,33 @@ void SvgVisual::OnInitialize() Vector2 dpi = Stage::GetCurrent().GetDpi(); float meanDpi = (dpi.height + dpi.width) * 0.5f; - SvgTaskPtr newTask = new SvgLoadingTask(this, mVectorRenderer, mImageUrl, meanDpi); + EncodedImageBuffer encodedImageBuffer; - if(IsSynchronousLoadingRequired() && mImageUrl.IsLocalResource()) + if(mImageUrl.IsBufferResource()) { - newTask->Process(); + // Increase reference count of External Resources : + // EncodedImageBuffer. + // Reference count will be decreased at destructor of the visual. + TextureManager& textureManager = mFactoryCache.GetTextureManager(); + textureManager.UseExternalResource(mImageUrl.GetUrl()); + + encodedImageBuffer = textureManager.GetEncodedImageBuffer(mImageUrl.GetUrl()); + } + + mLoadingTask = new SvgLoadingTask(mVectorRenderer, mImageUrl, encodedImageBuffer, meanDpi, MakeCallback(this, &SvgVisual::ApplyRasterizedImage)); + + if(IsSynchronousLoadingRequired() && (mImageUrl.IsLocalResource() || mImageUrl.IsBufferResource())) + { + 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); } } @@ -218,7 +254,12 @@ void SvgVisual::DoSetOnScene(Actor& actor) void SvgVisual::DoSetOffScene(Actor& actor) { - mFactoryCache.GetSVGRasterizationManager()->RemoveTask(this); + // Remove rasterizing task + if(mRasterizingTask) + { + Dali::AsyncTaskManager::Get().RemoveTask(mRasterizingTask); + mRasterizingTask.Reset(); + } actor.RemoveRenderer(mImpl->mRenderer); mPlacementActor.Reset(); @@ -288,30 +329,59 @@ void SvgVisual::AddRasterizationTask(const Vector2& size) { if(mImpl->mRenderer) { + // Remove previous task + if(mRasterizingTask) + { + Dali::AsyncTaskManager::Get().RemoveTask(mRasterizingTask); + mRasterizingTask.Reset(); + } + unsigned int width = static_cast(size.width); unsigned int height = static_cast(size.height); - SvgTaskPtr newTask = new SvgRasterizingTask(this, mVectorRenderer, width, height); + mRasterizingTask = new SvgRasterizingTask(mVectorRenderer, width, height, MakeCallback(this, &SvgVisual::ApplyRasterizedImage)); + +#ifdef TRACE_ENABLED + reinterpret_cast(mRasterizingTask.Get())->SetUrl(mImageUrl); +#endif 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(DALI_UNLIKELY(mImpl == nullptr)) { + DALI_LOG_ERROR("Fatal error!! already destroyed object callback called! SvgVisual : %p, url : %s, task : %p\n", this, mImageUrl.GetUrl().c_str(), task.Get()); + return; + } + + if(task->HasSucceeded()) + { + PixelData rasterizedPixelData = task->GetPixelData(); if(mDefaultWidth == 0 || mDefaultHeight == 0) { - mVectorRenderer.GetDefaultSize(mDefaultWidth, mDefaultHeight); + task->GetRenderer().GetDefaultSize(mDefaultWidth, mDefaultHeight); + } + + // We don't need to keep tasks anymore. reset now. + if(task == mLoadingTask) + { + mLoadingTask.Reset(); + } + if(task == mRasterizingTask) + { + mRasterizingTask.Reset(); } // Rasterization success @@ -382,10 +452,23 @@ void SvgVisual::ApplyRasterizedImage(PixelData rasterizedPixelData, bool success ResourceReady(Toolkit::Visual::ResourceStatus::READY); } } - else if(!success && !mLoadFailed) + else if(!mLoadFailed) { mLoadFailed = true; + // Remove rasterizing task if we requested before. + if(mRasterizingTask) + { + Dali::AsyncTaskManager::Get().RemoveTask(mRasterizingTask); + mRasterizingTask.Reset(); + } + + // We don't need to keep tasks anymore. reset now. + if(task == mLoadingTask) + { + mLoadingTask.Reset(); + } + Actor actor = mPlacementActor.GetHandle(); if(actor) { @@ -444,7 +527,7 @@ Shader SvgVisual::GenerateShader() const { shader = mImageVisualShaderFactory.GetShader( mFactoryCache, - ImageVisualShaderFeature::FeatureBuilder() + ImageVisualShaderFeatureBuilder() .EnableTextureAtlas(mAttemptAtlasing) .EnableRoundedCorner(IsRoundedCornerRequired()) .EnableBorderline(IsBorderlineRequired()));