File indexing completed on 2025-03-09 04:09:58

0001 /*
0002  *  SPDX-FileCopyrightText: 2017 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "KisDabRenderingExecutor.h"
0008 
0009 #include "KisDabRenderingQueue.h"
0010 #include "KisDabRenderingQueueCache.h"
0011 #include "KisDabRenderingJob.h"
0012 #include "KisRenderedDab.h"
0013 #include "KisRunnableStrokeJobsInterface.h"
0014 #include "KisRunnableStrokeJobData.h"
0015 #include <tool/strokes/FreehandStrokeRunnableJobDataWithUpdate.h>
0016 
0017 struct KisDabRenderingExecutor::Private
0018 {
0019     QScopedPointer<KisDabRenderingQueue> renderingQueue;
0020     KisRunnableStrokeJobsInterface *runnableJobsInterface;
0021 };
0022 
0023 KisDabRenderingExecutor::KisDabRenderingExecutor(const KoColorSpace *cs,
0024                                                  KisDabCacheUtils::ResourcesFactory resourcesFactory,
0025                                                  KisRunnableStrokeJobsInterface *runnableJobsInterface,
0026                                                  KisMirrorOption *mirrorOption,
0027                                                  KisPrecisionOption *precisionOption)
0028     : m_d(new Private)
0029 {
0030     m_d->runnableJobsInterface = runnableJobsInterface;
0031 
0032     m_d->renderingQueue.reset(
0033         new KisDabRenderingQueue(cs, resourcesFactory));
0034 
0035     KisDabRenderingQueueCache *cache = new KisDabRenderingQueueCache();
0036     cache->setMirrorPostprocessing(mirrorOption);
0037     cache->setPrecisionOption(precisionOption);
0038 
0039     m_d->renderingQueue->setCacheInterface(cache);
0040 }
0041 
0042 KisDabRenderingExecutor::~KisDabRenderingExecutor()
0043 {
0044 }
0045 
0046 void KisDabRenderingExecutor::addDab(const KisDabCacheUtils::DabRequestInfo &request,
0047                                      qreal opacity, qreal flow)
0048 {
0049     KisDabRenderingJobSP job = m_d->renderingQueue->addDab(request, opacity, flow);
0050     if (job) {
0051         m_d->runnableJobsInterface->addRunnableJob(
0052             new FreehandStrokeRunnableJobDataWithUpdate(
0053                         new KisDabRenderingJobRunner(job, m_d->renderingQueue.data(), m_d->runnableJobsInterface),
0054                         KisStrokeJobData::CONCURRENT));
0055     }
0056 }
0057 
0058 QList<KisRenderedDab> KisDabRenderingExecutor::takeReadyDabs(bool returnMutableDabs,
0059                                                              int oneTimeLimit,
0060                                                              bool *someDabsLeft)
0061 {
0062     return m_d->renderingQueue->takeReadyDabs(returnMutableDabs, oneTimeLimit, someDabsLeft);
0063 }
0064 
0065 bool KisDabRenderingExecutor::hasPreparedDabs() const
0066 {
0067     return m_d->renderingQueue->hasPreparedDabs();
0068 }
0069 
0070 qreal KisDabRenderingExecutor::averageDabRenderingTime() const
0071 {
0072     return m_d->renderingQueue->averageExecutionTime();
0073 }
0074 
0075 int KisDabRenderingExecutor::averageDabSize() const
0076 {
0077     return m_d->renderingQueue->averageDabSize();
0078 }