Krita Source Code Documentation
Loading...
Searching...
No Matches
KisPlaybackEngine Class Referenceabstract

Krita's base animation playback engine for producing image frame changes and associated audio. More...

#include <KisPlaybackEngine.h>

+ Inheritance diagram for KisPlaybackEngine:

Classes

struct  PlaybackStats
 
struct  Private
 

Public Slots

bool dropFrames () const
 
virtual void firstFrame ()
 
virtual bool isMute ()=0
 
virtual void lastFrame ()
 
virtual void nextFrame ()
 
virtual void nextKeyframe ()
 
virtual void nextMatchingKeyframe ()
 
virtual void nextUnfilteredKeyframe ()
 
virtual void pause ()
 
virtual void play ()
 
virtual PlaybackStats playbackStatistics () const =0
 
virtual void playPause ()
 
virtual void previousFrame ()
 
virtual void previousKeyframe ()
 
virtual void previousMatchingKeyframe ()
 previousMatchingKeyframe && nextMatchingKeyframe Navigate to the next keyframe that has the same color-label as the current keyframe. Useful to quickly navigate to user-specified 'similar' keyframes. E.g. Contact points in an animation might have a specific color to specify importance and be quickly swapped between.
 
virtual void previousUnfilteredKeyframe ()
 previousUnfilteredKeyframe && nextUnfilteredKeyframe Navigate to keyframes based on the current onion skin filtration. This lets users easily navigate to the next visible "onion-skinned" keyframe on the active layer.
 
virtual void seek (int frameIndex, SeekOptionFlags options=SEEK_FINALIZE|SEEK_PUSH_AUDIO)=0
 
virtual void setDropFramesMode (bool value)
 
virtual void setMute (bool val)=0
 
virtual void stop ()
 
virtual bool supportsAudio ()=0
 
virtual bool supportsVariablePlaybackSpeed ()=0
 

Signals

void sigDropFramesModeChanged (bool value)
 

Public Member Functions

 KisPlaybackEngine (QObject *parent=nullptr)
 
 ~KisPlaybackEngine ()
 
- Public Member Functions inherited from KoCanvasObserverBase
 KoCanvasObserverBase ()
 
KoCanvasBaseobservedCanvas () const
 
virtual QString observerName ()
 
void setObservedCanvas (KoCanvasBase *canvas)
 
void unsetObservedCanvas ()
 
virtual ~KoCanvasObserverBase ()
 

Protected Slots

virtual void setCanvas (KoCanvasBase *p_canvas) override
 
virtual void unsetCanvas () override
 

Protected Member Functions

class KisCanvas2activeCanvas () const
 
int frameWrap (int frame, int startFrame, int endFrame)
 
- Protected Member Functions inherited from KoCanvasObserverBase
virtual void setCanvas (KoCanvasBase *canvas)=0
 
virtual void unsetCanvas ()=0
 

Private Member Functions

void moveActiveFrameBy (int frames)
 Move the active frame of the animation player forwards or backwards by some number of frames.
 
void nextKeyframeWithColor (const QSet< int > &validColors)
 
void nextKeyframeWithColor (int color)
 
void previousKeyframeWithColor (const QSet< int > &validColors)
 
void previousKeyframeWithColor (int color)
 

Private Attributes

QScopedPointer< Privatem_d
 

Detailed Description

Krita's base animation playback engine for producing image frame changes and associated audio.

Krita stores a main playback engine in KisPart (a singleton) to be used by the active document's canvas. It can be thought of as being just below the GUI layer of Krita's animation system, responding to various GUI events, controlling transport controls (play, stop, next, etc.), and generally driving the playback of animation within Krita.

It's implemented by KisPlaybackEngineQT and KisPlaybackEngineMLT, one of which is typically selected at compile time depending on available dependencies. Specific implementations may or may not support certain features (audio, speed, dropping frames, etc.) and have other different characteristics.

Definition at line 42 of file KisPlaybackEngine.h.

Constructor & Destructor Documentation

◆ KisPlaybackEngine()

KisPlaybackEngine::KisPlaybackEngine ( QObject * parent = nullptr)

Definition at line 34 of file KisPlaybackEngine.cpp.

35 : QObject(parent)
36 , m_d(new Private)
37{
38 KisConfig cfg(true);
39 m_d->dropFramesMode = cfg.animationDropFrames();
40}
QScopedPointer< Private > m_d

References KisConfig::animationDropFrames(), and m_d.

◆ ~KisPlaybackEngine()

KisPlaybackEngine::~KisPlaybackEngine ( )

Definition at line 42 of file KisPlaybackEngine.cpp.

43{
44}

Member Function Documentation

◆ activeCanvas()

KisCanvas2 * KisPlaybackEngine::activeCanvas ( ) const
protected

Definition at line 290 of file KisPlaybackEngine.cpp.

291{
292 return m_d->activeCanvas;
293}

References m_d.

◆ dropFrames

bool KisPlaybackEngine::dropFrames ( ) const
slot

Definition at line 271 of file KisPlaybackEngine.cpp.

272{
273 return m_d->dropFramesMode;
274}

References m_d.

◆ firstFrame

void KisPlaybackEngine::firstFrame ( )
virtualslot

Definition at line 177 of file KisPlaybackEngine.cpp.

178{
179 if (!m_d->activeCanvas) return;
180 KisCanvasAnimationState *animationState = m_d->activeCanvas->animationState();
181 KIS_SAFE_ASSERT_RECOVER_RETURN(animationState);
182 KisImageAnimationInterface *animInterface = m_d->activeCanvas->image()->animationInterface();
183
184 const int startFrame = animInterface->activePlaybackRange().start();
185
186 if (animationState->playbackState() != STOPPED) {
187 stop();
188 }
189
190 seek(startFrame, SEEK_FINALIZE | SEEK_PUSH_AUDIO);
191}
@ SEEK_PUSH_AUDIO
@ SEEK_FINALIZE
The KisCanvasAnimationState class stores all of the canvas-specific animation state.
const KisTimeSpan & activePlaybackRange() const
activePlaybackRange
KisImageAnimationInterface * animationInterface() const
virtual void seek(int frameIndex, SeekOptionFlags options=SEEK_FINALIZE|SEEK_PUSH_AUDIO)=0
int start() const
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128

References KisImageAnimationInterface::activePlaybackRange(), KisImage::animationInterface(), KisImageAnimationInterface::image(), KIS_SAFE_ASSERT_RECOVER_RETURN, m_d, KisCanvasAnimationState::playbackState(), seek(), SEEK_FINALIZE, SEEK_PUSH_AUDIO, KisTimeSpan::start(), stop(), and STOPPED.

◆ frameWrap()

int KisPlaybackEngine::frameWrap ( int frame,
int startFrame,
int endFrame )
protected

Definition at line 276 of file KisPlaybackEngine.cpp.

277{
278 // Since Krita has always considered the end frame as inclusive, we need
279 // to make sure our wrap method respects that as well.
280 const int inclusiveEndFrame = endFrame + 1;
281 frame = ((frame - startFrame) % (inclusiveEndFrame - startFrame)) + startFrame;
282
283 if (frame - startFrame < 0) {
284 frame += (inclusiveEndFrame - startFrame);
285 }
286
287 return frame;
288}

◆ isMute

virtual bool KisPlaybackEngine::isMute ( )
pure virtualslot

Implemented in KisPlaybackEngineQT.

◆ lastFrame

void KisPlaybackEngine::lastFrame ( )
virtualslot

Definition at line 193 of file KisPlaybackEngine.cpp.

194{
195 if (!m_d->activeCanvas) return;
196 KisCanvasAnimationState *animationState = m_d->activeCanvas->animationState();
197 KIS_SAFE_ASSERT_RECOVER_RETURN(animationState);
198 KisImageAnimationInterface *animInterface = m_d->activeCanvas->image()->animationInterface();
199
200 const int endFrame = animInterface->activePlaybackRange().end();
201
202 if (animationState->playbackState() != STOPPED) {
203 stop();
204 }
205
207}
int end() const

References KisImageAnimationInterface::activePlaybackRange(), KisImage::animationInterface(), KisTimeSpan::end(), KisImageAnimationInterface::image(), KIS_SAFE_ASSERT_RECOVER_RETURN, m_d, KisCanvasAnimationState::playbackState(), seek(), SEEK_FINALIZE, SEEK_PUSH_AUDIO, stop(), and STOPPED.

◆ moveActiveFrameBy()

void KisPlaybackEngine::moveActiveFrameBy ( int frames)
private

Move the active frame of the animation player forwards or backwards by some number of frames.

Parameters
Thesigned number of frames to move. Negative frames move backwards in time (left on a left-to-right system).

Definition at line 333 of file KisPlaybackEngine.cpp.

334{
335 if (!m_d->activeCanvas) return;
336 KisCanvasAnimationState *animationState = m_d->activeCanvas->animationState();
337 KIS_SAFE_ASSERT_RECOVER_RETURN(animationState);
338 KisImageAnimationInterface *animInterface = m_d->activeCanvas->image()->animationInterface();
339
340 int frame = animationState->displayProxy()->activeFrame() + frames;
341
342 const int startFrame = animInterface->activePlaybackRange().start();
343 const int endFrame = animInterface->activePlaybackRange().end();
344
345 frame = frameWrap(frame, startFrame, endFrame);
346
348
349 if (animationState->playbackState() != STOPPED) {
350 stop();
351 }
352
354}
class KisFrameDisplayProxy * displayProxy()
int activeFrame() const
Gets the active frame, the frame that is intended to be shown. This should always reflect the actual ...
int frameWrap(int frame, int startFrame, int endFrame)

References KisFrameDisplayProxy::activeFrame(), KisImageAnimationInterface::activePlaybackRange(), KisImage::animationInterface(), KisCanvasAnimationState::displayProxy(), KisTimeSpan::end(), frameWrap(), KisImageAnimationInterface::image(), KIS_SAFE_ASSERT_RECOVER_RETURN, m_d, KisCanvasAnimationState::playbackState(), seek(), SEEK_FINALIZE, SEEK_PUSH_AUDIO, KisTimeSpan::start(), stop(), and STOPPED.

◆ nextFrame

void KisPlaybackEngine::nextFrame ( )
virtualslot

Definition at line 98 of file KisPlaybackEngine.cpp.

99{
101}
void moveActiveFrameBy(int frames)
Move the active frame of the animation player forwards or backwards by some number of frames.

References moveActiveFrameBy().

◆ nextKeyframe

void KisPlaybackEngine::nextKeyframe ( )
virtualslot

Definition at line 134 of file KisPlaybackEngine.cpp.

135{
136 if (!m_d->activeCanvas) return;
137 KisCanvasAnimationState *animationState = m_d->activeCanvas->animationState();
138 KIS_SAFE_ASSERT_RECOVER_RETURN(animationState);
139
140 KisNodeSP node = m_d->activeCanvas->viewManager()->activeNode();
141 if (!node) return;
142
143 KisKeyframeChannel *keyframes =
145 if (!keyframes) return;
146
147 int currentTime = animationState->displayProxy()->activeFrame();
148
149 int destinationTime = -1;
150 if (keyframes->activeKeyframeAt(currentTime)) {
151 destinationTime = keyframes->nextKeyframeTime(currentTime);
152 }
153
154 if (keyframes->keyframeAt(destinationTime)) {
155 // Jump to next key...
156 if (animationState->playbackState() != STOPPED) {
157 stop();
158 }
159
160 seek(destinationTime, SEEK_FINALIZE | SEEK_PUSH_AUDIO);
161 } else {
162 // Jump ahead by estimated timing...
163 const int activeKeyTime = keyframes->activeKeyframeTime(currentTime);
164 const int previousKeyTime = keyframes->previousKeyframeTime(activeKeyTime);
165
166 if (previousKeyTime != -1) {
167 if (animationState->playbackState() != STOPPED) {
168 stop();
169 }
170
171 const int timing = activeKeyTime - previousKeyTime;
172 seek(currentTime + timing, SEEK_FINALIZE | SEEK_PUSH_AUDIO);
173 }
174 }
175}
KisKeyframeChannel stores and manages KisKeyframes. Maps units of time to virtual keyframe values....
static const KoID Raster
int previousKeyframeTime(const int time) const
KisKeyframeSP keyframeAt(int time) const
Get a keyframe at specified time. Used primarily when the value of a given keyframe is needed.
KisKeyframeSP activeKeyframeAt(int time) const
int activeKeyframeTime(int time) const
Get the time of the active keyframe. Useful for snapping any time to that of the most recent keyframe...
int nextKeyframeTime(const int time) const
KisKeyframeChannel * getKeyframeChannel(const QString &id, bool create)

References KisFrameDisplayProxy::activeFrame(), KisKeyframeChannel::activeKeyframeAt(), KisKeyframeChannel::activeKeyframeTime(), KisCanvasAnimationState::displayProxy(), KisBaseNode::getKeyframeChannel(), KisKeyframeChannel::keyframeAt(), KIS_SAFE_ASSERT_RECOVER_RETURN, m_d, KisKeyframeChannel::nextKeyframeTime(), KisCanvasAnimationState::playbackState(), KisKeyframeChannel::previousKeyframeTime(), KisKeyframeChannel::Raster, seek(), SEEK_FINALIZE, SEEK_PUSH_AUDIO, stop(), and STOPPED.

◆ nextKeyframeWithColor() [1/2]

void KisPlaybackEngine::nextKeyframeWithColor ( const QSet< int > & validColors)
private

Definition at line 363 of file KisPlaybackEngine.cpp.

364{
365 if (!m_d->activeCanvas) return;
366 KisCanvasAnimationState *animationState = m_d->activeCanvas->animationState();
367 KIS_SAFE_ASSERT_RECOVER_RETURN(animationState);
368
369 KisNodeSP node = m_d->activeCanvas->viewManager()->activeNode();
370 if (!node) return;
371
372 KisKeyframeChannel *keyframes =
374 if (!keyframes) return;
375
376 int time = animationState->displayProxy()->activeFrame();
377
378 if (!keyframes->activeKeyframeAt(time)) {
379 return;
380 }
381
382 int destinationTime = keyframes->activeKeyframeTime(time);
383 while ( keyframes->keyframeAt(destinationTime) &&
384 ((destinationTime == time) ||
385 !validColors.contains(keyframes->keyframeAt(destinationTime)->colorLabel()))) {
386
387 destinationTime = keyframes->nextKeyframeTime(destinationTime);
388 }
389
390 if (keyframes->keyframeAt(destinationTime)) {
391 if (animationState->playbackState() != STOPPED) {
392 stop();
393 }
394
395 seek(destinationTime, SEEK_FINALIZE | SEEK_PUSH_AUDIO);
396 }
397}

References KisFrameDisplayProxy::activeFrame(), KisKeyframeChannel::activeKeyframeAt(), KisKeyframeChannel::activeKeyframeTime(), KisCanvasAnimationState::displayProxy(), KisBaseNode::getKeyframeChannel(), KisKeyframeChannel::keyframeAt(), KIS_SAFE_ASSERT_RECOVER_RETURN, m_d, KisKeyframeChannel::nextKeyframeTime(), KisCanvasAnimationState::playbackState(), KisKeyframeChannel::Raster, seek(), SEEK_FINALIZE, SEEK_PUSH_AUDIO, stop(), and STOPPED.

◆ nextKeyframeWithColor() [2/2]

void KisPlaybackEngine::nextKeyframeWithColor ( int color)
private

Definition at line 356 of file KisPlaybackEngine.cpp.

357{
358 QSet<int> validColors;
359 validColors.insert(color);
360 nextKeyframeWithColor(validColors);
361}
void nextKeyframeWithColor(int color)

References nextKeyframeWithColor().

◆ nextMatchingKeyframe

void KisPlaybackEngine::nextMatchingKeyframe ( )
virtualslot

Definition at line 230 of file KisPlaybackEngine.cpp.

231{
232 if (!m_d->activeCanvas) return;
233 KisCanvasAnimationState *animationState = m_d->activeCanvas->animationState();
234 KIS_SAFE_ASSERT_RECOVER_RETURN(animationState);
235
236 KisNodeSP node = m_d->activeCanvas->viewManager()->activeNode();
237 if (!node) return;
238
239 KisKeyframeChannel *keyframes =
241 if (!keyframes) return;
242
243 int time = animationState->displayProxy()->activeFrame();
244
245 if (!keyframes->activeKeyframeAt(time)) {
246 return;
247 }
248
249 int destinationTime = keyframes->activeKeyframeTime(time);
250 nextKeyframeWithColor(keyframes->keyframeAt(destinationTime)->colorLabel());
251}

References KisFrameDisplayProxy::activeFrame(), KisKeyframeChannel::activeKeyframeAt(), KisKeyframeChannel::activeKeyframeTime(), KisCanvasAnimationState::displayProxy(), KisBaseNode::getKeyframeChannel(), KisKeyframeChannel::keyframeAt(), KIS_SAFE_ASSERT_RECOVER_RETURN, m_d, nextKeyframeWithColor(), and KisKeyframeChannel::Raster.

◆ nextUnfilteredKeyframe

void KisPlaybackEngine::nextUnfilteredKeyframe ( )
virtualslot

Definition at line 258 of file KisPlaybackEngine.cpp.

259{
261}
static KisOnionSkinCompositor * instance()

References KisOnionSkinCompositor::instance(), and nextKeyframeWithColor().

◆ pause

void KisPlaybackEngine::pause ( )
virtualslot

Definition at line 52 of file KisPlaybackEngine.cpp.

53{
56
57 animationState->setPlaybackState(PAUSED);
58
59 seek(animationState->displayProxy()->activeFrame(), SEEK_FINALIZE);
60}
KisCanvasAnimationState * animationState() const
void setPlaybackState(PlaybackState state)
setPlaybackState changes the animation playback state for this canvas. KisPlaybackEngine should respo...
class KisCanvas2 * activeCanvas() const

References activeCanvas(), KisFrameDisplayProxy::activeFrame(), KisCanvas2::animationState(), KisCanvasAnimationState::displayProxy(), KIS_SAFE_ASSERT_RECOVER_RETURN, PAUSED, seek(), SEEK_FINALIZE, and KisCanvasAnimationState::setPlaybackState().

◆ play

◆ playbackStatistics

virtual PlaybackStats KisPlaybackEngine::playbackStatistics ( ) const
pure virtualslot

Implemented in KisPlaybackEngineQT.

◆ playPause

void KisPlaybackEngine::playPause ( )
virtualslot

Definition at line 62 of file KisPlaybackEngine.cpp.

63{
66
67 if (animationState->playbackState() == PLAYING) {
68 pause();
69 } else {
70 play();
71 }
72}

References activeCanvas(), KisCanvas2::animationState(), KIS_SAFE_ASSERT_RECOVER_RETURN, pause(), play(), KisCanvasAnimationState::playbackState(), and PLAYING.

◆ previousFrame

void KisPlaybackEngine::previousFrame ( )
virtualslot

Definition at line 93 of file KisPlaybackEngine.cpp.

94{
96}

References moveActiveFrameBy().

◆ previousKeyframe

void KisPlaybackEngine::previousKeyframe ( )
virtualslot

Definition at line 103 of file KisPlaybackEngine.cpp.

104{
105 if (!m_d->activeCanvas) return;
106 KisCanvasAnimationState *animationState = m_d->activeCanvas->animationState();
107 KIS_SAFE_ASSERT_RECOVER_RETURN(animationState);
108
109 KisNodeSP node = m_d->activeCanvas->viewManager()->activeNode();
110 if (!node) return;
111
112 KisKeyframeChannel *keyframes =
114 if (!keyframes) return;
115
116 int currentFrame = animationState->displayProxy()->activeFrame();
117
118 int destinationTime = -1;
119 if (!keyframes->keyframeAt(currentFrame)) {
120 destinationTime = keyframes->activeKeyframeTime(currentFrame);
121 } else {
122 destinationTime = keyframes->previousKeyframeTime(currentFrame);
123 }
124
125 if (keyframes->keyframeAt(destinationTime)) {
126 if (animationState->playbackState() != STOPPED) {
127 stop();
128 }
129
130 seek(destinationTime, SEEK_FINALIZE | SEEK_PUSH_AUDIO);
131 }
132}

References KisFrameDisplayProxy::activeFrame(), KisKeyframeChannel::activeKeyframeTime(), KisCanvasAnimationState::displayProxy(), KisBaseNode::getKeyframeChannel(), KisKeyframeChannel::keyframeAt(), KIS_SAFE_ASSERT_RECOVER_RETURN, m_d, KisCanvasAnimationState::playbackState(), KisKeyframeChannel::previousKeyframeTime(), KisKeyframeChannel::Raster, seek(), SEEK_FINALIZE, SEEK_PUSH_AUDIO, stop(), and STOPPED.

◆ previousKeyframeWithColor() [1/2]

void KisPlaybackEngine::previousKeyframeWithColor ( const QSet< int > & validColors)
private

Definition at line 406 of file KisPlaybackEngine.cpp.

407{
408 if (!m_d->activeCanvas) return;
409 KisCanvasAnimationState *animationState = m_d->activeCanvas->animationState();
410 KIS_SAFE_ASSERT_RECOVER_RETURN(animationState);
411
412 KisNodeSP node = m_d->activeCanvas->viewManager()->activeNode();
413 if (!node) return;
414
415 KisKeyframeChannel *keyframes =
417 if (!keyframes) return;
418
419 int time = animationState->displayProxy()->activeFrame();
420
421 int destinationTime = keyframes->activeKeyframeTime(time);
422 while (keyframes->keyframeAt(destinationTime) &&
423 ((destinationTime == time) ||
424 !validColors.contains(keyframes->keyframeAt(destinationTime)->colorLabel()))) {
425
426 destinationTime = keyframes->previousKeyframeTime(destinationTime);
427 }
428
429 if (keyframes->keyframeAt(destinationTime)) {
430 if (animationState->playbackState() != STOPPED) {
431 stop();
432 }
433
434 seek(destinationTime, SEEK_FINALIZE | SEEK_PUSH_AUDIO);
435 }
436}

References KisFrameDisplayProxy::activeFrame(), KisKeyframeChannel::activeKeyframeTime(), KisCanvasAnimationState::displayProxy(), KisBaseNode::getKeyframeChannel(), KisKeyframeChannel::keyframeAt(), KIS_SAFE_ASSERT_RECOVER_RETURN, m_d, KisCanvasAnimationState::playbackState(), KisKeyframeChannel::previousKeyframeTime(), KisKeyframeChannel::Raster, seek(), SEEK_FINALIZE, SEEK_PUSH_AUDIO, stop(), and STOPPED.

◆ previousKeyframeWithColor() [2/2]

void KisPlaybackEngine::previousKeyframeWithColor ( int color)
private

Definition at line 399 of file KisPlaybackEngine.cpp.

400{
401 QSet<int> validColors;
402 validColors.insert(color);
403 previousKeyframeWithColor(validColors);
404}
void previousKeyframeWithColor(int color)

References previousKeyframeWithColor().

◆ previousMatchingKeyframe

void KisPlaybackEngine::previousMatchingKeyframe ( )
virtualslot

previousMatchingKeyframe && nextMatchingKeyframe Navigate to the next keyframe that has the same color-label as the current keyframe. Useful to quickly navigate to user-specified 'similar' keyframes. E.g. Contact points in an animation might have a specific color to specify importance and be quickly swapped between.

Definition at line 209 of file KisPlaybackEngine.cpp.

210{
211 if (!m_d->activeCanvas) return;
212 KisCanvasAnimationState *animationState = m_d->activeCanvas->animationState();
213 KIS_SAFE_ASSERT_RECOVER_RETURN(animationState);
214
215 KisNodeSP node = m_d->activeCanvas->viewManager()->activeNode();
216 if (!node) return;
217
218 KisKeyframeChannel *keyframes =
220 if (!keyframes) return;
221
222 int time = animationState->displayProxy()->activeFrame();
223
224 KisKeyframeSP currentKeyframe = keyframes->keyframeAt(time);
225 int destinationTime = keyframes->activeKeyframeTime(time);
226 const int desiredColor = currentKeyframe ? currentKeyframe->colorLabel() : keyframes->keyframeAt(destinationTime)->colorLabel();
227 previousKeyframeWithColor(desiredColor);
228}

References KisFrameDisplayProxy::activeFrame(), KisKeyframeChannel::activeKeyframeTime(), KisCanvasAnimationState::displayProxy(), KisBaseNode::getKeyframeChannel(), KisKeyframeChannel::keyframeAt(), KIS_SAFE_ASSERT_RECOVER_RETURN, m_d, previousKeyframeWithColor(), and KisKeyframeChannel::Raster.

◆ previousUnfilteredKeyframe

void KisPlaybackEngine::previousUnfilteredKeyframe ( )
virtualslot

previousUnfilteredKeyframe && nextUnfilteredKeyframe Navigate to keyframes based on the current onion skin filtration. This lets users easily navigate to the next visible "onion-skinned" keyframe on the active layer.

Definition at line 253 of file KisPlaybackEngine.cpp.

254{
256}

References KisOnionSkinCompositor::instance(), and previousKeyframeWithColor().

◆ seek

virtual void KisPlaybackEngine::seek ( int frameIndex,
SeekOptionFlags options = SEEK_FINALIZE|SEEK_PUSH_AUDIO )
pure virtualslot

Implemented in KisPlaybackEngineQT.

◆ setCanvas

void KisPlaybackEngine::setCanvas ( KoCanvasBase * p_canvas)
overrideprotectedvirtualslot

TODO: This forced updates causes image recalculation on every document switch, which is weird and even causes some crashes on closing many documents at once (which is a separate bug it seems). Why document switch should forcefully regeneare the canvas?

Reimplemented in KisPlaybackEngineQT.

Definition at line 295 of file KisPlaybackEngine.cpp.

296{
297 if (m_d->activeCanvas) {
298 KisCanvasAnimationState* animState = m_d->activeCanvas->animationState();
300
301 animState->disconnect(this);
302 }
303
304 KisCanvas2* canvas = dynamic_cast<KisCanvas2*>(p_canvas);
305 m_d->activeCanvas = canvas;
306
307 if (m_d->activeCanvas) {
308 KisCanvasAnimationState* animState = m_d->activeCanvas->animationState();
310
313
320// KisImageAnimationInterface* animInterface = m_d->activeCanvas->image()->animationInterface();
321// KisFrameDisplayProxy* displayProxy = animState->displayProxy();
322// if (animState->playbackState() != PLAYING) {
323// displayProxy->displayFrame(animInterface->currentTime(), false);
324// }
325 }
326}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))

References connect(), KIS_SAFE_ASSERT_RECOVER_RETURN, m_d, KisCanvasAnimationState::sigCancelPlayback(), and stop().

◆ setDropFramesMode

void KisPlaybackEngine::setDropFramesMode ( bool value)
virtualslot

Reimplemented in KisPlaybackEngineQT.

Definition at line 263 of file KisPlaybackEngine.cpp.

264{
265 if (value != m_d->dropFramesMode) {
266 m_d->dropFramesMode = value;
268 }
269}
float value(const T *src, size_t ch)
void sigDropFramesModeChanged(bool value)

References m_d, sigDropFramesModeChanged(), and value().

◆ setMute

virtual void KisPlaybackEngine::setMute ( bool val)
pure virtualslot

Implemented in KisPlaybackEngineQT.

◆ sigDropFramesModeChanged

void KisPlaybackEngine::sigDropFramesModeChanged ( bool value)
signal

◆ stop

void KisPlaybackEngine::stop ( )
virtualslot

Definition at line 74 of file KisPlaybackEngine.cpp.

75{
78
79 if (animationState->playbackState() != STOPPED) {
80 const boost::optional<int> origin = animationState->playbackOrigin();
81 animationState->setPlaybackState(STOPPED);
82 if (origin.has_value()) {
83 seek(origin.value(), SEEK_FINALIZE);
84 }
85 } else if (animationState->displayProxy()->activeFrame() != 0) {
88 const int firstFrame = ai->documentPlaybackRange().start();
90 }
91}
KisImageWSP image() const
boost::optional< int > playbackOrigin()
Get the animation frame to return to (for this canvas) when playback is stopped, if available.
const KisTimeSpan & documentPlaybackRange() const
documentPlaybackRange
virtual void firstFrame()

References activeCanvas(), KisFrameDisplayProxy::activeFrame(), KisImage::animationInterface(), KisCanvas2::animationState(), KisCanvasAnimationState::displayProxy(), KisImageAnimationInterface::documentPlaybackRange(), firstFrame(), KisCanvas2::image(), KIS_SAFE_ASSERT_RECOVER_RETURN, KisCanvasAnimationState::playbackOrigin(), KisCanvasAnimationState::playbackState(), seek(), SEEK_FINALIZE, SEEK_PUSH_AUDIO, KisCanvasAnimationState::setPlaybackState(), KisTimeSpan::start(), and STOPPED.

◆ supportsAudio

virtual bool KisPlaybackEngine::supportsAudio ( )
pure virtualslot

Implemented in KisPlaybackEngineQT.

◆ supportsVariablePlaybackSpeed

virtual bool KisPlaybackEngine::supportsVariablePlaybackSpeed ( )
pure virtualslot

Implemented in KisPlaybackEngineQT.

◆ unsetCanvas

void KisPlaybackEngine::unsetCanvas ( )
overrideprotectedvirtualslot

Reimplemented in KisPlaybackEngineQT.

Definition at line 328 of file KisPlaybackEngine.cpp.

329{
330 m_d->activeCanvas = nullptr;
331}

References m_d.

Member Data Documentation

◆ m_d

QScopedPointer<Private> KisPlaybackEngine::m_d
private

Definition at line 127 of file KisPlaybackEngine.h.


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