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

#include <kis_filter_stroke_strategy.h>

+ Inheritance diagram for KisFilterStrokeStrategy:

Classes

struct  ExternalCancelUpdatesStorage
 
class  FilterJobData
 
class  IdleBarrierData
 
struct  Private
 

Public Types

using ExternalCancelUpdatesStorageSP = QSharedPointer<ExternalCancelUpdatesStorage>
 
- Public Types inherited from KisSimpleStrokeStrategy
enum  JobType {
  JOB_INIT = 0 , JOB_CANCEL , JOB_FINISH , JOB_DOSTROKE ,
  JOB_SUSPEND , JOB_RESUME , NJOBS
}
 

Public Member Functions

void cancelStrokeCallback () override
 
KisStrokeStrategycreateLodClone (int levelOfDetail) override
 
void doStrokeCallback (KisStrokeJobData *data) override
 
void finishStrokeCallback () override
 
void initStrokeCallback () override
 
 KisFilterStrokeStrategy (const KisFilterStrokeStrategy &rhs, int levelOfDetail)
 
 KisFilterStrokeStrategy (KisFilterSP filter, KisFilterConfigurationSP filterConfig, KisResourcesSnapshotSP resources)
 
 KisFilterStrokeStrategy (KisFilterSP filter, KisFilterConfigurationSP filterConfig, KisResourcesSnapshotSP resources, ExternalCancelUpdatesStorageSP externalCancelUpdatesStorage)
 
 ~KisFilterStrokeStrategy () override
 
- Public Member Functions inherited from KisStrokeStrategyUndoCommandBased
void cancelStrokeCallback () override
 
void doStrokeCallback (KisStrokeJobData *data) override
 
void finishStrokeCallback () override
 
void initStrokeCallback () override
 
 KisStrokeStrategyUndoCommandBased (const KUndo2MagicString &name, bool undo, KisStrokeUndoFacade *undoFacade, KUndo2CommandSP initCommand=KUndo2CommandSP(0), KUndo2CommandSP finishCommand=KUndo2CommandSP(0))
 
void setCommandExtraData (KUndo2CommandExtraData *data)
 
void setMacroId (int value)
 
void setSupportsWrapAroundMode (bool value)
 
void setUsedWhileUndoRedo (bool value)
 
- Public Member Functions inherited from KisRunnableBasedStrokeStrategy
 KisRunnableBasedStrokeStrategy (const KisRunnableBasedStrokeStrategy &rhs)
 
 KisRunnableBasedStrokeStrategy (const QLatin1String &id, const KUndo2MagicString &name=KUndo2MagicString())
 
KisRunnableStrokeJobsInterfacerunnableJobsInterface () const
 
 ~KisRunnableBasedStrokeStrategy ()
 
- Public Member Functions inherited from KisSimpleStrokeStrategy
KisStrokeJobDatacreateCancelData () override
 
KisStrokeJobStrategycreateCancelStrategy () override
 
KisStrokeJobStrategycreateDabStrategy () override
 
KisStrokeJobDatacreateFinishData () override
 
KisStrokeJobStrategycreateFinishStrategy () override
 
KisStrokeJobDatacreateInitData () override
 
KisStrokeJobStrategycreateInitStrategy () override
 
KisStrokeJobDatacreateResumeData () override
 
KisStrokeJobStrategycreateResumeStrategy () override
 
KisStrokeJobDatacreateSuspendData () override
 
KisStrokeJobStrategycreateSuspendStrategy () override
 
 KisSimpleStrokeStrategy (const QLatin1String &id, const KUndo2MagicString &name=KUndo2MagicString())
 
virtual void resumeStrokeCallback ()
 
virtual void suspendStrokeCallback ()
 
- Public Member Functions inherited from KisStrokeStrategy
qreal balancingRatioOverride () const
 
bool canForgetAboutMe () const
 
bool clearsRedoOnStart () const
 
KisLodPreferences currentLodPreferences () const
 
bool forceLodModeIfPossible () const
 
QString id () const
 
bool isAsynchronouslyCancellable () const
 
bool isExclusive () const
 
 KisStrokeStrategy (const QLatin1String &id, const KUndo2MagicString &name=KUndo2MagicString())
 
KUndo2MagicString name () const
 
bool needsExplicitCancel () const
 
virtual void notifyUserEndedStroke ()
 
virtual void notifyUserStartedStroke ()
 
bool requestsOtherStrokesToEnd () const
 
void setForceLodModeIfPossible (bool forceLodModeIfPossible)
 
void setMutatedJobsInterface (KisStrokesQueueMutatedJobInterface *mutatedJobsInterface, KisStrokeId strokeId)
 
bool supportsWrapAroundMode () const
 
virtual void tryCancelCurrentStrokeJobAsync ()
 tryCancelCurrentStrokeJobAsync is called by the strokes queue when the stroke is being cancelled. The stroke strategy may or may not handle this request and cancel the currently running long action.
 
virtual ~KisStrokeStrategy ()
 

Private Attributes

Private *const m_d
 

Additional Inherited Members

- Static Public Member Functions inherited from KisSimpleStrokeStrategy
static QLatin1String jobTypeToString (JobType type)
 
- Protected Member Functions inherited from KisStrokeStrategyUndoCommandBased
void cancelStrokeCallbackImpl (QVector< KisStrokeJobData * > &mutatedJobs)
 
void executeCommand (KUndo2CommandSP command, bool undo)
 
 KisStrokeStrategyUndoCommandBased (const KisStrokeStrategyUndoCommandBased &rhs)
 
void notifyCommandDone (KUndo2CommandSP command, KisStrokeJobData::Sequentiality sequentiality, KisStrokeJobData::Exclusivity exclusivity)
 
virtual void postProcessToplevelCommand (KUndo2Command *command)
 Applies some modifications (e.g. assigning extra data) to the toplevel command.
 
void runAndSaveCommand (KUndo2CommandSP command, KisStrokeJobData::Sequentiality sequentiality, KisStrokeJobData::Exclusivity exclusivity)
 
KisStrokeUndoFacadeundoFacade () const
 
- Protected Member Functions inherited from KisSimpleStrokeStrategy
void enableJob (JobType type, bool enable=true, KisStrokeJobData::Sequentiality sequentiality=KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::Exclusivity exclusivity=KisStrokeJobData::NORMAL)
 
 KisSimpleStrokeStrategy (const KisSimpleStrokeStrategy &rhs)
 
- Protected Member Functions inherited from KisStrokeStrategy
void addMutatedJob (KisStrokeJobData *data)
 
void addMutatedJobs (const QVector< KisStrokeJobData * > list)
 
 KisStrokeStrategy (const KisStrokeStrategy &rhs)
 
void setAsynchronouslyCancellable (bool value)
 
void setBalancingRatioOverride (qreal value)
 
void setCanForgetAboutMe (bool value)
 
void setClearsRedoOnStart (bool value)
 
void setExclusive (bool value)
 
void setNeedsExplicitCancel (bool value)
 
void setRequestsOtherStrokesToEnd (bool value)
 
void setSupportsWrapAroundMode (bool value)
 

Detailed Description

Definition at line 15 of file kis_filter_stroke_strategy.h.

Member Typedef Documentation

◆ ExternalCancelUpdatesStorageSP

Constructor & Destructor Documentation

◆ KisFilterStrokeStrategy() [1/3]

KisFilterStrokeStrategy::KisFilterStrokeStrategy ( KisFilterSP filter,
KisFilterConfigurationSP filterConfig,
KisResourcesSnapshotSP resources )

Definition at line 132 of file kis_filter_stroke_strategy.cpp.

133 : KisFilterStrokeStrategy(filter, filterConfig, resources, toQShared(new ExternalCancelUpdatesStorage()))
134{
135 // by default, cancellation updates are disabled, so we should enable them
136 m_d->cancelledUpdates->shouldIssueCancellationUpdates.ref();
137}
KisFilterStrokeStrategy(KisFilterSP filter, KisFilterConfigurationSP filterConfig, KisResourcesSnapshotSP resources)
QSharedPointer< T > toQShared(T *ptr)
ExternalCancelUpdatesStorageSP cancelledUpdates

References KisFilterStrokeStrategy::Private::cancelledUpdates, and m_d.

◆ KisFilterStrokeStrategy() [2/3]

KisFilterStrokeStrategy::KisFilterStrokeStrategy ( KisFilterSP filter,
KisFilterConfigurationSP filterConfig,
KisResourcesSnapshotSP resources,
ExternalCancelUpdatesStorageSP externalCancelUpdatesStorage )

Definition at line 139 of file kis_filter_stroke_strategy.cpp.

143 : KisStrokeStrategyUndoCommandBased(kundo2_i18nc("Filter as an effect", "Filter \"%1\"", filter->name()),
144 false,
145 resources->image().data())
146 , m_d(new Private())
147{
148 m_d->filter = filter;
149 m_d->filterConfig = filterConfig;
150 m_d->node = resources->currentNode();
151 m_d->targetDevice = resources->currentNode()->paintDevice();
152 m_d->activeSelection = resources->activeSelection();
153 m_d->image = resources->image();
154 m_d->updatesFacade = resources->image().data();
155 m_d->levelOfDetail = 0;
156 m_d->cancelledUpdates = externalCancelUpdatesStorage;
157
164}
KisSelectionSP activeSelection() const
void enableJob(JobType type, bool enable=true, KisStrokeJobData::Sequentiality sequentiality=KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::Exclusivity exclusivity=KisStrokeJobData::NORMAL)
KisStrokeStrategyUndoCommandBased(const KUndo2MagicString &name, bool undo, KisStrokeUndoFacade *undoFacade, KUndo2CommandSP initCommand=KUndo2CommandSP(0), KUndo2CommandSP finishCommand=KUndo2CommandSP(0))
void setNeedsExplicitCancel(bool value)
KUndo2MagicString kundo2_i18nc(const char *ctxt, const char *text)
virtual KisPaintDeviceSP paintDevice() const =0

References KisResourcesSnapshot::activeSelection(), KisFilterStrokeStrategy::Private::activeSelection, KisFilterStrokeStrategy::Private::cancelledUpdates, KisResourcesSnapshot::currentNode(), KisSharedPtr< T >::data(), KisSimpleStrokeStrategy::enableJob(), KisFilterStrokeStrategy::Private::filter, KisFilterStrokeStrategy::Private::filterConfig, KisResourcesSnapshot::image(), KisFilterStrokeStrategy::Private::image, KisSimpleStrokeStrategy::JOB_CANCEL, KisSimpleStrokeStrategy::JOB_DOSTROKE, KisSimpleStrokeStrategy::JOB_FINISH, KisSimpleStrokeStrategy::JOB_INIT, KisFilterStrokeStrategy::Private::levelOfDetail, m_d, KisFilterStrokeStrategy::Private::node, KisBaseNode::paintDevice(), KisStrokeStrategy::setNeedsExplicitCancel(), KisStrokeStrategyUndoCommandBased::setSupportsWrapAroundMode(), KisFilterStrokeStrategy::Private::targetDevice, and KisFilterStrokeStrategy::Private::updatesFacade.

◆ KisFilterStrokeStrategy() [3/3]

KisFilterStrokeStrategy::KisFilterStrokeStrategy ( const KisFilterStrokeStrategy & rhs,
int levelOfDetail )

Definition at line 166 of file kis_filter_stroke_strategy.cpp.

168 , m_d(new Private(*rhs.m_d))
169{
170 m_d->levelOfDetail = levelOfDetail;
171}

References KisFilterStrokeStrategy::Private::levelOfDetail, and m_d.

◆ ~KisFilterStrokeStrategy()

KisFilterStrokeStrategy::~KisFilterStrokeStrategy ( )
override

Definition at line 173 of file kis_filter_stroke_strategy.cpp.

174{
175 delete m_d;
176}

References m_d.

Member Function Documentation

◆ cancelStrokeCallback()

void KisFilterStrokeStrategy::cancelStrokeCallback ( )
overridevirtual

Reimplemented from KisSimpleStrokeStrategy.

Definition at line 327 of file kis_filter_stroke_strategy.cpp.

328{
329 using namespace KritaUtils;
330
331 const bool shouldIssueCancellationUpdates = m_d->cancelledUpdates->shouldIssueCancellationUpdates;
332
334
338
339 if (shouldIssueCancellationUpdates) {
340 addJobSequential(jobs, [this] () {
341 QRect updateRect =
342 m_d->cancelledUpdates->updateRect |
344
345 if (m_d->levelOfDetail <= 0) {
346 updateRect |= m_d->cancelledUpdates->cancelledLod0UpdateRect;
347 }
348
349 if (!updateRect.isEmpty()) {
350 m_d->node->setDirty(updateRect);
351 }
352 });
353 } else if (!m_d->nextExternalUpdateRect.isEmpty()) {
354
356 m_d->cancelledUpdates->updateRect = t.mapInverted(m_d->nextExternalUpdateRect);
357
358 if (!m_d->hasBeenLodCloned && m_d->levelOfDetail <= 0) {
359 m_d->cancelledUpdates->cancelledLod0UpdateRect = m_d->nextExternalUpdateRect;
360 }
361 }
362
363 addMutatedJobs(jobs);
364}
void cancelStrokeCallbackImpl(QVector< KisStrokeJobData * > &mutatedJobs)
void addMutatedJobs(const QVector< KisStrokeJobData * > list)
void addJobSequential(QVector< Job * > &jobs, Func func)

References KritaUtils::addJobSequential(), KisStrokeStrategy::addMutatedJobs(), KisFilterStrokeStrategy::Private::cancelledUpdates, KisStrokeStrategyUndoCommandBased::cancelStrokeCallbackImpl(), KisCommandUtils::FlipFlopCommand::FINALIZING, KisFilterStrokeStrategy::Private::hasBeenLodCloned, KisCommandUtils::FlipFlopCommand::INITIALIZING, KisFilterStrokeStrategy::Private::levelOfDetail, m_d, KisLodTransformBase::mapInverted(), KisFilterStrokeStrategy::Private::nextExternalUpdateRect, toQShared(), and KisFilterStrokeStrategy::Private::updatesFacade.

◆ createLodClone()

KisStrokeStrategy * KisFilterStrokeStrategy::createLodClone ( int levelOfDetail)
overridevirtual

◆ doStrokeCallback()

void KisFilterStrokeStrategy::doStrokeCallback ( KisStrokeJobData * data)
overridevirtual

Save the last update to be able to restore the original state on the cancellation (even when the cancellation step is explicitly prohibited)

Reimplemented from KisSimpleStrokeStrategy.

Definition at line 195 of file kis_filter_stroke_strategy.cpp.

196{
197 FilterJobData *filterFrameData = dynamic_cast<FilterJobData*>(data);
198 KisRunnableStrokeJobData *jobData = dynamic_cast<KisRunnableStrokeJobData*>(data);
199
200 // Populate list of jobs for filter application...
201 if (filterFrameData) {
202
204
206 m_d->activeSelection, m_d->filter, m_d->filterConfig, filterFrameData) );
208 addJobSequential(jobs, [this, shared, progress](){
209 // Switch time if necessary..
210 if (shared->shouldSwitchTime()) {
211 runAndSaveCommand( toQShared( new KisLayerUtils::SwitchFrameCommand(shared->image(), shared->frameTime(), false, shared->storage()) )
212 , KisStrokeJobData::BARRIER, KisStrokeJobData::NORMAL);
213 }
214
215 // Copy snapshot of targetDevice for filter processing..
216 shared->filterDevice = new KisPaintDevice(*shared->targetDevice());
217
218 // Update all necessary rect data based on contents of frame..
219 shared->filterDeviceBounds = shared->filterDevice->exactBounds();
220
221 if (shared->filter()->needsTransparentPixels(shared->filterConfig().data(), shared->targetDevice()->colorSpace())) {
222 shared->filterDeviceBounds |= shared->targetDevice()->defaultBounds()->bounds();
223 }
224
225 shared->processRect = shared->filter()->changedRect(shared->filterDeviceBounds, shared->filterConfig(), shared->levelOfDetail());
226 shared->processRect &= shared->targetDevice()->defaultBounds()->bounds();
227
228 //If we're dealing with some kind of transparency mask, we will create a compositionSourceDevice instead.
229 // Carry over from commit ca810f85 ...
230 if (shared->selection() ||
231 (shared->targetDevice()->colorSpace() != shared->targetDevice()->compositionSourceColorSpace() &&
232 *shared->targetDevice()->colorSpace() != *shared->targetDevice()->compositionSourceColorSpace())) {
233
234 shared->filterDevice = shared->targetDevice()->createCompositionSourceDevice(shared->targetDevice());
235
236 if (shared->selection()) {
237 shared->filterDeviceBounds &= shared->selection()->selectedRect();
238 }
239 }
240
241 // Filter device needs a transaction to prevent grid-patch artifacts from multithreaded read/write.
242 shared->filterDeviceTransaction.reset(new KisTransaction(shared->filterDevice));
243
244
245 // Actually process the device
246
248
249 if (shared->filter()->supportsThreading()) {
250 // Split stroke into patches...
252 QVector<QRect> patches = KritaUtils::splitRectIntoPatches(shared->processRect, size);
253
254 Q_FOREACH (const QRect &patch, patches) {
255 if (!patch.isEmpty()) {
256 addJobConcurrent(processJobs, [patch, shared, progress](){
257 shared->filter()->processImpl(shared->filterDevice, patch,
258 shared->filterConfig().data(),
259 progress->updater());
260 });
261 }
262 }
263 } else {
264 if (!shared->processRect.isEmpty()) {
265 addJobSequential(processJobs, [shared, progress](){
266 shared->filter()->processImpl(shared->filterDevice, shared->processRect,
267 shared->filterConfig().data(),
268 progress->updater());
269 });
270 }
271 }
272
274
275 });
276
277 addJobSequential(jobs, [this, shared](){
278 // We will first apply the transaction to the temporary filterDevice
279 runAndSaveCommand(toQShared(shared->filterDeviceTransaction->endAndTake()), KisStrokeJobData::BARRIER, KisStrokeJobData::NORMAL);
280 shared->filterDeviceTransaction.reset();
281
282 if (!shared->filterDeviceBounds.intersects(
283 shared->filter()->neededRect(shared->processRect, shared->filterConfig().data(), shared->levelOfDetail()))) {
284 return;
285 }
286
287 // Make a transaction, change the target device, and "end" transaction.
288 // Should be useful for undoing later.
289 QScopedPointer<KisTransaction> workingTransaction( new KisTransaction(shared->targetDevice()) );
290 KisPainter::copyAreaOptimized(shared->processRect.topLeft(), shared->filterDevice, shared->targetDevice(), shared->processRect, shared->selection());
292
293 if (shared->shouldRedraw()) {
294 QRect extraUpdateRect;
295 qSwap(extraUpdateRect, m_d->nextExternalUpdateRect);
296
297 shared->node()->setDirty(shared->processRect | extraUpdateRect);
298
304 m_d->nextExternalUpdateRect = shared->processRect;
305 }
306 });
307
308 addJobSequential(jobs, [this, shared](){
309 shared->image()->animationInterface()->invalidateFrame(shared->frameTime(), shared->node());
310 if (shared->shouldSwitchTime()) {
311 runAndSaveCommand( toQShared( new KisLayerUtils::SwitchFrameCommand(shared->image(), shared->frameTime(), true, shared->storage()) )
313 }
314 });
315
317
318 } else if (dynamic_cast<IdleBarrierData*>(data)) {
319 /* noop, just delete that */
320 } else if (jobData) {
321 jobData->run();
322 } else {
324 }
325}
static void copyAreaOptimized(const QPoint &dstPt, KisPaintDeviceSP src, KisPaintDeviceSP dst, const QRect &originalSrcRect)
KisRunnableStrokeJobsInterface * runnableJobsInterface() const
virtual void addRunnableJobs(const QVector< KisRunnableStrokeJobDataBase * > &list)=0
void runAndSaveCommand(KUndo2CommandSP command, KisStrokeJobData::Sequentiality sequentiality, KisStrokeJobData::Exclusivity exclusivity)
void doStrokeCallback(KisStrokeJobData *data) override
int size(const Forest< T > &forest)
Definition KisForest.h:1232
QVector< QRect > splitRectIntoPatches(const QRect &rc, const QSize &patchSize)
void addJobConcurrent(QVector< Job * > &jobs, Func func)
QSize optimalPatchSize()
The SwitchFrameCommand struct Switches to frame with undo/redo support.

References KisFilterStrokeStrategy::Private::activeSelection, KritaUtils::addJobConcurrent(), KritaUtils::addJobSequential(), KisRunnableStrokeJobsInterface::addRunnableJobs(), KisStrokeJobData::BARRIER, KisPainter::copyAreaOptimized(), KisStrokeStrategyUndoCommandBased::doStrokeCallback(), KisStrokeJobData::EXCLUSIVE, KisFilterStrokeStrategy::Private::filter, KisFilterStrokeStrategy::Private::filterConfig, KisFilterStrokeStrategy::Private::image, KisFilterStrokeStrategy::Private::levelOfDetail, m_d, KisFilterStrokeStrategy::Private::nextExternalUpdateRect, KisFilterStrokeStrategy::Private::node, KisStrokeJobData::NORMAL, KritaUtils::optimalPatchSize(), KisRunnableStrokeJobData::run(), KisStrokeStrategyUndoCommandBased::runAndSaveCommand(), KisRunnableBasedStrokeStrategy::runnableJobsInterface(), KritaUtils::splitRectIntoPatches(), and toQShared().

◆ finishStrokeCallback()

void KisFilterStrokeStrategy::finishStrokeCallback ( )
overridevirtual

◆ initStrokeCallback()

void KisFilterStrokeStrategy::initStrokeCallback ( )
overridevirtual

Reimplemented from KisSimpleStrokeStrategy.

Definition at line 178 of file kis_filter_stroke_strategy.cpp.

179{
181
182 qSwap(m_d->nextExternalUpdateRect, m_d->cancelledUpdates->updateRect);
185
186 KUndo2Command *autoKeyframeCommand =
189 if (autoKeyframeCommand) {
191 }
192}
KUndo2Command * tryAutoCreateDuplicatedFrame(KisPaintDeviceSP device, AutoCreateKeyframeFlags flags)
create a new duplicated keyframe if auto-keyframe mode is on

References KisStrokeJobData::BARRIER, KisFilterStrokeStrategy::Private::cancelledUpdates, KisStrokeStrategyUndoCommandBased::initStrokeCallback(), KisFilterStrokeStrategy::Private::levelOfDetail, m_d, KisLodTransform::map(), KisFilterStrokeStrategy::Private::nextExternalUpdateRect, KisFilterStrokeStrategy::Private::node, KisStrokeJobData::NORMAL, KisBaseNode::paintDevice(), KisStrokeStrategyUndoCommandBased::runAndSaveCommand(), KisAutoKey::SupportsLod, toQShared(), and KisAutoKey::tryAutoCreateDuplicatedFrame().

Member Data Documentation

◆ m_d

Private* const KisFilterStrokeStrategy::m_d
private

Definition at line 102 of file kis_filter_stroke_strategy.h.


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