Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_sync_lod_cache_stroke_strategy.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2014 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
9#include <kis_image.h>
10#include <kundo2magicstring.h>
11#include "krita_utils.h"
12#include "kis_layer_utils.h"
13#include "kis_pointer_utils.h"
15
20
38
42
44{
46 createJobsData(jobs, m_d->image->root(), m_d->image.data(), m_d->image->currentLevelOfDetail());
47 addMutatedJobs(jobs);
48}
49
51{
52 // all the jobs are populates in the init job
53 return {};
54}
55
57{
61
62 using SharedData = QHash<KisPaintDeviceSP, QSharedPointer<KisPaintDevice::LodDataStruct>>;
63 using SharedDataSP = QSharedPointer<SharedData>;
64
65 SharedDataSP sharedData(new SharedData());
66
67 KisPaintDeviceList deviceList = extraDevices;
68
69 recursiveApplyNodes(imageRoot,
70 [&deviceList](KisNodeSP node) {
71 deviceList << node->getLodCapableDevices();
72 });
73
75
76 KritaUtils::addJobBarrierNoCancel(jobs, [updatesFacade] () {
77 updatesFacade->blockUpdates();
78 });
79
80 KritaUtils::addJobBarrier(jobs, [sharedData, deviceList, levelOfDetail] () mutable {
81 Q_FOREACH (KisPaintDeviceSP device, deviceList) {
82 sharedData->insert(device, toQShared(device->createLodDataStruct(levelOfDetail)));
83 }
84 });
85
86 KritaUtils::addJobSequential(jobs, [](){});
87
88 Q_FOREACH (KisPaintDeviceSP device, deviceList) {
89 KisRegion region = device->regionForLodSyncing();
90 QVector<QRect> rects = splitRegionIntoPatches(region, optimalPatchSize());
91
92 Q_FOREACH (const QRect &rc, rects) {
93 KritaUtils::addJobConcurrent(jobs, [sharedData, device, rc] () mutable {
94 KIS_ASSERT(sharedData->contains(device));
95
96 KisPaintDevice::LodDataStruct *data = sharedData->value(device).data();
97 device->updateLodDataStruct(data, rc);
98 });
99 }
100 }
101
102 KritaUtils::addJobSequential(jobs, [](){});
103
104 recursiveApplyNodes(imageRoot,
105 [&jobs](KisNodeSP node) {
106 KritaUtils::addJobConcurrent(jobs, [node] () mutable {
107 node->syncLodCache();
108 });
109 });
110
111 KritaUtils::addJobSequential(jobs, [sharedData] () mutable {
112 auto it = sharedData->begin();
113 auto end = sharedData->end();
114
115 for (; it != end; ++it) {
116 KisPaintDeviceSP dev = it.key();
117 dev->uploadLodDataStruct(it.value().data());
118 }
119 });
120
121 KritaUtils::addJobSequentialNoCancel(jobs, [updatesFacade] () {
122 updatesFacade->unblockUpdates();
123 });
124}
void uploadLodDataStruct(LodDataStruct *dst)
KisRegion regionForLodSyncing() const
LodDataStruct * createLodDataStruct(int lod)
void updateLodDataStruct(LodDataStruct *dst, const QRect &srcRect)
void enableJob(JobType type, bool enable=true, KisStrokeJobData::Sequentiality sequentiality=KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::Exclusivity exclusivity=KisStrokeJobData::NORMAL)
void addMutatedJobs(const QVector< KisStrokeJobData * > list)
void setClearsRedoOnStart(bool value)
void setRequestsOtherStrokesToEnd(bool value)
void setCanForgetAboutMe(bool value)
KisSyncLodCacheStrokeStrategy(KisImageWSP image, bool forgettable)
static QList< KisStrokeJobData * > createJobsData(KisImageWSP image)
virtual void blockUpdates()=0
virtual void unblockUpdates()=0
#define KIS_ASSERT(cond)
Definition kis_assert.h:33
QSharedPointer< T > toQShared(T *ptr)
KUndo2MagicString kundo2_i18n(const char *text)
void recursiveApplyNodes(NodePointer node, Functor func)
void addJobSequentialNoCancel(QVector< Job * > &jobs, Func func)
void addJobConcurrent(QVector< Job * > &jobs, Func func)
void addJobSequential(QVector< Job * > &jobs, Func func)
void makeContainerUnique(C &container)
void addJobBarrier(QVector< Job * > &jobs, Func func)
QVector< QRect > splitRegionIntoPatches(const KisRegion &region, const QSize &patchSize)
void addJobBarrierNoCancel(QVector< Job * > &jobs, Func func)
QSize optimalPatchSize()
virtual KisPaintDeviceList getLodCapableDevices() const
Definition kis_node.cpp:682
virtual void syncLodCache()
Definition kis_node.cpp:677