Exemple #1
0
 FrameNumber onGetFrame(Editor* editor) override {
   FrameNumber frame = editor->frame();
   if (frame < editor->sprite()->lastFrame())
     return frame.next();
   else
     return FrameNumber(0);
 }
Exemple #2
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;
}