111 : m_d(new
Private(*rhs.m_d, newImage))
129 hasAnimation |= node->isAnimated();
137 return m_d->currentTime();
142 return m_d->currentUITime();
147 return m_d->documentRange;
153 m_d->documentRange = range;
171 return m_d->activePlaybackRange.
isValid() ?
m_d->activePlaybackRange :
m_d->documentRange;
177 m_d->activePlaybackRange = range;
183 return m_d->framerate;
188 return m_d->exportSequenceFilePath;
193 m_d->exportSequenceFilePath = filePath;
198 return m_d->exportSequenceBaseName;
203 m_d->exportSequenceBaseName = baseName;
208 return m_d->exportInitialFrameNumber;
213 m_d->exportInitialFrameNumber = frameNum;
218 return m_d->activeLayerSelectedTimes;
223 m_d->activeLayerSelectedTimes = times;
229 m_d->framerate = fps;
241 return m_d->externalFrameActive;
254 m_d->image->setDefaultProjectionColor(color);
266 m_d->setCurrentTime(frameId);
280 if (!token || !token->tryResetDestinationTime(frameId, needsRegeneration)) {
284 m_d->image->postExecutionUndoAdapter() : 0;
290 m_d->switchToken = strategy->
token();
293 m_d->image->endStroke(stroke);
296 if (needsRegeneration) {
301 m_d->image->endStroke(strokeId);
305 if (!needsRegeneration) {
311 m_d->setCurrentUITime(frameId);
328 m_d->image->addJob(stroke, job);
330 m_d->image->endStroke(stroke);
335 m_d->externalFrameActive =
true;
336 *savedValue =
m_d->currentTime();
337 m_d->setCurrentTime(frameId);
342 m_d->setCurrentTime(*savedValue);
343 m_d->externalFrameActive =
false;
364 bool onionSkinProp = p->nodeProperties().boolProperty(
"onionskin", false);
365 return onionSkinProp;
368 return onionskinned !=
nullptr;
390 if (node->inherits(
"KisSelectionMask"))
return;
392 QSet<int> affectedTimes;
393 affectedTimes <<
m_d->currentTime();
397 QSet<int> clonedTimes;
398 const int time =
m_d->currentTime();
403 affectedTimes += clonedTimes;
408 foreach (
const int& time, affectedTimes ){
419 Q_FOREACH (
const QRect &rc, rects) {
429 m_d->cachedLastFrameValue = -1;
435 m_d->cachedLastFrameValue = -1;
440 Q_FOREACH(
const int& identicalTime, identicalFrames) {
447 m_d->frameInvalidationBlocked =
value;
470 if (
m_d->cachedLastFrameValue < 0) {
474 int lastKey =
m_d->cachedLastFrameValue;
476 lastKey = std::max(lastKey,
m_d->documentRange.end());
477 lastKey = std::max(lastKey,
m_d->currentUITime());
484 m_d->backgroundFrameGenerationBlocked.ref();
489 m_d->backgroundFrameGenerationBlocked.deref();
494 return m_d->backgroundFrameGenerationBlocked.loadAcquire();
499 return m_d->frameGenerationLock.tryLock();
504 m_d->frameGenerationLock.lock();
509 m_d->frameGenerationLock.unlock();
float value(const T *src, size_t ch)
KisMagneticGraph::vertex_descriptor target(typename KisMagneticGraph::edge_descriptor e, KisMagneticGraph g)
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
void setExportSequenceBaseName(const QString &baseName)
KisImageWSP image() const
void notifyFrameCancelled()
QString exportSequenceBaseName()
void sigFrameReady(int time)
sigFrameReady notifies when an External frame has been regenerated and is available.
void requestTimeSwitchWithUndo(int time)
void sigFramerateChanged()
void sigUiTimeChanged(int newTime)
bool requiresOnionSkinRendering()
void switchCurrentTimeAsync(int frameId, SwitchTimeAsyncFlags options=STAO_NONE)
void setDocumentRangeStartFrame(int column)
void setActiveLayerSelectedTimes(const QSet< int > ×)
void setDocumentRange(const KisTimeSpan range)
const KisTimeSpan & activePlaybackRange() const
activePlaybackRange
void sigFrameRegenerationSkipped(int time)
sigFrameRegenerationSkipped notified when async frame changes are skipped.
~KisImageAnimationInterface() override
void unlockFrameGeneration()
void sigInternalRequestTimeSwitch(int frameId, bool useUndo)
int currentUITime() const
void setFramerate(int fps)
@ STAO_FORCE_REGENERATION
void explicitlySetCurrentTime(int frameId)
void invalidateFrame(const int time, KisNodeSP target)
void setActivePlaybackRange(const KisTimeSpan range)
void blockBackgroundFrameGeneration()
void sigPlaybackRangeChanged()
const KisTimeSpan & documentPlaybackRange() const
documentPlaybackRange
bool hasAnimation() const
void sigDocumentRangeChanged()
void blockFrameInvalidation(bool value)
KisUpdatesFacade * updatesFacade() const
QString exportSequenceFilePath()
void unblockBackgroundFrameGeneration()
void setDefaultProjectionColor(const KoColor &color)
friend class KisSwitchTimeStrokeStrategy
void invalidateFrames(const KisTimeSpan &range, const QRect &rect)
void requestFrameRegeneration(int frameId, const KisRegion &dirtyRegion, bool isCancellable, KisLockFrameGenerationLock &&lock)
KisImageAnimationInterface(KisImage *image)
QSet< int > activeLayerSelectedTimes()
int exportInitialFrameNumber()
void restoreCurrentTime(int *savedValue)
void notifyNodeChanged(const KisNode *node, const QRect &rect, bool recursive)
void setExportInitialFrameNumber(const int frameNum)
void sigFrameRegenerated(int time)
sigFrameRegenerated notifies when internal frame has been fully regenerated.
void saveAndResetCurrentTime(int frameId, int *savedValue)
bool tryLockFrameGeneration()
bool backgroundFrameGenerationBlocked() const
void notifyFrameRegenerated()
void requestTimeSwitchNonGUI(int time, bool useUndo=false)
void sigFramesChanged(const KisTimeSpan &range, const QRect &rect)
bool externalFrameActive() const
friend class KisRegenerateFrameStrokeStrategy
void lockFrameGeneration()
void setExportSequenceFilePath(const QString &filePath)
const QScopedPointer< Private > m_d
void setDocumentRangeEndFrame(int column)
KisKeyframeChannel stores and manages KisKeyframes. Maps units of time to virtual keyframe values....
int lastKeyframeTime() const
QSet< int > clonesOf(int time)
static QList< KisStrokeJobData * > createJobsData(KisImageWSP image)
SharedTokenSP token() const
bool contains(int time) const
static KisTimeSpan calculateNodeAffectedFrames(const KisNode *node, int time)
static KisTimeSpan calculateIdenticalFramesRecursive(const KisNode *node, int time)
static KisTimeSpan calculateAffectedFramesRecursive(const KisNode *node, int time)
static KisTimeSpan fromTimeToTime(int start, int end)
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
int findLastKeyframeTimeRecursive(KisNodeSP node)
KisNodeSP recursiveFindNode(KisNodeSP node, std::function< bool(KisNodeSP)> func)
KisTimeSpan fetchLayerActiveRasterFrameSpan(KisNodeSP node, const int time)
void recursiveApplyNodes(NodePointer node, Functor func)
QSet< int > fetchLayerIdenticalRasterFrameTimes(KisNodeSP node, const int &frameTime)
QMap< QString, KisKeyframeChannel * > keyframeChannels
KisTimeSpan activePlaybackRange
int exportInitialFrameNumber
void setCurrentTime(int value)
QAtomicInt backgroundFrameGenerationBlocked
QMutex frameGenerationLock
Private(const Private &rhs, KisImage *newImage)
QString exportSequenceBaseName
QSet< int > activeLayerSelectedTimes
bool frameInvalidationBlocked
KisTimeSpan documentRange
void setCurrentUITime(int value)
KisSwitchTimeStrokeStrategy::SharedTokenWSP switchToken
QString exportSequenceFilePath
int currentUITime() const
KisNodeSP firstChild() const
KisNodeSP nextSibling() const