2 * Copyright (c) 2021 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 #include "canvas-view-rasterize-thread.h"
22 #include <dali/devel-api/adaptor-framework/thread-settings.h>
23 #include <dali/integration-api/adaptor-framework/adaptor.h>
31 CanvasRendererRasterizingTask::CanvasRendererRasterizingTask(CanvasView* canvasView, CanvasRenderer canvasRenderer)
32 : mCanvasView(canvasView),
33 mCanvasRenderer(canvasRenderer),
38 bool CanvasRendererRasterizingTask::Rasterize()
40 if(mCanvasRenderer && mCanvasRenderer.Rasterize())
47 CanvasView* CanvasRendererRasterizingTask::GetCanvasView() const
49 return mCanvasView.Get();
52 Texture CanvasRendererRasterizingTask::GetRasterizedTexture()
54 return mCanvasRenderer.GetRasterizedTexture();
57 CanvasViewRasterizeThread::CanvasViewRasterizeThread()
58 : mTrigger(new EventThreadCallback(MakeCallback(this, &CanvasViewRasterizeThread::ApplyRasterized))),
59 mLogFactory(Dali::Adaptor::Get().GetLogFactory()),
60 mProcessorRegistered(false),
61 mRasterizationCompletedSignal()
65 CanvasViewRasterizeThread::~CanvasViewRasterizeThread()
67 if(mProcessorRegistered && Adaptor::IsAvailable())
69 Adaptor::Get().UnregisterProcessor(*this);
73 void CanvasViewRasterizeThread::TerminateThread(CanvasViewRasterizeThread*& thread)
77 // add an empty task would stop the thread from conditional wait.
78 thread->AddTask(CanvasRendererRasterizingTaskPtr());
87 void CanvasViewRasterizeThread::AddTask(CanvasRendererRasterizingTaskPtr task)
89 bool wasEmpty = false;
92 // Lock while adding task to the queue
93 ConditionalWait::ScopedLock lock(mConditionalWait);
94 wasEmpty = mRasterizeTasks.empty();
95 if(!wasEmpty && task != NULL)
97 // Remove the tasks with the same renderer.
98 // Older task which waiting to rasterize and apply the svg to the same renderer is expired.
99 for(std::vector<CanvasRendererRasterizingTaskPtr>::iterator it = mRasterizeTasks.begin(), endIt = mRasterizeTasks.end(); it != endIt; ++it)
101 if((*it) && (*it)->GetCanvasView() == task->GetCanvasView()) //Need
103 mRasterizeTasks.erase(it);
108 mRasterizeTasks.push_back(task);
110 if(!mProcessorRegistered && Adaptor::IsAvailable())
112 Adaptor::Get().RegisterProcessor(*this);
113 mProcessorRegistered = true;
119 // wake up the image loading thread
120 mConditionalWait.Notify();
124 CanvasRendererRasterizingTaskPtr CanvasViewRasterizeThread::NextCompletedTask()
126 // Lock while popping task out from the queue
127 Mutex::ScopedLock lock(mMutex);
129 if(mCompletedTasks.empty())
131 return CanvasRendererRasterizingTaskPtr();
134 std::vector<CanvasRendererRasterizingTaskPtr>::iterator next = mCompletedTasks.begin();
135 CanvasRendererRasterizingTaskPtr nextTask = *next;
136 mCompletedTasks.erase(next);
141 void CanvasViewRasterizeThread::RemoveTask(CanvasView* canvasView)
143 // Lock while remove task from the queue
144 ConditionalWait::ScopedLock lock(mConditionalWait);
145 if(!mRasterizeTasks.empty())
147 for(std::vector<CanvasRendererRasterizingTaskPtr>::iterator it = mRasterizeTasks.begin(), endIt = mRasterizeTasks.end(); it != endIt; ++it)
149 if((*it) && (*it)->GetCanvasView() == canvasView)
151 mRasterizeTasks.erase(it);
157 UnregisterProcessor();
160 CanvasRendererRasterizingTaskPtr CanvasViewRasterizeThread::NextTaskToProcess()
162 // Lock while popping task out from the queue
163 ConditionalWait::ScopedLock lock(mConditionalWait);
166 while(mRasterizeTasks.empty())
168 mConditionalWait.Wait(lock);
171 // pop out the next task from the queue
172 std::vector<CanvasRendererRasterizingTaskPtr>::iterator next = mRasterizeTasks.begin();
173 CanvasRendererRasterizingTaskPtr nextTask = *next;
174 mRasterizeTasks.erase(next);
179 void CanvasViewRasterizeThread::AddCompletedTask(CanvasRendererRasterizingTaskPtr task)
181 // Lock while adding task to the queue
182 Mutex::ScopedLock lock(mMutex);
183 mCompletedTasks.push_back(task);
185 // wake up the main thread
189 void CanvasViewRasterizeThread::Run()
191 SetThreadName("CanvasViewThread");
192 mLogFactory.InstallLogFunction();
194 while(CanvasRendererRasterizingTaskPtr task = NextTaskToProcess())
196 if(task->Rasterize())
198 AddCompletedTask(task);
203 void CanvasViewRasterizeThread::ApplyRasterized()
205 while(CanvasRendererRasterizingTaskPtr task = NextCompletedTask())
207 RasterizationCompletedSignal().Emit(task->GetRasterizedTexture()); // Here texture get
210 UnregisterProcessor();
213 void CanvasViewRasterizeThread::Process(bool postProcessor)
218 CanvasViewRasterizeThread::RasterizationCompletedSignalType& CanvasViewRasterizeThread::RasterizationCompletedSignal()
220 return mRasterizationCompletedSignal;
223 void CanvasViewRasterizeThread::UnregisterProcessor()
225 if(mProcessorRegistered)
227 if(mRasterizeTasks.empty() && mCompletedTasks.empty() && Adaptor::IsAvailable())
229 Adaptor::Get().UnregisterProcessor(*this);
230 mProcessorRegistered = false;
235 } // namespace Internal
237 } // namespace Toolkit