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

#include <kis_regenerate_frame_stroke_strategy.h>

+ Inheritance diagram for KisRegenerateFrameStrokeStrategy:

Classes

struct  Private
 

Public Types

enum  Type { EXTERNAL_FRAME , CURRENT_FRAME }
 
- 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
 
 KisRegenerateFrameStrokeStrategy (int frameId, const KisRegion &dirtyRegion, bool isCancellable, KisImageAnimationInterface *interface, KisLockFrameGenerationLock &&frameGenerationLock)
 
 KisRegenerateFrameStrokeStrategy (KisImageAnimationInterface *interface)
 
void resumeStrokeCallback () override
 
void suspendStrokeCallback () override
 
 ~KisRegenerateFrameStrokeStrategy () override
 
- 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())
 
- 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 ()
 

Static Public Member Functions

static QList< KisStrokeJobData * > createJobsData (KisImageWSP image)
 
- Static Public Member Functions inherited from KisSimpleStrokeStrategy
static QLatin1String jobTypeToString (JobType type)
 

Private Attributes

const QScopedPointer< Privatem_d
 

Additional Inherited Members

- 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 20 of file kis_regenerate_frame_stroke_strategy.h.

Member Enumeration Documentation

◆ Type

Constructor & Destructor Documentation

◆ KisRegenerateFrameStrokeStrategy() [1/2]

KisRegenerateFrameStrokeStrategy::KisRegenerateFrameStrokeStrategy ( int frameId,
const KisRegion & dirtyRegion,
bool isCancellable,
KisImageAnimationInterface * interface,
KisLockFrameGenerationLock && frameGenerationLock )

Constructs a strategy that refreshes an external frame in the background without ending/cancelling any running actions

Definition at line 72 of file kis_regenerate_frame_stroke_strategy.cpp.

77 : KisSimpleStrokeStrategy(QLatin1String("regenerate_external_frame_stroke")),
78 m_d(new Private)
79{
80 m_d->type = EXTERNAL_FRAME;
81
82 m_d->frameId = frameId;
83 m_d->dirtyRegion = dirtyRegion;
84 m_d->interface = interface;
85 m_d->frameGenerationLock = std::move(frameGenerationLock);
86
90
92
95
98 setCanForgetAboutMe(isCancellable);
99}
void enableJob(JobType type, bool enable=true, KisStrokeJobData::Sequentiality sequentiality=KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::Exclusivity exclusivity=KisStrokeJobData::NORMAL)
KisSimpleStrokeStrategy(const QLatin1String &id, const KUndo2MagicString &name=KUndo2MagicString())
void setClearsRedoOnStart(bool value)
void setRequestsOtherStrokesToEnd(bool value)
void setCanForgetAboutMe(bool value)

References KisStrokeJobData::BARRIER, KisSimpleStrokeStrategy::enableJob(), EXTERNAL_FRAME, KisSimpleStrokeStrategy::JOB_CANCEL, KisSimpleStrokeStrategy::JOB_DOSTROKE, KisSimpleStrokeStrategy::JOB_FINISH, KisSimpleStrokeStrategy::JOB_INIT, KisSimpleStrokeStrategy::JOB_RESUME, KisSimpleStrokeStrategy::JOB_SUSPEND, m_d, KisStrokeStrategy::setCanForgetAboutMe(), KisStrokeStrategy::setClearsRedoOnStart(), and KisStrokeStrategy::setRequestsOtherStrokesToEnd().

◆ KisRegenerateFrameStrokeStrategy() [2/2]

KisRegenerateFrameStrokeStrategy::KisRegenerateFrameStrokeStrategy ( KisImageAnimationInterface * interface)

Regenerates current frame without affecting the frames cache. Used for redrawing the image after switching frames.

NOTE: in contrast to the other c-tor, refreshing current frame does end all the running stroke, because it is not a background action, but a distinct user action.

Definition at line 101 of file kis_regenerate_frame_stroke_strategy.cpp.

102 : KisSimpleStrokeStrategy(QLatin1String("regenerate_current_frame_stroke"), kundo2_i18n("Render Animation")),
103 m_d(new Private)
104{
105 m_d->type = CURRENT_FRAME;
106
107 m_d->frameId = 0;
108 m_d->dirtyRegion = KisRegion();
109 m_d->interface = interface;
110
114
117
118 // switching frames is a distinct user action, so it should
119 // cancel the playback or any action easily
122}
KUndo2MagicString kundo2_i18n(const char *text)

References KisStrokeJobData::BARRIER, CURRENT_FRAME, KisSimpleStrokeStrategy::enableJob(), KisSimpleStrokeStrategy::JOB_CANCEL, KisSimpleStrokeStrategy::JOB_FINISH, KisSimpleStrokeStrategy::JOB_INIT, KisSimpleStrokeStrategy::JOB_RESUME, KisSimpleStrokeStrategy::JOB_SUSPEND, m_d, KisStrokeStrategy::setClearsRedoOnStart(), and KisStrokeStrategy::setRequestsOtherStrokesToEnd().

◆ ~KisRegenerateFrameStrokeStrategy()

KisRegenerateFrameStrokeStrategy::~KisRegenerateFrameStrokeStrategy ( )
override

Definition at line 124 of file kis_regenerate_frame_stroke_strategy.cpp.

125{
126}

Member Function Documentation

◆ cancelStrokeCallback()

void KisRegenerateFrameStrokeStrategy::cancelStrokeCallback ( )
overridevirtual

Reimplemented from KisSimpleStrokeStrategy.

Definition at line 185 of file kis_regenerate_frame_stroke_strategy.cpp.

186{
187 KisImageSP image = m_d->interface->image().toStrongRef();
188 if (!image) {
189 return;
190 }
191 if (m_d->type == EXTERNAL_FRAME) {
192 m_d->interface->notifyFrameCancelled();
193 m_d->interface->restoreCurrentTime(&m_d->previousFrameId);
194 image->enableUIUpdates();
195 m_d->restoreUpdatesFilter();
196 } else if (m_d->type == CURRENT_FRAME) {
197 m_d->interface->blockFrameInvalidation(false);
198 }
199}
QVector< QRect > enableUIUpdates() override

References CURRENT_FRAME, KisImage::enableUIUpdates(), EXTERNAL_FRAME, and m_d.

◆ createJobsData()

QList< KisStrokeJobData * > KisRegenerateFrameStrokeStrategy::createJobsData ( KisImageWSP image)
static

Definition at line 244 of file kis_regenerate_frame_stroke_strategy.cpp.

245{
248 KisImageSP image = _image;
249
250 const QRect cropRect = image->bounds();
253
254 Q_FOREACH (const QRect &rc, rects) {
255 jobsData << new Private::Data(image->root(), rc, cropRect);
256 }
257
258 return jobsData;
259}
QRect bounds() const override
QVector< QRect > splitRectIntoPatches(const QRect &rc, const QSize &patchSize)
QSize optimalPatchSize()

References KisImage::bounds(), KritaUtils::optimalPatchSize(), KisNodeFacade::root, and KritaUtils::splitRectIntoPatches().

◆ createLodClone()

KisStrokeStrategy * KisRegenerateFrameStrokeStrategy::createLodClone ( int levelOfDetail)
overridevirtual

We need to regenerate animation frames on LodN level only if we are processing current frame. Return dummy stroke otherwise

Reimplemented from KisStrokeStrategy.

Definition at line 201 of file kis_regenerate_frame_stroke_strategy.cpp.

202{
203 Q_UNUSED(levelOfDetail);
204
209 return m_d->type == CURRENT_FRAME ?
210 new KisRegenerateFrameStrokeStrategy(m_d->interface) :
211 new KisSimpleStrokeStrategy(QLatin1String("dumb-lodn-KisRegenerateFrameStrokeStrategy"));
212}
KisRegenerateFrameStrokeStrategy(int frameId, const KisRegion &dirtyRegion, bool isCancellable, KisImageAnimationInterface *interface, KisLockFrameGenerationLock &&frameGenerationLock)

References CURRENT_FRAME, KisRegenerateFrameStrokeStrategy(), KisSimpleStrokeStrategy::KisSimpleStrokeStrategy(), and m_d.

◆ doStrokeCallback()

void KisRegenerateFrameStrokeStrategy::doStrokeCallback ( KisStrokeJobData * data)
overridevirtual

Reimplemented from KisSimpleStrokeStrategy.

Definition at line 150 of file kis_regenerate_frame_stroke_strategy.cpp.

151{
152 Private::Data *d = dynamic_cast<Private::Data*>(data);
153 KIS_ASSERT(d);
154 KIS_ASSERT(!m_d->dirtyRegion.isEmpty());
155 KIS_ASSERT(m_d->type == EXTERNAL_FRAME);
156
157 const bool skipNonRenderableNodes = m_d->type == EXTERNAL_FRAME;
158 KisBaseRectsWalkerSP walker = new KisFullRefreshWalker(d->cropRect,
160 walker->collectRects(d->root, d->rect);
161
162 KisAsyncMerger merger;
163 merger.startMerge(*walker);
164}
void startMerge(KisBaseRectsWalker &walker, bool notifyClones=true)
void collectRects(KisNodeSP node, const QRect &requestedRect)
#define KIS_ASSERT(cond)
Definition kis_assert.h:33

References KisBaseRectsWalker::collectRects(), EXTERNAL_FRAME, KIS_ASSERT, m_d, KisBaseRectsWalker::None, KisBaseRectsWalker::SkipNonRenderableNodes, and KisAsyncMerger::startMerge().

◆ finishStrokeCallback()

void KisRegenerateFrameStrokeStrategy::finishStrokeCallback ( )
overridevirtual

Reimplemented from KisSimpleStrokeStrategy.

Definition at line 166 of file kis_regenerate_frame_stroke_strategy.cpp.

167{
168 KisImageSP image = m_d->interface->image().toStrongRef();
169 if (!image) {
170 return;
171 }
172
173
174 if (m_d->type == EXTERNAL_FRAME) {
175 m_d->interface->notifyFrameReady();
176 m_d->interface->restoreCurrentTime(&m_d->previousFrameId);
177 image->enableUIUpdates();
178 m_d->restoreUpdatesFilter();
179 } else if (m_d->type == CURRENT_FRAME) {
180 m_d->interface->notifyFrameRegenerated();
181 m_d->interface->blockFrameInvalidation(false);
182 }
183}

References CURRENT_FRAME, KisImage::enableUIUpdates(), EXTERNAL_FRAME, and m_d.

◆ initStrokeCallback()

void KisRegenerateFrameStrokeStrategy::initStrokeCallback ( )
overridevirtual

Reimplemented from KisSimpleStrokeStrategy.

Definition at line 128 of file kis_regenerate_frame_stroke_strategy.cpp.

129{
130 KisImageSP image = m_d->interface->image().toStrongRef();
131 if (!image) {
132 return;
133 }
134 if (m_d->type == EXTERNAL_FRAME) {
135 if (!image->animationInterface()->hasAnimation()) {
136 warnKrita << "KisRegenerateFrameStrokeStrategy::initStrokeCallback(): WARNING: trying to"
137 << "regenerate an external frame on a non-animated image, that will cause"
138 << "a useless consumption of memory";
139 }
140
141 m_d->saveAndResetUpdatesFilter();
142 image->disableUIUpdates();
143 m_d->interface->saveAndResetCurrentTime(m_d->frameId, &m_d->previousFrameId);
144 } else if (m_d->type == CURRENT_FRAME) {
145 m_d->interface->blockFrameInvalidation(true);
146 m_d->interface->updatesFacade()->refreshGraphAsync(KisNodeSP(), KisProjectionUpdateFlag::DontInvalidateFrames);
147 }
148}
void disableUIUpdates() override
KisImageAnimationInterface * animationInterface() const
#define warnKrita
Definition kis_debug.h:87
KisSharedPtr< KisNode > KisNodeSP
Definition kis_types.h:86

References KisImage::animationInterface(), CURRENT_FRAME, KisImage::disableUIUpdates(), DontInvalidateFrames, EXTERNAL_FRAME, KisImageAnimationInterface::hasAnimation(), m_d, and warnKrita.

◆ resumeStrokeCallback()

void KisRegenerateFrameStrokeStrategy::resumeStrokeCallback ( )
overridevirtual

Reimplemented from KisSimpleStrokeStrategy.

Definition at line 229 of file kis_regenerate_frame_stroke_strategy.cpp.

230{
231 KisImageSP image = m_d->interface->image().toStrongRef();
232 if (!image) {
233 return;
234 }
235 if (m_d->type == EXTERNAL_FRAME) {
236 m_d->saveAndResetUpdatesFilter();
237 image->disableUIUpdates();
238 m_d->interface->saveAndResetCurrentTime(m_d->frameId, &m_d->previousFrameId);
239 } else if (m_d->type == CURRENT_FRAME) {
240 m_d->interface->blockFrameInvalidation(true);
241 }
242}

References CURRENT_FRAME, KisImage::disableUIUpdates(), EXTERNAL_FRAME, and m_d.

◆ suspendStrokeCallback()

void KisRegenerateFrameStrokeStrategy::suspendStrokeCallback ( )
overridevirtual

Reimplemented from KisSimpleStrokeStrategy.

Definition at line 214 of file kis_regenerate_frame_stroke_strategy.cpp.

215{
216 KisImageSP image = m_d->interface->image().toStrongRef();
217 if (!image) {
218 return;
219 }
220 if (m_d->type == EXTERNAL_FRAME) {
221 m_d->interface->restoreCurrentTime(&m_d->previousFrameId);
222 image->enableUIUpdates();
223 m_d->restoreUpdatesFilter();
224 } else if (m_d->type == CURRENT_FRAME) {
225 m_d->interface->blockFrameInvalidation(false);
226 }
227}

References CURRENT_FRAME, KisImage::enableUIUpdates(), EXTERNAL_FRAME, and m_d.

Member Data Documentation

◆ m_d

const QScopedPointer<Private> KisRegenerateFrameStrokeStrategy::m_d
private

Definition at line 65 of file kis_regenerate_frame_stroke_strategy.h.


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