Krita Source Code Documentation
Loading...
Searching...
No Matches
FramesGluerBase Struct Referenceabstract

#include <kis_animation_frame_cache_p.h>

Public Member Functions

virtual void forgetFrame (int start)=0
 
 FramesGluerBase (QMap< int, int > &_frames)
 
bool glueFrames (const KisTimeSpan &range)
 
virtual void moveFrame (int oldStart, int newStart)=0
 
virtual ~FramesGluerBase ()
 

Public Attributes

QMap< int, int > & frames
 

Detailed Description

Definition at line 13 of file kis_animation_frame_cache_p.h.

Constructor & Destructor Documentation

◆ FramesGluerBase()

FramesGluerBase::FramesGluerBase ( QMap< int, int > & _frames)
inline

Definition at line 15 of file kis_animation_frame_cache_p.h.

15: frames(_frames) {}

◆ ~FramesGluerBase()

FramesGluerBase::~FramesGluerBase ( )
virtual

Definition at line 259 of file kis_animation_frame_cache.cpp.

260{
261}

Member Function Documentation

◆ forgetFrame()

virtual void FramesGluerBase::forgetFrame ( int start)
pure virtual

◆ glueFrames()

bool FramesGluerBase::glueFrames ( const KisTimeSpan & range)

Definition at line 263 of file kis_animation_frame_cache.cpp.

263 {
264 bool framesChanged = false;
265
266 if (frames.isEmpty()) return framesChanged;
267
268 // find the first element, which `end` is greater or equal to `range.start()`
269 auto it = frames.begin();
270 for (; it != frames.end(); ++it) {
271 if (it.key() + it.value() - 1 >= range.start()) {
272 break;
273 }
274 }
275
276 if (it != frames.end()) {
277 if (it.key() > range.start()) {
278 // Reinsert with an earilier start
279 const int oldStart = it.key();
280 const int newStart = range.start();
281 const int newLength = range.isInfinite() ? -1 : range.duration();
282
283 it = frames.erase(it);
284 it = frames.insert(newStart, newLength);
285 this->moveFrame(oldStart, newStart);
286 framesChanged = true;
287 }
288
289 if (range.isInfinite()) {
290 it.value() = -1;
291 framesChanged = true;
292 } else if (it.value() != -1 && it.key() + it.value() - 1 < range.end()) {
293 it.value() = range.end() - it.key() + 1;
294 framesChanged = true;
295 }
296
297 it = std::next(it);
298
299 while (it != frames.end()) {
300 if (range.isInfinite() || (it.value() != -1 && it.key() + it.value() - 1 <= range.end())) {
301 this->forgetFrame(it.key());
302 it = frames.erase(it);
303 framesChanged = true;
304 } else if (it.key() > range.end()) {
305 break;
306 } else if (it.value() == -1 || it.key() + it.value() - 1 > range.end()) {
307 // Reinsert with a later start
308 int oldStart = it.key();
309 int newStart = range.end() + 1;
310 int newLength = it.value() == -1 ? -1 : (it.key() + it.value() - 1 - newStart + 1);
311
312 frames.erase(it);
313 frames.insert(newStart, newLength);
314 this->moveFrame(oldStart, newStart);
315 framesChanged = true;
316 break;
317 } else {
318 KIS_SAFE_ASSERT_RECOVER_BREAK(0 && "we should never get here");
319 }
320 }
321 }
322
323 return framesChanged;
324}
int start() const
bool isInfinite() const
int duration() const
int end() const
#define KIS_SAFE_ASSERT_RECOVER_BREAK(cond)
Definition kis_assert.h:127
virtual void moveFrame(int oldStart, int newStart)=0
virtual void forgetFrame(int start)=0

References KisTimeSpan::duration(), KisTimeSpan::end(), forgetFrame(), frames, KisTimeSpan::isInfinite(), KIS_SAFE_ASSERT_RECOVER_BREAK, moveFrame(), and KisTimeSpan::start().

◆ moveFrame()

virtual void FramesGluerBase::moveFrame ( int oldStart,
int newStart )
pure virtual

Member Data Documentation

◆ frames

QMap<int, int>& FramesGluerBase::frames

Definition at line 17 of file kis_animation_frame_cache_p.h.


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