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

#include <kis_indirect_painting_support.h>

+ Inheritance diagram for KisIndirectPaintingSupport:

Classes

struct  FinalMergeSuspender
 
struct  ReadLocker
 
struct  WriteLocker
 

Public Types

using FinalMergeSuspenderSP = QSharedPointer<FinalMergeSuspender>
 

Public Member Functions

bool hasTemporaryTarget () const
 
 KisIndirectPaintingSupport ()
 
void mergeToLayer (KisNodeSP layer, KUndo2Command *parentCommand, const KUndo2MagicString &transactionText, int timedID)
 
virtual void mergeToLayerThreaded (KisNodeSP layer, KUndo2Command *parentCommand, const KUndo2MagicString &transactionText, int timedID, QVector< KisRunnableStrokeJobData * > *jobs)
 
virtual void setCurrentColor (const KoColor &color)
 
void setTemporaryChannelFlags (const QBitArray &channelFlags)
 
void setTemporaryCompositeOp (const QString &id)
 
void setTemporaryOpacity (qreal o)
 
void setTemporarySelection (KisSelectionSP selection)
 
void setTemporaryTarget (KisPaintDeviceSP t)
 
void setupTemporaryPainter (KisPainter *painter) const
 
virtual bool supportsNonIndirectPainting () const
 
KisPaintDeviceSP temporaryTarget () const
 
FinalMergeSuspenderSP trySuspendFinalMerge ()
 
virtual ~KisIndirectPaintingSupport ()
 
- Public Member Functions inherited from Private
 Private (KisCanvas2 *c)
 

Public Attributes

QBitArray channelFlags
 
QString compositeOp
 
qreal compositeOpacity
 
bool finalMergeInProgress = true
 
QReadWriteLock lock
 
KisSelectionSP selection
 
KisPaintDeviceSP temporaryTarget
 
- Public Attributes inherited from Private
KisCanvas2canvas
 
int displayedFrame
 
int intendedFrame
 

Protected Types

using WriteLockerSP = QSharedPointer<WriteLocker>
 

Protected Member Functions

void lockTemporaryTargetForWrite () const
 
void mergeToLayerImpl (KisPaintDeviceSP dst, KUndo2Command *parentCommand, const KUndo2MagicString &transactionText, int timedID, bool cleanResources, WriteLockerSP sharedWriteLock, QVector< KisRunnableStrokeJobData * > *jobs)
 
void releaseResources ()
 
QString temporaryCompositeOp () const
 
virtual void writeMergeData (KisPainter *painter, KisPaintDeviceSP src, const QRect &rc)
 

Private Member Functions

 KisIndirectPaintingSupport (const KisIndirectPaintingSupport &)
 
void lockTemporaryTarget () const
 
KisIndirectPaintingSupportoperator= (const KisIndirectPaintingSupport &)
 
KisSelectionSP temporarySelection () const
 
void unlockTemporaryTarget () const
 

Private Attributes

Private *const d
 

Friends

class KisPainterBasedStrokeStrategy
 

Detailed Description

For classes that support indirect painting.

XXX: Name doesn't suggest an object – is KisIndirectPaintingLayer a better name? (BSAR)

Definition at line 25 of file kis_indirect_painting_support.cpp.

Member Typedef Documentation

◆ FinalMergeSuspenderSP

◆ WriteLockerSP

Constructor & Destructor Documentation

◆ KisIndirectPaintingSupport() [1/2]

KisIndirectPaintingSupport::KisIndirectPaintingSupport ( const KisIndirectPaintingSupport & )
private

◆ KisIndirectPaintingSupport() [2/2]

KisIndirectPaintingSupport::KisIndirectPaintingSupport ( )

◆ ~KisIndirectPaintingSupport()

KisIndirectPaintingSupport::~KisIndirectPaintingSupport ( )
virtual

Definition at line 43 of file kis_indirect_painting_support.cpp.

44{
45 delete d;
46}

References d.

Member Function Documentation

◆ hasTemporaryTarget()

bool KisIndirectPaintingSupport::hasTemporaryTarget ( ) const

Definition at line 120 of file kis_indirect_painting_support.cpp.

121{
122 return d->temporaryTarget;
123}

References d.

◆ lockTemporaryTarget()

void KisIndirectPaintingSupport::lockTemporaryTarget ( ) const
private

Lock the temporary target. It should be done for guarding every access to temporaryTarget() or original() NOTE: well, not "every", but...

Definition at line 78 of file kis_indirect_painting_support.cpp.

79{
80 d->lock.lockForRead();
81}

References d.

◆ lockTemporaryTargetForWrite()

void KisIndirectPaintingSupport::lockTemporaryTargetForWrite ( ) const
protected

Definition at line 83 of file kis_indirect_painting_support.cpp.

84{
85 d->lock.lockForWrite();
86 d->finalMergeInProgress = true;
87}

References d.

◆ mergeToLayer()

void KisIndirectPaintingSupport::mergeToLayer ( KisNodeSP layer,
KUndo2Command * parentCommand,
const KUndo2MagicString & transactionText,
int timedID )

Writes the temporary target into the paint device of the layer. This action will lock the temporary target itself.

When merging, we use barrier jobs only for ensuring that the merge jobs are not split by the update jobs. Merge jobs hold the shared lock, so forcing them out of CPU will basically cause a deadlock. When running in the fake executor, the jobs cannot be split anyway, so there is no danger in that.

Definition at line 133 of file kis_indirect_painting_support.cpp.

134{
136 mergeToLayerThreaded(layer, parentCommand, transactionText, timedID, &jobs);
137
146 executor.addRunnableJobs(implicitCastList<KisRunnableStrokeJobDataBase*>(jobs));
147}
virtual void mergeToLayerThreaded(KisNodeSP layer, KUndo2Command *parentCommand, const KUndo2MagicString &transactionText, int timedID, QVector< KisRunnableStrokeJobData * > *jobs)

References KisFakeRunnableStrokeJobsExecutor::addRunnableJobs(), KisFakeRunnableStrokeJobsExecutor::AllowBarrierJobs, and mergeToLayerThreaded().

◆ mergeToLayerImpl()

void KisIndirectPaintingSupport::mergeToLayerImpl ( KisPaintDeviceSP dst,
KUndo2Command * parentCommand,
const KUndo2MagicString & transactionText,
int timedID,
bool cleanResources,
WriteLockerSP sharedWriteLock,
QVector< KisRunnableStrokeJobData * > * jobs )
protected

Move tool may not have an undo adapter

Brushes don't apply the selection, we apply that during the indirect painting merge operation. It is cheaper calculation-wise.

Definition at line 172 of file kis_indirect_painting_support.cpp.

174{
175 struct SharedState {
176 QScopedPointer<KisTransaction> transaction;
177 };
178
179 QSharedPointer<SharedState> sharedState(new SharedState());
180
182 [sharedState, sharedWriteLock, dst, parentCommand, transactionText, timedID] () {
183 Q_UNUSED(sharedWriteLock); // just a RAII holder object for the lock
184
188 if (parentCommand) {
189 sharedState->transaction.reset(
190 new KisTransaction(transactionText, dst, parentCommand, timedID));
191 }
192 }
193 );
194
195 KisPaintDeviceSP src = d->temporaryTarget;
196 Q_FOREACH (const QRect &rc, src->region().rects()) {
198 [this, rc, src, dst, sharedState, sharedWriteLock] () {
199 Q_UNUSED(sharedWriteLock); // just a RAII holder object for the lock
200
206 KisPainter gc(dst);
208 this->writeMergeData(&gc, src, rc);
209 }
210 );
211 }
212
214 [this, sharedState, sharedWriteLock, cleanResources] () {
215 Q_UNUSED(sharedWriteLock); // just a RAII holder object for the lock
216
217 if (cleanResources) {
219 }
220
221 if (sharedState->transaction) {
222 // the internal command is stored using
223 // the link to the parent command
224 (void) sharedState->transaction->endAndTake();
225 }
226 }
227 );
228}
typedef void(QOPENGLF_APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC)(GLuint buffer)
void addJobConcurrent(QVector< Job * > &jobs, Func func)
void addJobSequential(QVector< Job * > &jobs, Func func)
virtual void writeMergeData(KisPainter *painter, KisPaintDeviceSP src, const QRect &rc)
void setupTemporaryPainter(KisPainter *painter) const

References KritaUtils::addJobConcurrent(), KritaUtils::addJobSequential(), d, releaseResources(), setupTemporaryPainter(), void(), and writeMergeData().

◆ mergeToLayerThreaded()

void KisIndirectPaintingSupport::mergeToLayerThreaded ( KisNodeSP layer,
KUndo2Command * parentCommand,
const KUndo2MagicString & transactionText,
int timedID,
QVector< KisRunnableStrokeJobData * > * jobs )
virtual

We create the lock in an unlocked state to avoid a deadlock, when layer-stack updating jobs push out the stroke jobs from the CPU and start sleeping on lockTemporaryTarget().

Now wait for all update jobs to finish and lock the indirect target

Reimplemented in KisColorizeMask.

Definition at line 149 of file kis_indirect_painting_support.cpp.

150{
157 WriteLockerSP sharedWriteLock(new WriteLocker(this, std::defer_lock));
158
163 [sharedWriteLock] () {
164 sharedWriteLock->relock();
165 });
166
167 mergeToLayerImpl(layer->paintDevice(), parentCommand, transactionText,
168 timedID, true, sharedWriteLock,
169 jobs);
170}
void addJobBarrier(QVector< Job * > &jobs, Func func)
virtual KisPaintDeviceSP paintDevice() const =0
QSharedPointer< WriteLocker > WriteLockerSP
void mergeToLayerImpl(KisPaintDeviceSP dst, KUndo2Command *parentCommand, const KUndo2MagicString &transactionText, int timedID, bool cleanResources, WriteLockerSP sharedWriteLock, QVector< KisRunnableStrokeJobData * > *jobs)

References KritaUtils::addJobBarrier(), mergeToLayerImpl(), and KisBaseNode::paintDevice().

◆ operator=()

KisIndirectPaintingSupport & KisIndirectPaintingSupport::operator= ( const KisIndirectPaintingSupport & )
private

◆ releaseResources()

void KisIndirectPaintingSupport::releaseResources ( )
protected

Definition at line 235 of file kis_indirect_painting_support.cpp.

236{
237 d->temporaryTarget = 0;
238 d->selection = 0;
239 d->compositeOp = COMPOSITE_OVER;
240 d->compositeOpacity = OPACITY_OPAQUE_F;
241 d->channelFlags.clear();
242}
const qreal OPACITY_OPAQUE_F
const QString COMPOSITE_OVER

References COMPOSITE_OVER, d, and OPACITY_OPAQUE_F.

◆ setCurrentColor()

void KisIndirectPaintingSupport::setCurrentColor ( const KoColor & color)
virtual

Reimplemented in KisColorizeMask.

Definition at line 48 of file kis_indirect_painting_support.cpp.

49{
50 Q_UNUSED(color);
51}

◆ setTemporaryChannelFlags()

void KisIndirectPaintingSupport::setTemporaryChannelFlags ( const QBitArray & channelFlags)

Definition at line 68 of file kis_indirect_painting_support.cpp.

69{
70 d->channelFlags = channelFlags;
71}

References channelFlags, and d.

◆ setTemporaryCompositeOp()

void KisIndirectPaintingSupport::setTemporaryCompositeOp ( const QString & id)

Definition at line 58 of file kis_indirect_painting_support.cpp.

59{
60 d->compositeOp = id;
61}

References d.

◆ setTemporaryOpacity()

void KisIndirectPaintingSupport::setTemporaryOpacity ( qreal o)

Definition at line 63 of file kis_indirect_painting_support.cpp.

64{
65 d->compositeOpacity = o;
66}

References d.

◆ setTemporarySelection()

void KisIndirectPaintingSupport::setTemporarySelection ( KisSelectionSP selection)

Definition at line 73 of file kis_indirect_painting_support.cpp.

74{
75 d->selection = selection;
76}

References d, and selection.

◆ setTemporaryTarget()

void KisIndirectPaintingSupport::setTemporaryTarget ( KisPaintDeviceSP t)

Definition at line 53 of file kis_indirect_painting_support.cpp.

54{
55 d->temporaryTarget = t;
56}

References d.

◆ setupTemporaryPainter()

void KisIndirectPaintingSupport::setupTemporaryPainter ( KisPainter * painter) const

Configures the painter to conform the painting parameters stored for th temporary target, such as compositeOp, opacity, channel flags and selection. Please do not setup them manually, but use this function instead.

Definition at line 125 of file kis_indirect_painting_support.cpp.

126{
127 painter->setOpacityF(d->compositeOpacity);
128 painter->setCompositeOpId(d->compositeOp);
129 painter->setChannelFlags(d->channelFlags);
130 painter->setSelection(d->selection);
131}
void setSelection(KisSelectionSP selection)
void setOpacityF(qreal opacity)
void setChannelFlags(QBitArray channelFlags)
void setCompositeOpId(const KoCompositeOp *op)

References d, KisPainter::setChannelFlags(), KisPainter::setCompositeOpId(), KisPainter::setOpacityF(), and KisPainter::setSelection().

◆ supportsNonIndirectPainting()

bool KisIndirectPaintingSupport::supportsNonIndirectPainting ( ) const
virtual

Reimplemented in KisColorizeMask.

Definition at line 100 of file kis_indirect_painting_support.cpp.

101{
102 return true;
103}

◆ temporaryCompositeOp()

QString KisIndirectPaintingSupport::temporaryCompositeOp ( ) const
protected

Definition at line 110 of file kis_indirect_painting_support.cpp.

111{
112 return d->compositeOp;
113}

References d.

◆ temporarySelection()

KisSelectionSP KisIndirectPaintingSupport::temporarySelection ( ) const
private

Only for debugging purposes. Please use setupTemporaryPainter() instead.

Definition at line 115 of file kis_indirect_painting_support.cpp.

116{
117 return d->selection;
118}

References d.

◆ temporaryTarget()

KisPaintDeviceSP KisIndirectPaintingSupport::temporaryTarget ( ) const

◆ trySuspendFinalMerge()

KisIndirectPaintingSupport::FinalMergeSuspenderSP KisIndirectPaintingSupport::trySuspendFinalMerge ( )

When the stroke uses multithreaded final merge and supports suspension, then it should also suspend the final merge explicitly by requesting a special RAII object for the whole period of suspension.

Definition at line 105 of file kis_indirect_painting_support.cpp.

106{
107 return toQShared(d->finalMergeInProgress ? new FinalMergeSuspender(this) : nullptr);
108}
QSharedPointer< T > toQShared(T *ptr)

References d, and toQShared().

◆ unlockTemporaryTarget()

void KisIndirectPaintingSupport::unlockTemporaryTarget ( ) const
private

Unlock the temporary target

See also
lockTemporaryTarget()

Definition at line 89 of file kis_indirect_painting_support.cpp.

90{
91 d->lock.unlock();
92 d->finalMergeInProgress = false;
93}

References d.

◆ writeMergeData()

void KisIndirectPaintingSupport::writeMergeData ( KisPainter * painter,
KisPaintDeviceSP src,
const QRect & rc )
protectedvirtual

Reimplemented in KisColorizeMask.

Definition at line 230 of file kis_indirect_painting_support.cpp.

231{
232 painter->bitBlt(rc.topLeft(), src, rc);
233}
void bitBlt(qint32 dstX, qint32 dstY, const KisPaintDeviceSP srcDev, qint32 srcX, qint32 srcY, qint32 srcWidth, qint32 srcHeight)

References KisPainter::bitBlt().

Friends And Related Symbol Documentation

◆ KisPainterBasedStrokeStrategy

friend class KisPainterBasedStrokeStrategy
friend

Definition at line 175 of file kis_indirect_painting_support.h.

Member Data Documentation

◆ channelFlags

QBitArray KisIndirectPaintingSupport::channelFlags

Definition at line 30 of file kis_indirect_painting_support.cpp.

◆ compositeOp

QString KisIndirectPaintingSupport::compositeOp

Definition at line 28 of file kis_indirect_painting_support.cpp.

◆ compositeOpacity

qreal KisIndirectPaintingSupport::compositeOpacity

Definition at line 29 of file kis_indirect_painting_support.cpp.

◆ d

Private* const KisIndirectPaintingSupport::d
private

Definition at line 185 of file kis_indirect_painting_support.h.

◆ finalMergeInProgress

bool KisIndirectPaintingSupport::finalMergeInProgress = true

Definition at line 34 of file kis_indirect_painting_support.cpp.

◆ lock

QReadWriteLock KisIndirectPaintingSupport::lock

Definition at line 33 of file kis_indirect_painting_support.cpp.

◆ selection

KisSelectionSP KisIndirectPaintingSupport::selection

Definition at line 31 of file kis_indirect_painting_support.cpp.

◆ temporaryTarget

KisPaintDeviceSP KisIndirectPaintingSupport::temporaryTarget

Definition at line 27 of file kis_indirect_painting_support.cpp.


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