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

The KisCanvasAnimationState class stores all of the canvas-specific animation state. More...

#include <KisCanvasAnimationState.h>

+ Inheritance diagram for KisCanvasAnimationState:

Classes

struct  Private
 

Public Slots

void showFrame (int frame, bool finalize=false)
 

Signals

void sigAudioLevelChanged (qreal value)
 
void sigCancelPlayback ()
 
void sigFrameChanged ()
 
void sigPlaybackMediaChanged ()
 
void sigPlaybackSpeedChanged (qreal value)
 
void sigPlaybackStateChanged (PlaybackState state)
 
void sigPlaybackStatisticsUpdated ()
 

Public Member Functions

qreal currentVolume ()
 
class KisFrameDisplayProxydisplayProxy ()
 
 KisCanvasAnimationState (KisCanvas2 *canvas)
 
boost::optional< QFileInfo > mediaInfo ()
 Get the media file info associated with this canvas, if available.
 
boost::optional< int > playbackOrigin ()
 Get the animation frame to return to (for this canvas) when playback is stopped, if available.
 
qreal playbackSpeed () const
 
PlaybackState playbackState ()
 
void setPlaybackSpeed (qreal value)
 
void setPlaybackState (PlaybackState state)
 setPlaybackState changes the animation playback state for this canvas. KisPlaybackEngine should respond to changes in state while canvas is active, and use appropriate state when a new canvas is made active.
 
void setupAudioTracks ()
 Sets up the audio tracks for a given animation. (The only reason this is public is because we have to defer this until after canvas construction.)
 
 ~KisCanvasAnimationState () override
 

Private Member Functions

KisTimeSpan activePlaybackRange ()
 

Private Attributes

QScopedPointer< Privatem_d
 

Detailed Description

The KisCanvasAnimationState class stores all of the canvas-specific animation state.

Krita drives animation using a single KisPlaybackEngine instance (found in KisPart). However, there is some data that we want/need to store per-canvas (typically per-document). This might include the frame where playback started, audio volume, or anything else that we may need to persist between canvas changes.

Definition at line 38 of file KisCanvasAnimationState.h.

Constructor & Destructor Documentation

◆ KisCanvasAnimationState()

KisCanvasAnimationState::KisCanvasAnimationState ( KisCanvas2 * canvas)

Definition at line 236 of file KisCanvasAnimationState.cpp.

237 : QObject(canvas)
238 , m_d(new Private(canvas))
239{
241
242 // Handle image-internal frame change case...
243 connect(m_d->displayProxy.data(), SIGNAL(sigFrameChange()), this, SIGNAL(sigFrameChanged()));
244
245 // Grow to new playback range when new frames added (configurable)...
246 connect(m_d->canvas->image()->animationInterface(), &KisImageAnimationInterface::sigKeyframeAdded, this, [this](const KisKeyframeChannel*, int time){
247 if (m_d->canvas && m_d->canvas->image()) {
248 KisImageAnimationInterface* animInterface = m_d->canvas->image()->animationInterface();
249 KisConfig cfg(true);
250 if (animInterface && cfg.adaptivePlaybackRange()) {
251 KisTimeSpan desiredPlaybackRange = animInterface->documentPlaybackRange();
252 desiredPlaybackRange.include(time);
253 animInterface->setDocumentRange(desiredPlaybackRange);
254 }
255 }
256 });
257
260 connect(&m_d->m_statsTimer, SIGNAL(timeout()), this, SIGNAL(sigPlaybackStatisticsUpdated()));
261}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
void sigAudioLevelChanged(qreal value)
QScopedPointer< Private > m_d
void setPlaybackState(PlaybackState state)
setPlaybackState changes the animation playback state for this canvas. KisPlaybackEngine should respo...
void setupAudioTracks()
Sets up the audio tracks for a given animation. (The only reason this is public is because we have to...
void sigAudioLevelChanged(qreal level)
void sigAudioTracksChanged()
void sigKeyframeAdded(const KisKeyframeChannel *channel, int time)
KisKeyframeChannel stores and manages KisKeyframes. Maps units of time to virtual keyframe values....

References connect(), m_d, setPlaybackState(), sigFrameChanged(), KisImageAnimationInterface::sigKeyframeAdded(), and STOPPED.

◆ ~KisCanvasAnimationState()

KisCanvasAnimationState::~KisCanvasAnimationState ( )
override

Definition at line 263 of file KisCanvasAnimationState.cpp.

264{
265}

Member Function Documentation

◆ activePlaybackRange()

KisTimeSpan KisCanvasAnimationState::activePlaybackRange ( )
private

Definition at line 348 of file KisCanvasAnimationState.cpp.

349{
350 if (!m_d->canvas || !m_d->canvas->image()) {
351 return KisTimeSpan::infinite(0);
352 }
353
354 const KisImageAnimationInterface *animation = m_d->canvas->image()->animationInterface();
355 return animation->activePlaybackRange();
356}
const KisTimeSpan & activePlaybackRange() const
activePlaybackRange
KisImageAnimationInterface * animationInterface() const
static KisTimeSpan infinite(int start)

References KisImageAnimationInterface::activePlaybackRange(), KisImage::animationInterface(), KisImageAnimationInterface::image(), KisTimeSpan::infinite(), and m_d.

◆ currentVolume()

qreal KisCanvasAnimationState::currentVolume ( )

Definition at line 281 of file KisCanvasAnimationState.cpp.

282{
283 if (m_d->canvas && m_d->canvas->imageView() && m_d->canvas->imageView()->document()) {
284 return m_d->canvas->imageView()->document()->getAudioLevel();
285 } else {
286 return 0.0;
287 }
288}

References m_d.

◆ displayProxy()

KisFrameDisplayProxy * KisCanvasAnimationState::displayProxy ( )

Definition at line 299 of file KisCanvasAnimationState.cpp.

300{
301 return m_d->displayProxy.data();
302}

References m_d.

◆ mediaInfo()

boost::optional< QFileInfo > KisCanvasAnimationState::mediaInfo ( )

Get the media file info associated with this canvas, if available.

Definition at line 272 of file KisCanvasAnimationState.cpp.

273{
274 if (m_d->media) {
275 return boost::optional<QFileInfo>(*m_d->media);
276 } else {
277 return boost::none;
278 }
279}

References m_d.

◆ playbackOrigin()

boost::optional< int > KisCanvasAnimationState::playbackOrigin ( )

Get the animation frame to return to (for this canvas) when playback is stopped, if available.

Definition at line 290 of file KisCanvasAnimationState.cpp.

291{
292 if (m_d->playbackEnvironment) {
293 return boost::optional<int>(m_d->playbackEnvironment->originFrame());
294 } else {
295 return boost::none;
296 }
297}

References m_d.

◆ playbackSpeed()

qreal KisCanvasAnimationState::playbackSpeed ( ) const

Definition at line 312 of file KisCanvasAnimationState.cpp.

313{
314 return m_d->playbackSpeed;
315}

References m_d.

◆ playbackState()

PlaybackState KisCanvasAnimationState::playbackState ( )

Definition at line 267 of file KisCanvasAnimationState.cpp.

268{
269 return m_d->state;
270}

References m_d.

◆ setPlaybackSpeed()

void KisCanvasAnimationState::setPlaybackSpeed ( qreal value)

Definition at line 304 of file KisCanvasAnimationState.cpp.

305{
306 if (!qFuzzyCompare(value, m_d->playbackSpeed)) {
307 m_d->playbackSpeed = value;
309 }
310}
float value(const T *src, size_t ch)
void sigPlaybackSpeedChanged(qreal value)
static bool qFuzzyCompare(half p1, half p2)

References m_d, qFuzzyCompare(), sigPlaybackSpeedChanged(), and value().

◆ setPlaybackState()

void KisCanvasAnimationState::setPlaybackState ( PlaybackState state)

setPlaybackState changes the animation playback state for this canvas. KisPlaybackEngine should respond to changes in state while canvas is active, and use appropriate state when a new canvas is made active.

Definition at line 358 of file KisCanvasAnimationState.cpp.

359{
360 if (m_d->state != p_state) {
361 m_d->state = p_state;
362 if (m_d->state == PLAYING) {
363 if (m_d->playbackEnvironment) {
364 m_d->playbackEnvironment->prepare(); // re-prepare
365 } else {
366 m_d->playbackEnvironment.reset(new CanvasPlaybackEnvironment(m_d->displayProxy->activeFrame(), m_d->canvas, this));
367
368 connect(m_d->playbackEnvironment.data(), SIGNAL(sigPlaybackStatisticsUpdated()),
369 this, SIGNAL(sigPlaybackStatisticsUpdated()));
370 }
371
372 m_d->m_statsTimer.start();
374 } else {
375 if (m_d->state == STOPPED) {
376 m_d->playbackEnvironment.reset();
377 } else if(m_d->playbackEnvironment) {
378 m_d->playbackEnvironment->restore();
379 }
380
381 m_d->m_statsTimer.stop();
383 }
384
385 Q_EMIT sigPlaybackStateChanged(m_d->state);
386 }
387}
PlaybackEnvironment (Private) Constructs and deconstructs the necessary viewing conditions when anima...
void sigPlaybackStateChanged(PlaybackState state)

References connect(), m_d, PLAYING, sigPlaybackStateChanged(), sigPlaybackStatisticsUpdated(), and STOPPED.

◆ setupAudioTracks()

void KisCanvasAnimationState::setupAudioTracks ( )

Sets up the audio tracks for a given animation. (The only reason this is public is because we have to defer this until after canvas construction.)

Definition at line 317 of file KisCanvasAnimationState.cpp.

318{
319 if (!m_d->canvas || !m_d->canvas->imageView()) {
320 return;
321 }
322
323 KisDocument* doc = m_d->canvas->imageView()->document();
324 if (doc) {
325 QVector<QFileInfo> files = doc->getAudioTracks();
326
327 if (doc->getAudioTracks().isEmpty()) {
328 m_d->media.reset();
329 } else {
330 //Only get first file for now and make that a producer...
331 QFileInfo toLoad = files.first();
332 KIS_SAFE_ASSERT_RECOVER_RETURN(toLoad.exists());
333 m_d->media.reset(new QFileInfo(toLoad));
334
335 // Once media is attached we upgrade to the MLT-based playbackEngine...
337 }
338
340 }
341}
QPointer< KisView > imageView() const
QVector< QFileInfo > getAudioTracks() const
void upgradeToPlaybackEngineMLT(class KoCanvasBase *canvas)
Definition KisPart.cpp:691
static KisPart * instance()
Definition KisPart.cpp:131
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
KisCanvas2 * canvas

References Private::canvas, KisDocument::getAudioTracks(), KisCanvas2::imageView(), KisPart::instance(), KIS_SAFE_ASSERT_RECOVER_RETURN, m_d, sigPlaybackMediaChanged(), and KisPart::upgradeToPlaybackEngineMLT().

◆ showFrame

void KisCanvasAnimationState::showFrame ( int frame,
bool finalize = false )
slot

Definition at line 343 of file KisCanvasAnimationState.cpp.

344{
345 m_d->displayProxy->displayFrame(frame, finalize);
346}

References m_d.

◆ sigAudioLevelChanged

void KisCanvasAnimationState::sigAudioLevelChanged ( qreal value)
signal

◆ sigCancelPlayback

void KisCanvasAnimationState::sigCancelPlayback ( )
signal

◆ sigFrameChanged

void KisCanvasAnimationState::sigFrameChanged ( )
signal

◆ sigPlaybackMediaChanged

void KisCanvasAnimationState::sigPlaybackMediaChanged ( )
signal

◆ sigPlaybackSpeedChanged

void KisCanvasAnimationState::sigPlaybackSpeedChanged ( qreal value)
signal

◆ sigPlaybackStateChanged

void KisCanvasAnimationState::sigPlaybackStateChanged ( PlaybackState state)
signal

◆ sigPlaybackStatisticsUpdated

void KisCanvasAnimationState::sigPlaybackStatisticsUpdated ( )
signal

Member Data Documentation

◆ m_d

QScopedPointer<Private> KisCanvasAnimationState::m_d
private

Definition at line 93 of file KisCanvasAnimationState.h.


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