FrameNumber onGetFrame(Editor* editor) override { FrameNumber frame = editor->frame(); if (frame < editor->sprite()->lastFrame()) return frame.next(); else return FrameNumber(0); }
raster::FrameNumber calculate_next_frame( raster::Sprite* sprite, raster::FrameNumber frame, IDocumentSettings* docSettings, bool& pingPongForward) { FrameNumber first = FrameNumber(0); FrameNumber last = sprite->getLastFrame(); if (docSettings->getLoopAnimation()) { FrameNumber loopBegin, loopEnd; docSettings->getLoopRange(&loopBegin, &loopEnd); if (loopBegin < first) loopBegin = first; if (loopEnd > last) loopEnd = last; first = loopBegin; last = loopEnd; } switch (docSettings->getAnimationDirection()) { case IDocumentSettings::AniDir_Normal: frame = frame.next(); if (frame > last) frame = first; break; case IDocumentSettings::AniDir_Reverse: frame = frame.previous(); if (frame < first) frame = last; break; case IDocumentSettings::AniDir_PingPong: if (pingPongForward) { frame = frame.next(); if (frame > last) { frame = last.previous(); if (frame < first) frame = first; pingPongForward = false; } } else { frame = frame.previous(); if (frame < first) { frame = first.next(); if (frame > last) frame = last; pingPongForward = true; } } break; } return frame; }