Load remote svg image as low priority
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / visuals / svg / svg-task.cpp
1 /*
2  * Copyright (c) 2023 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 // CLASS HEADER
19 #include "svg-task.h"
20
21 // EXTERNAL INCLUDES
22 #include <dali/devel-api/adaptor-framework/file-loader.h>
23 #include <dali/integration-api/adaptor-framework/adaptor.h>
24 #include <dali/integration-api/debug.h>
25
26 // INTERNAL INCLUDES
27 #include <dali-toolkit/internal/visuals/svg/svg-visual.h>
28
29 namespace Dali
30 {
31 namespace Toolkit
32 {
33 namespace Internal
34 {
35 SvgTask::SvgTask(VectorImageRenderer vectorRenderer, CallbackBase* callback, AsyncTask::PriorityType priorityType)
36 : AsyncTask(callback, priorityType),
37   mVectorRenderer(vectorRenderer),
38   mHasSucceeded(false)
39 {
40 }
41
42 PixelData SvgTask::GetPixelData() const
43 {
44   return PixelData();
45 }
46
47 bool SvgTask::HasSucceeded() const
48 {
49   return mHasSucceeded;
50 }
51
52 VectorImageRenderer SvgTask::GetRenderer()
53 {
54   return mVectorRenderer;
55 }
56
57 SvgLoadingTask::SvgLoadingTask(VectorImageRenderer vectorRenderer, const VisualUrl& url, float dpi, CallbackBase* callback)
58 : SvgTask(vectorRenderer, callback, url.GetProtocolType() == VisualUrl::ProtocolType::REMOTE ? AsyncTask::PriorityType::LOW : AsyncTask::PriorityType::HIGH),
59   mUrl(url),
60   mDpi(dpi)
61 {
62 }
63
64 SvgLoadingTask::~SvgLoadingTask()
65 {
66 }
67
68 void SvgLoadingTask::Process()
69 {
70   if(mVectorRenderer.IsLoaded())
71   {
72     // Already loaded
73     mHasSucceeded = true;
74     return;
75   }
76
77   Dali::Vector<uint8_t> buffer;
78
79   if(!mUrl.IsLocalResource())
80   {
81     if(!Dali::FileLoader::DownloadFileSynchronously(mUrl.GetUrl(), buffer))
82     {
83       DALI_LOG_ERROR("Failed to download file! [%s]\n", mUrl.GetUrl().c_str());
84       return;
85     }
86   }
87   else
88   {
89     if(!Dali::FileLoader::ReadFile(mUrl.GetUrl(), buffer))
90     {
91       DALI_LOG_ERROR("Failed to read file! [%s]\n", mUrl.GetUrl().c_str());
92       return;
93     }
94   }
95
96   buffer.PushBack('\0');
97
98   if(!mVectorRenderer.Load(buffer, mDpi))
99   {
100     DALI_LOG_ERROR("Failed to load data! [%s]\n", mUrl.GetUrl().c_str());
101     return;
102   }
103
104   mHasSucceeded = true;
105 }
106
107 bool SvgLoadingTask::IsReady()
108 {
109   return true;
110 }
111
112 SvgRasterizingTask::SvgRasterizingTask(VectorImageRenderer vectorRenderer, uint32_t width, uint32_t height, CallbackBase* callback)
113 : SvgTask(vectorRenderer, callback),
114   mWidth(width),
115   mHeight(height)
116 {
117 }
118
119 SvgRasterizingTask::~SvgRasterizingTask()
120 {
121 }
122
123 void SvgRasterizingTask::Process()
124 {
125   if(!mVectorRenderer.IsLoaded())
126   {
127     DALI_LOG_ERROR("File is not loaded!\n");
128     return;
129   }
130
131   Devel::PixelBuffer pixelBuffer = mVectorRenderer.Rasterize(mWidth, mHeight);
132   if(!pixelBuffer)
133   {
134     DALI_LOG_ERROR("Rasterize is failed!\n");
135     return;
136   }
137
138   mPixelData    = Devel::PixelBuffer::Convert(pixelBuffer);
139   mHasSucceeded = true;
140 }
141
142 bool SvgRasterizingTask::IsReady()
143 {
144   return mVectorRenderer.IsLoaded();
145 }
146
147 PixelData SvgRasterizingTask::GetPixelData() const
148 {
149   return mPixelData;
150 }
151
152 } // namespace Internal
153
154 } // namespace Toolkit
155
156 } // namespace Dali