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

This class maintains queues of dirty frames sorted in the order of proximity to the last changed frame. It regenerates the frames emits the paintdevice for each of the frames. The m_changedFramesQueue list is given preference. More...

#include <KisStoryboardThumbnailRenderScheduler.h>

+ Inheritance diagram for KisStoryboardThumbnailRenderScheduler:

Public Slots

void slotStartFrameRendering ()
 

Signals

void sigFrameCancelled (int frame)
 
void sigFrameCompleted (int frame, KisPaintDeviceSP dev)
 

Public Member Functions

void cancelAllFrameRendering ()
 Cancels all frame rendering. Empties all queues and cancels the current rendering, if any.
 
void cancelFrameRendering (int frame)
 Cancel rendering of a single frame.
 
 KisStoryboardThumbnailRenderScheduler (QObject *parent)
 
void scheduleFrameForRegeneration (int frame, bool affected)
 Adds the frame to the list of "to be regenerated" frames.
 
void setImage (KisImageSP image)
 Sets an image, the class takes an image, clones it and calls frame regeneration on the clone so do not pass cloned image explicitly. The image should be set only_once and not every time before scheduling a frame for regeneration. Setting an image cancels rendering of all previously scheduled frames.
 
 ~KisStoryboardThumbnailRenderScheduler ()
 

Private Slots

void slotFrameRegenerationCancelled (int frame)
 Emits sigFrameCancelled(int) and schedules the next frame for regeneration.
 
void slotFrameRegenerationCompleted (int frame, KisPaintDeviceSP contents)
 Emits sigFrameCompleted(int,KisPaintDeviceSP) if the regeneration was complete and calls regeneration of the next frame in queue.
 

Private Member Functions

void renderNextFrame ()
 Renders the next frame, either from affected or changed queue. Changed queue is given preference. It removes the frame from the queue right after calling startFrameRegeneration()
 
void sortAffectedFrameQueue ()
 Sorts the m_affectedFramesQueue based on proximity to the last changed frame.
 

Private Attributes

QVector< int > m_affectedFramesQueue
 
QVector< int > m_changedFramesQueue
 
int m_currentFrame
 
KisImageSP m_image
 
KisAsyncStoryboardThumbnailRendererm_renderer
 

Detailed Description

This class maintains queues of dirty frames sorted in the order of proximity to the last changed frame. It regenerates the frames emits the paintdevice for each of the frames. The m_changedFramesQueue list is given preference.

Definition at line 24 of file KisStoryboardThumbnailRenderScheduler.h.

Constructor & Destructor Documentation

◆ KisStoryboardThumbnailRenderScheduler()

KisStoryboardThumbnailRenderScheduler::KisStoryboardThumbnailRenderScheduler ( QObject * parent)

Definition at line 15 of file KisStoryboardThumbnailRenderScheduler.cpp.

16 : QObject(parent)
18 , m_currentFrame(-1)
19{
20 //connect signals to the renderer.
21 connect(m_renderer, SIGNAL(sigNotifyFrameCompleted(int,KisPaintDeviceSP)), this, SLOT(slotFrameRegenerationCompleted(int, KisPaintDeviceSP)));
23}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
requests regeneration of a frame. The regeneration should be requested after switching the KisImage t...
void slotFrameRegenerationCancelled(int frame)
Emits sigFrameCancelled(int) and schedules the next frame for regeneration.
void slotFrameRegenerationCompleted(int frame, KisPaintDeviceSP contents)
Emits sigFrameCompleted(int,KisPaintDeviceSP) if the regeneration was complete and calls regeneration...

References connect(), m_renderer, sigFrameCancelled(), slotFrameRegenerationCancelled(), and slotFrameRegenerationCompleted().

◆ ~KisStoryboardThumbnailRenderScheduler()

KisStoryboardThumbnailRenderScheduler::~KisStoryboardThumbnailRenderScheduler ( )

Definition at line 25 of file KisStoryboardThumbnailRenderScheduler.cpp.

26{
27 delete m_renderer;
28}

References m_renderer.

Member Function Documentation

◆ cancelAllFrameRendering()

◆ cancelFrameRendering()

void KisStoryboardThumbnailRenderScheduler::cancelFrameRendering ( int frame)

Cancel rendering of a single frame.

Parameters
frameThe frame whose rendering is to be cancelled.

Definition at line 72 of file KisStoryboardThumbnailRenderScheduler.cpp.

73{
74 if (frame < 0) {
75 return;
76 }
77 if (m_renderer->isActive() && frame == m_currentFrame) {
79 m_currentFrame = -1;
80 }
81 else if (m_changedFramesQueue.contains(frame)) {
82 m_changedFramesQueue.removeAll(frame);
83 }
84 else if (m_affectedFramesQueue.contains(frame)) {
85 m_affectedFramesQueue.removeAll(frame);
86 }
87}

References KisAsyncAnimationRendererBase::cancelCurrentFrameRendering(), KisAsyncAnimationRendererBase::isActive(), m_affectedFramesQueue, m_changedFramesQueue, m_currentFrame, m_renderer, and KisAsyncAnimationRendererBase::UserCancelled.

◆ renderNextFrame()

void KisStoryboardThumbnailRenderScheduler::renderNextFrame ( )
private

Renders the next frame, either from affected or changed queue. Changed queue is given preference. It removes the frame from the queue right after calling startFrameRegeneration()

Definition at line 122 of file KisStoryboardThumbnailRenderScheduler.cpp.

123{
124 if (!m_image || !m_image->isIdle()) {
125 return;
126 }
127
128 if (m_changedFramesQueue.isEmpty() && m_affectedFramesQueue.isEmpty()) {
129 return;
130 }
131
133 return;
134 }
135
136 KisImageSP image = m_image->clone(false);
138
139 int frame = !m_changedFramesQueue.isEmpty() ? m_changedFramesQueue.takeFirst() : m_affectedFramesQueue.takeFirst();;
140
141 KisLockFrameGenerationLock lock(image->animationInterface());
142
144 m_currentFrame = frame;
145}
KisImageAnimationInterface * animationInterface() const
bool isIdle(bool allowLocked=false)
Definition kis_image.cc:788
KisImage * clone(bool exactCopy=false)
Definition kis_image.cc:405
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
void startFrameRegeneration(KisImageSP image, int frame, const KisRegion &regionOfInterest, Flags flags, KisLockFrameGenerationLock &&frameGenerationLock)

References KisImage::animationInterface(), KisImageAnimationInterface::backgroundFrameGenerationBlocked(), KisImage::clone(), KisImage::isIdle(), KIS_SAFE_ASSERT_RECOVER_RETURN, m_affectedFramesQueue, m_changedFramesQueue, m_currentFrame, m_image, m_renderer, KisAsyncAnimationRendererBase::None, and KisAsyncAnimationRendererBase::startFrameRegeneration().

◆ scheduleFrameForRegeneration()

void KisStoryboardThumbnailRenderScheduler::scheduleFrameForRegeneration ( int frame,
bool affected )

Adds the frame to the list of "to be regenerated" frames.

Parameters
frameTo be regenerated frame
affectedDenotes whether this frame was directly changed or affected by changes made to other keyframes.

Definition at line 39 of file KisStoryboardThumbnailRenderScheduler.cpp.

40{
41 if (affected && m_affectedFramesQueue.contains(frame)) {
42 return;
43 }
44 else if (affected && !m_changedFramesQueue.contains(frame)) {
45 m_affectedFramesQueue.prepend(frame);
46 }
47 else {
48 if (m_changedFramesQueue.contains(frame)) {
49 int framePos = m_changedFramesQueue.indexOf(frame);
50 if (framePos == 0) {
51 return;
52 }
53 m_changedFramesQueue.move(framePos, 0);
54 }
55 else {
56 m_changedFramesQueue.prepend(frame);
57 }
59 }
60}
void sortAffectedFrameQueue()
Sorts the m_affectedFramesQueue based on proximity to the last changed frame.

References m_affectedFramesQueue, m_changedFramesQueue, and sortAffectedFrameQueue().

◆ setImage()

void KisStoryboardThumbnailRenderScheduler::setImage ( KisImageSP image)

Sets an image, the class takes an image, clones it and calls frame regeneration on the clone so do not pass cloned image explicitly. The image should be set only_once and not every time before scheduling a frame for regeneration. Setting an image cancels rendering of all previously scheduled frames.

Parameters
imageImage whose frames are to be rendered.

Definition at line 30 of file KisStoryboardThumbnailRenderScheduler.cpp.

31{
32 if (m_image == image) {
33 return;
34 }
36 m_image = image;
37}
void cancelAllFrameRendering()
Cancels all frame rendering. Empties all queues and cancels the current rendering,...

References cancelAllFrameRendering(), and m_image.

◆ sigFrameCancelled

void KisStoryboardThumbnailRenderScheduler::sigFrameCancelled ( int frame)
signal

◆ sigFrameCompleted

void KisStoryboardThumbnailRenderScheduler::sigFrameCompleted ( int frame,
KisPaintDeviceSP dev )
signal

◆ slotFrameRegenerationCancelled

void KisStoryboardThumbnailRenderScheduler::slotFrameRegenerationCancelled ( int frame)
privateslot

Emits sigFrameCancelled(int) and schedules the next frame for regeneration.

Definition at line 104 of file KisStoryboardThumbnailRenderScheduler.cpp.

105{
106 Q_EMIT sigFrameCancelled(frame);
108}
void renderNextFrame()
Renders the next frame, either from affected or changed queue. Changed queue is given preference....

References renderNextFrame(), and sigFrameCancelled().

◆ slotFrameRegenerationCompleted

void KisStoryboardThumbnailRenderScheduler::slotFrameRegenerationCompleted ( int frame,
KisPaintDeviceSP contents )
privateslot

Emits sigFrameCompleted(int,KisPaintDeviceSP) if the regeneration was complete and calls regeneration of the next frame in queue.

Definition at line 98 of file KisStoryboardThumbnailRenderScheduler.cpp.

99{
100 Q_EMIT sigFrameCompleted(frame, contents);
102}
void sigFrameCompleted(int frame, KisPaintDeviceSP dev)

References renderNextFrame(), and sigFrameCompleted().

◆ slotStartFrameRendering

void KisStoryboardThumbnailRenderScheduler::slotStartFrameRendering ( )
slot

Definition at line 89 of file KisStoryboardThumbnailRenderScheduler.cpp.

90{
91 //if the renderer is idle start rendering the frames in queues
92 if (!m_renderer->isActive()) {
94 }
95}

References KisAsyncAnimationRendererBase::isActive(), m_renderer, and renderNextFrame().

◆ sortAffectedFrameQueue()

void KisStoryboardThumbnailRenderScheduler::sortAffectedFrameQueue ( )
private

Sorts the m_affectedFramesQueue based on proximity to the last changed frame.

Definition at line 110 of file KisStoryboardThumbnailRenderScheduler.cpp.

111{
112 int lastChangedFrame = m_changedFramesQueue[0];
113
114 //sort the affected queue based on proximity to the last changed frame.
115 std::sort(m_affectedFramesQueue.begin(), m_affectedFramesQueue.end(),
116 [lastChangedFrame](const int &arg1, const int &arg2)
117 {
118 return std::abs(arg1 - lastChangedFrame) < std::abs(arg2 - lastChangedFrame);
119 });
120}

References m_affectedFramesQueue, and m_changedFramesQueue.

Member Data Documentation

◆ m_affectedFramesQueue

QVector<int> KisStoryboardThumbnailRenderScheduler::m_affectedFramesQueue
private

Definition at line 90 of file KisStoryboardThumbnailRenderScheduler.h.

◆ m_changedFramesQueue

QVector<int> KisStoryboardThumbnailRenderScheduler::m_changedFramesQueue
private

Definition at line 89 of file KisStoryboardThumbnailRenderScheduler.h.

◆ m_currentFrame

int KisStoryboardThumbnailRenderScheduler::m_currentFrame
private

Definition at line 93 of file KisStoryboardThumbnailRenderScheduler.h.

◆ m_image

KisImageSP KisStoryboardThumbnailRenderScheduler::m_image
private

Definition at line 92 of file KisStoryboardThumbnailRenderScheduler.h.

◆ m_renderer

KisAsyncStoryboardThumbnailRenderer* KisStoryboardThumbnailRenderScheduler::m_renderer
private

Definition at line 91 of file KisStoryboardThumbnailRenderScheduler.h.


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