Krita Source Code Documentation
Loading...
Searching...
No Matches
KisDabRenderingQueue Class Reference

#include <KisDabRenderingQueue.h>

Classes

struct  CacheInterface
 
struct  Private
 

Public Member Functions

KisDabRenderingJobSP addDab (const KisDabCacheUtils::DabRequestInfo &request, qreal opacity, qreal flow)
 
int averageDabSize () const
 
qreal averageExecutionTime () const
 
KisFixedPaintDeviceSP fetchCachedPaintDevice ()
 
KisDabCacheUtils::DabRenderingResourcesfetchResourcesFromCache ()
 
bool hasPreparedDabs () const
 
 KisDabRenderingQueue (const KoColorSpace *cs, KisDabCacheUtils::ResourcesFactory resourcesFactory)
 
QList< KisDabRenderingJobSPnotifyJobFinished (int seqNo, int usecsTime=-1)
 
void putResourcesToCache (KisDabCacheUtils::DabRenderingResources *resources)
 
void setCacheInterface (CacheInterface *interface)
 
QList< KisRenderedDabtakeReadyDabs (bool returnMutableDabs=false, int oneTimeLimit=-1, bool *someDabsLeft=0)
 
int testingGetQueueSize () const
 
 ~KisDabRenderingQueue ()
 

Private Attributes

const QScopedPointer< Privatem_d
 

Detailed Description

Definition at line 20 of file KisDabRenderingQueue.h.

Constructor & Destructor Documentation

◆ KisDabRenderingQueue()

KisDabRenderingQueue::KisDabRenderingQueue ( const KoColorSpace * cs,
KisDabCacheUtils::ResourcesFactory resourcesFactory )

Definition at line 95 of file KisDabRenderingQueue.cpp.

97 : m_d(new Private(cs, resourcesFactory))
98{
99}
const QScopedPointer< Private > m_d

◆ ~KisDabRenderingQueue()

KisDabRenderingQueue::~KisDabRenderingQueue ( )

Definition at line 101 of file KisDabRenderingQueue.cpp.

102{
103}

Member Function Documentation

◆ addDab()

KisDabRenderingJobSP KisDabRenderingQueue::addDab ( const KisDabCacheUtils::DabRequestInfo & request,
qreal opacity,
qreal flow )

Definition at line 127 of file KisDabRenderingQueue.cpp.

129{
130 QMutexLocker l(&m_d->mutex);
131
132 const int seqNo = m_d->nextSeqNoToUse++;
133
134 KisDabCacheUtils::DabRenderingResources *resources = m_d->fetchResourcesFromCache();
136
137 // We should sync the cached brush into the current seqNo
138 resources->syncResourcesToSeqNo(seqNo, request.info);
139
140 const int lastDabJobIndex = m_d->lastDabJobInQueue;
141
143
144 bool shouldUseCache = false;
145 m_d->cacheInterface->getDabType(lastDabJobIndex >= 0, resources, request, &job->generationInfo, &shouldUseCache);
146
147 m_d->putResourcesToCache(resources);
148 resources = nullptr;
149
150 job->type = !shouldUseCache ? KisDabRenderingJob::Dab
151 : job->generationInfo.needsPostprocessing ? KisDabRenderingJob::Postprocess
153
154 if (job->type == KisDabRenderingJob::Dab) {
155 job->status = KisDabRenderingJob::Running;
156 } else if (job->type == KisDabRenderingJob::Postprocess ||
157 job->type == KisDabRenderingJob::Copy) {
158
160 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(lastDabJobIndex < m_d->jobs.size(), KisDabRenderingJobSP());
161
162 if (m_d->jobs[lastDabJobIndex]->status == KisDabRenderingJob::Completed) {
163 if (job->type == KisDabRenderingJob::Postprocess) {
164 job->status = KisDabRenderingJob::Running;
165 job->originalDevice = m_d->jobs[lastDabJobIndex]->originalDevice;
166 } else if (job->type == KisDabRenderingJob::Copy) {
167 job->status = KisDabRenderingJob::Completed;
168 job->originalDevice = m_d->jobs[lastDabJobIndex]->originalDevice;
169 job->postprocessedDevice = m_d->jobs[lastDabJobIndex]->postprocessedDevice;
170 m_d->avgExecutionTime(0);
171 }
172 }
173 }
174
175 m_d->jobs.append(job);
176
177 KisDabRenderingJobSP jobToRun;
178 if (job->status == KisDabRenderingJob::Running) {
179 jobToRun = job;
180 }
181
182 if (job->type == KisDabRenderingJob::Dab) {
183 m_d->lastDabJobInQueue = m_d->jobs.size() - 1;
184 m_d->cleanPaintedDabs();
185 }
186
187 // collect some statistics about the dab
188 m_d->avgDabSize(KisAlgebra2D::maxDimension(job->generationInfo.dstDabRect));
189
190 return jobToRun;
191}
QSharedPointer< KisDabRenderingJob > KisDabRenderingJobSP
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129
auto maxDimension(Size size) -> decltype(size.width())
virtual void syncResourcesToSeqNo(int seqNo, const KisPaintInformation &info)

References KisDabRenderingJob::Completed, KisDabRenderingJob::Copy, KisDabRenderingJob::Dab, KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE, m_d, KisAlgebra2D::maxDimension(), KisDabRenderingJob::Postprocess, KisDabRenderingJob::Running, and KisDabCacheUtils::DabRenderingResources::syncResourcesToSeqNo().

◆ averageDabSize()

int KisDabRenderingQueue::averageDabSize ( ) const

Definition at line 381 of file KisDabRenderingQueue.cpp.

382{
383 QMutexLocker l(&m_d->mutex);
384 return qRound(m_d->avgDabSize.rollingMean());
385}

References m_d.

◆ averageExecutionTime()

qreal KisDabRenderingQueue::averageExecutionTime ( ) const

Definition at line 375 of file KisDabRenderingQueue.cpp.

376{
377 QMutexLocker l(&m_d->mutex);
378 return m_d->avgExecutionTime.rollingMean() / 1000.0;
379}

References m_d.

◆ fetchCachedPaintDevice()

KisFixedPaintDeviceSP KisDabRenderingQueue::fetchCachedPaintDevice ( )

We create a special type of a fixed paint device that uses a custom allocator for better efficiency.

Definition at line 366 of file KisDabRenderingQueue.cpp.

367{
372 return new KisFixedPaintDevice(m_d->colorSpace, m_d->paintDeviceAllocator);
373}

References m_d.

◆ fetchResourcesFromCache()

KisDabCacheUtils::DabRenderingResources * KisDabRenderingQueue::fetchResourcesFromCache ( )

Definition at line 417 of file KisDabRenderingQueue.cpp.

418{
419 // TODO: make a separate lock for that
420 QMutexLocker l(&m_d->mutex);
421 return m_d->fetchResourcesFromCache();
422}

References m_d.

◆ hasPreparedDabs()

bool KisDabRenderingQueue::hasPreparedDabs ( ) const

Definition at line 355 of file KisDabRenderingQueue.cpp.

356{
357 QMutexLocker l(&m_d->mutex);
358 return m_d->hasPreparedDabsImpl();
359}

References m_d.

◆ notifyJobFinished()

QList< KisDabRenderingJobSP > KisDabRenderingQueue::notifyJobFinished ( int seqNo,
int usecsTime = -1 )

Here we use binary search for locating the necessary original dab

Definition at line 193 of file KisDabRenderingQueue.cpp.

194{
195 QMutexLocker l(&m_d->mutex);
196
197 QList<KisDabRenderingJobSP> dependentJobs;
198
202 auto finishedJobIt =
203 std::lower_bound(m_d->jobs.begin(), m_d->jobs.end(), seqNo,
205
206 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(finishedJobIt != m_d->jobs.end(), dependentJobs);
207 KisDabRenderingJobSP finishedJob = *finishedJobIt;
208
210 KIS_SAFE_ASSERT_RECOVER_NOOP(finishedJob->seqNo == seqNo);
211 KIS_SAFE_ASSERT_RECOVER_NOOP(finishedJob->originalDevice);
212 KIS_SAFE_ASSERT_RECOVER_NOOP(finishedJob->postprocessedDevice);
213
214 finishedJob->status = KisDabRenderingJob::Completed;
215
216 if (finishedJob->type == KisDabRenderingJob::Dab) {
217 for (auto it = finishedJobIt + 1; it != m_d->jobs.end(); ++it) {
218 KisDabRenderingJobSP j = *it;
219
220 // next dab job closes the chain
221 if (j->type == KisDabRenderingJob::Dab) break;
222
223 // the non 'dab'-type job couldn't have
224 // been started before the source ob was completed
226
227 if (j->type == KisDabRenderingJob::Copy) {
228
229 j->originalDevice = finishedJob->originalDevice;
230 j->postprocessedDevice = finishedJob->postprocessedDevice;
232 m_d->avgExecutionTime(0);
233
234 } else if (j->type == KisDabRenderingJob::Postprocess) {
235
236 j->originalDevice = finishedJob->originalDevice;
237 j->status = KisDabRenderingJob::Running;
238 dependentJobs << j;
239 }
240 }
241 }
242
243 if (usecsTime >= 0) {
244 m_d->avgExecutionTime(usecsTime);
245 }
246
247 return dependentJobs;
248}
#define KIS_SAFE_ASSERT_RECOVER_BREAK(cond)
Definition kis_assert.h:127
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:130
auto mem_less(MemTypeNoRef Class::*ptr, MemType &&value)
mem_less is an unary functor that compares a member of the object to a given value
Definition KisMpl.h:269

References KisDabRenderingJob::Completed, KisDabRenderingJob::Copy, KisDabRenderingJob::Dab, KIS_SAFE_ASSERT_RECOVER_BREAK, KIS_SAFE_ASSERT_RECOVER_NOOP, KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE, m_d, kismpl::mem_less(), KisDabRenderingJob::New, KisDabRenderingJob::Postprocess, KisDabRenderingJob::Running, and KisDabRenderingJob::seqNo.

◆ putResourcesToCache()

void KisDabRenderingQueue::putResourcesToCache ( KisDabCacheUtils::DabRenderingResources * resources)

Definition at line 424 of file KisDabRenderingQueue.cpp.

425{
426 QMutexLocker l(&m_d->mutex);
427 m_d->putResourcesToCache(resources);
428}

References m_d.

◆ setCacheInterface()

void KisDabRenderingQueue::setCacheInterface ( KisDabRenderingQueue::CacheInterface * interface)

Definition at line 361 of file KisDabRenderingQueue.cpp.

362{
363 m_d->cacheInterface.reset(interface);
364}

References m_d.

◆ takeReadyDabs()

QList< KisRenderedDab > KisDabRenderingQueue::takeReadyDabs ( bool returnMutableDabs = false,
int oneTimeLimit = -1,
bool * someDabsLeft = 0 )

Definition at line 285 of file KisDabRenderingQueue.cpp.

288{
289 QMutexLocker l(&m_d->mutex);
290
291 QList<KisRenderedDab> renderedDabs;
292 if (m_d->jobs.isEmpty()) return renderedDabs;
293
295 m_d->jobs.isEmpty() ||
296 m_d->jobs.first()->type == KisDabRenderingJob::Dab);
297
298 const int copyJobAfterInclusive =
299 returnMutableDabs && !m_d->dabsHaveSeparateOriginal() ?
300 m_d->lastDabJobInQueue :
301 std::numeric_limits<int>::max();
302
303 if (oneTimeLimit < 0) {
304 oneTimeLimit = std::numeric_limits<int>::max();
305 }
306
307 for (int i = 0; i < m_d->jobs.size() && oneTimeLimit > 0; i++, oneTimeLimit--) {
308 KisDabRenderingJobSP j = m_d->jobs[i];
309
310 if (j->status != KisDabRenderingJob::Completed) break;
311
312 if (i <= m_d->lastPaintedJob) continue;
313
314 KisRenderedDab dab;
315 KisFixedPaintDeviceSP resultDevice = j->postprocessedDevice;
316
317 if (i >= copyJobAfterInclusive) {
318 resultDevice = new KisFixedPaintDevice(*resultDevice);
319 }
320
321 dab.device = resultDevice;
322 dab.offset = j->dstDabOffset();
323 dab.opacity = j->opacity;
324 dab.flow = j->flow;
325
326 m_d->averageOpacity = KisPainter::blendAverageOpacity(j->opacity, m_d->averageOpacity);
327 dab.averageOpacity = m_d->averageOpacity;
328
329
330 renderedDabs.append(dab);
331
332 m_d->lastPaintedJob = i;
333 }
334
335 m_d->cleanPaintedDabs();
336
337 if (someDabsLeft) {
338 *someDabsLeft = m_d->hasPreparedDabsImpl();
339 }
340
341 return renderedDabs;
342}
static qreal blendAverageOpacity(qreal opacity, qreal averageOpacity)
KisFixedPaintDeviceSP device

References KisRenderedDab::averageOpacity, KisPainter::blendAverageOpacity(), KisDabRenderingJob::Completed, KisDabRenderingJob::Dab, KisRenderedDab::device, KisRenderedDab::flow, KIS_SAFE_ASSERT_RECOVER_NOOP, m_d, KisRenderedDab::offset, and KisRenderedDab::opacity.

◆ testingGetQueueSize()

int KisDabRenderingQueue::testingGetQueueSize ( ) const

Definition at line 430 of file KisDabRenderingQueue.cpp.

431{
432 QMutexLocker l(&m_d->mutex);
433
434 return m_d->jobs.size();
435}

References m_d.

Member Data Documentation

◆ m_d

const QScopedPointer<Private> KisDabRenderingQueue::m_d
private

Definition at line 63 of file KisDabRenderingQueue.h.


The documentation for this class was generated from the following files: