Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_indirect_painting_support.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2004 Bart Coppens <kde@bartcoppens.be>
3 * SPDX-FileCopyrightText: 2010 Dmitry Kazakov <dimula73@gmail.com>
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 */
7
8#ifndef KIS_INDIRECT_PAINTING_SUPPORT_H_
9#define KIS_INDIRECT_PAINTING_SUPPORT_H_
10
11#include "kritaimage_export.h"
12#include "kis_types.h"
13
14#include <mutex>
15
16class QBitArray;
17class KisUndoAdapter;
19class KisPainter;
21class KoCompositeOp;
22class KoColor;
24
31class KRITAIMAGE_EXPORT KisIndirectPaintingSupport
32{
35public:
36
39
40 bool hasTemporaryTarget() const;
41
42 virtual void setCurrentColor(const KoColor &color);
43 void setTemporaryTarget(KisPaintDeviceSP t);
44 void setTemporaryCompositeOp(const QString &id);
45 void setTemporaryOpacity(qreal o);
46 void setTemporaryChannelFlags(const QBitArray& channelFlags);
47 void setTemporarySelection(KisSelectionSP selection);
48
55 void setupTemporaryPainter(KisPainter *painter) const;
56
61 void mergeToLayer(KisNodeSP layer, KUndo2Command *parentCommand, const KUndo2MagicString &transactionText, int timedID);
62 virtual void mergeToLayerThreaded(KisNodeSP layer, KUndo2Command *parentCommand, const KUndo2MagicString &transactionText, int timedID, QVector<KisRunnableStrokeJobData *> *jobs);
63
65
66 virtual bool supportsNonIndirectPainting() const;
67
71 struct ReadLocker {
72 ReadLocker(const KisIndirectPaintingSupport *lock) : m_lock(lock) {
73 m_lock->lockTemporaryTarget();
74 }
76 m_lock->unlockTemporaryTarget();
77 }
78
79 private:
81 };
82
95
102 FinalMergeSuspenderSP trySuspendFinalMerge();
103
104protected:
108 struct WriteLocker {
110 : m_lock(lock),
111 m_locked(true)
112 {
113 m_lock->lockTemporaryTargetForWrite();
114 }
115
116 WriteLocker(KisIndirectPaintingSupport *lock, std::defer_lock_t)
117 : m_lock(lock),
118 m_locked(false)
119 {
120 }
121
123 if (m_locked) {
124 m_lock->unlockTemporaryTarget();
125 }
126 }
127
128 void unlock() {
130 m_lock->unlockTemporaryTarget();
131 m_locked = false;
132 }
133
134 void relock() {
136 m_lock->lockTemporaryTargetForWrite();
137 m_locked = true;
138 }
139
140 bool isLocked() {
141 return m_locked;
142 }
143
144 private:
146 bool m_locked = false;
147 };
148
150
151 void mergeToLayerImpl(KisPaintDeviceSP dst, KUndo2Command *parentCommand, const KUndo2MagicString &transactionText, int timedID, bool cleanResources, WriteLockerSP sharedWriteLock, QVector<KisRunnableStrokeJobData *> *jobs);
152 virtual void writeMergeData(KisPainter *painter, KisPaintDeviceSP src, const QRect &rc);
153 void lockTemporaryTargetForWrite() const;
154
155 QString temporaryCompositeOp() const;
156 void releaseResources();
157
158private:
165 void lockTemporaryTarget() const;
166
172 void unlockTemporaryTarget() const;
173
174private:
176
181 KisSelectionSP temporarySelection() const;
182
183private:
184 struct Private;
185 Private* const d;
186};
187
188
189#endif /* KIS_INDIRECT_PAINTING_SUPPORT_H_ */
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
ReadLocker(const KisIndirectPaintingSupport *lock)
WriteLocker(KisIndirectPaintingSupport *lock, std::defer_lock_t)
KisIndirectPaintingSupport(const KisIndirectPaintingSupport &)
KisIndirectPaintingSupport & operator=(const KisIndirectPaintingSupport &)
KisPaintDeviceSP temporaryTarget() const