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=2a1b09ffe4c8523ad506055fba12eb052f0d3431;hpb=e3ad4e1fe0891823983d068e6a4b32af3abe559d;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 2a1b09f..15e4280 100644 --- a/dali-toolkit/internal/visuals/svg/svg-visual.cpp +++ b/dali-toolkit/internal/visuals/svg/svg-visual.cpp @@ -16,11 +16,12 @@ */ // CLASS HEADER -#include "svg-visual.h" +#include // INTERNAL INCLUDES #include #include +#include #include #include #include @@ -91,6 +92,12 @@ SvgVisual::~SvgVisual() { Dali::AsyncTaskManager::Get().RemoveTask(mRasterizingTask); } + + if(mImageUrl.IsBufferResource()) + { + TextureManager& textureManager = mFactoryCache.GetTextureManager(); + textureManager.RemoveEncodedImageBuffer(mImageUrl.GetUrl()); + } } } @@ -104,9 +111,22 @@ void SvgVisual::OnInitialize() Vector2 dpi = Stage::GetCurrent().GetDpi(); float meanDpi = (dpi.height + dpi.width) * 0.5f; - mLoadingTask = new SvgLoadingTask(mVectorRenderer, mImageUrl, meanDpi, MakeCallback(this, &SvgVisual::ApplyRasterizedImage)); + EncodedImageBuffer encodedImageBuffer; - if(IsSynchronousLoadingRequired() && mImageUrl.IsLocalResource()) + if(mImageUrl.IsBufferResource()) + { + // 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()) @@ -234,12 +254,7 @@ void SvgVisual::DoSetOnScene(Actor& actor) void SvgVisual::DoSetOffScene(Actor& actor) { - // Remove loading & rasterizing task - if(mLoadingTask) - { - Dali::AsyncTaskManager::Get().RemoveTask(mLoadingTask); - mLoadingTask.Reset(); - } + // Remove rasterizing task if(mRasterizingTask) { Dali::AsyncTaskManager::Get().RemoveTask(mRasterizingTask); @@ -326,6 +341,10 @@ void SvgVisual::AddRasterizationTask(const Vector2& size) mRasterizingTask = new SvgRasterizingTask(mVectorRenderer, width, height, MakeCallback(this, &SvgVisual::ApplyRasterizedImage)); +#ifdef TRACE_ENABLED + reinterpret_cast(mRasterizingTask.Get())->SetUrl(mImageUrl); +#endif + if(IsSynchronousLoadingRequired() && mImageUrl.IsLocalResource()) { mRasterizingTask->Process(); @@ -341,6 +360,12 @@ void SvgVisual::AddRasterizationTask(const Vector2& size) void SvgVisual::ApplyRasterizedImage(SvgTaskPtr task) { + 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(); @@ -349,6 +374,16 @@ void SvgVisual::ApplyRasterizedImage(SvgTaskPtr task) 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 if(rasterizedPixelData && IsOnScene()) { @@ -421,6 +456,19 @@ void SvgVisual::ApplyRasterizedImage(SvgTaskPtr task) { 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) { @@ -432,16 +480,6 @@ void SvgVisual::ApplyRasterizedImage(SvgTaskPtr task) 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() @@ -489,7 +527,7 @@ Shader SvgVisual::GenerateShader() const { shader = mImageVisualShaderFactory.GetShader( mFactoryCache, - ImageVisualShaderFeature::FeatureBuilder() + ImageVisualShaderFeatureBuilder() .EnableTextureAtlas(mAttemptAtlasing) .EnableRoundedCorner(IsRoundedCornerRequired()) .EnableBorderline(IsBorderlineRequired()));