Пример #1
0
void UndoTransaction::removeFrameOfLayer(Layer* layer, int frame)
{
  ASSERT(layer);
  ASSERT(frame >= 0);

  switch (layer->getType()) {

    case GFXOBJ_LAYER_IMAGE:
      if (Cel* cel = static_cast<LayerImage*>(layer)->getCel(frame))
        removeCel(static_cast<LayerImage*>(layer), cel);

      for (++frame; frame<m_sprite->getTotalFrames(); ++frame)
        if (Cel* cel = static_cast<LayerImage*>(layer)->getCel(frame))
          setCelFramePosition(cel, cel->getFrame()-1);
      break;

    case GFXOBJ_LAYER_FOLDER: {
      LayerIterator it = static_cast<LayerFolder*>(layer)->get_layer_begin();
      LayerIterator end = static_cast<LayerFolder*>(layer)->get_layer_end();

      for (; it != end; ++it)
        removeFrameOfLayer(*it, frame);
      break;
    }

  }
}
Пример #2
0
void UndoTransaction::newFrameForLayer(Layer* layer, int frame)
{
  ASSERT(layer);
  ASSERT(frame >= 0);

  switch (layer->getType()) {

    case GFXOBJ_LAYER_IMAGE:
      // displace all cels in '>=frame' to the next frame
      for (int c=m_sprite->getTotalFrames()-1; c>=frame; --c) {
        Cel* cel = static_cast<LayerImage*>(layer)->getCel(c);
        if (cel)
          setCelFramePosition(cel, cel->getFrame()+1);
      }

      copyPreviousFrame(layer, frame);
      break;

    case GFXOBJ_LAYER_FOLDER: {
      LayerIterator it = static_cast<LayerFolder*>(layer)->get_layer_begin();
      LayerIterator end = static_cast<LayerFolder*>(layer)->get_layer_end();

      for (; it != end; ++it)
        newFrameForLayer(*it, frame);
      break;
    }

  }
}
Пример #3
0
// Does the hard part of removing a frame: Removes all cels located in
// the given frame, and moves all following cels one frame position back.
void DocumentApi::removeFrameOfLayer(Layer* layer, FrameNumber frame)
{
  ASSERT(layer);
  ASSERT(frame >= 0);

  Sprite* sprite = layer->getSprite();

  switch (layer->getType()) {

    case GFXOBJ_LAYER_IMAGE:
      if (Cel* cel = static_cast<LayerImage*>(layer)->getCel(frame))
        removeCel(static_cast<LayerImage*>(layer), cel);

      for (++frame; frame<sprite->getTotalFrames(); ++frame)
        if (Cel* cel = static_cast<LayerImage*>(layer)->getCel(frame))
          setCelFramePosition(sprite, cel, cel->getFrame().previous());
      break;

    case GFXOBJ_LAYER_FOLDER: {
      LayerIterator it = static_cast<LayerFolder*>(layer)->getLayerBegin();
      LayerIterator end = static_cast<LayerFolder*>(layer)->getLayerEnd();

      for (; it != end; ++it)
        removeFrameOfLayer(*it, frame);
      break;
    }

  }
}
Пример #4
0
void DocumentApi::addFrameForLayer(Layer* layer, FrameNumber frame)
{
  ASSERT(layer);
  ASSERT(frame >= 0);

  Sprite* sprite = layer->getSprite();

  switch (layer->getType()) {

    case GFXOBJ_LAYER_IMAGE:
      // Displace all cels in '>=frame' to the next frame.
      for (FrameNumber c=sprite->getLastFrame(); c>=frame; --c) {
        Cel* cel = static_cast<LayerImage*>(layer)->getCel(c);
        if (cel)
          setCelFramePosition(sprite, cel, cel->getFrame().next());
      }

      copyPreviousFrame(layer, frame);
      break;

    case GFXOBJ_LAYER_FOLDER: {
      LayerIterator it = static_cast<LayerFolder*>(layer)->getLayerBegin();
      LayerIterator end = static_cast<LayerFolder*>(layer)->getLayerEnd();

      for (; it != end; ++it)
        addFrameForLayer(*it, frame);
      break;
    }

  }
}
Пример #5
0
void UndoTransaction::moveFrameBeforeLayer(Layer* layer, int frame, int before_frame)
{
  ASSERT(layer);

  switch (layer->getType()) {

    case GFXOBJ_LAYER_IMAGE: {
      CelIterator it = ((LayerImage*)layer)->getCelBegin();
      CelIterator end = ((LayerImage*)layer)->getCelEnd();

      for (; it != end; ++it) {
        Cel* cel = *it;
        int new_frame = cel->getFrame();

        // moving the frame to the future
        if (frame < before_frame) {
          if (cel->getFrame() == frame) {
            new_frame = before_frame-1;
          }
          else if (cel->getFrame() > frame &&
                   cel->getFrame() < before_frame) {
            new_frame--;
          }
        }
        // moving the frame to the past
        else if (before_frame < frame) {
          if (cel->getFrame() == frame) {
            new_frame = before_frame;
          }
          else if (cel->getFrame() >= before_frame &&
                   cel->getFrame() < frame) {
            new_frame++;
          }
        }

        if (cel->getFrame() != new_frame)
          setCelFramePosition(cel, new_frame);
      }
      break;
    }

    case GFXOBJ_LAYER_FOLDER: {
      LayerIterator it = static_cast<LayerFolder*>(layer)->get_layer_begin();
      LayerIterator end = static_cast<LayerFolder*>(layer)->get_layer_end();

      for (; it != end; ++it)
        moveFrameBeforeLayer(*it, frame, before_frame);
      break;
    }

  }
}
Пример #6
0
void DocumentApi::moveFrameBeforeLayer(Layer* layer, FrameNumber frame, FrameNumber beforeFrame)
{
  ASSERT(layer);

  switch (layer->getType()) {

    case GFXOBJ_LAYER_IMAGE: {
      CelIterator it = ((LayerImage*)layer)->getCelBegin();
      CelIterator end = ((LayerImage*)layer)->getCelEnd();

      for (; it != end; ++it) {
        Cel* cel = *it;
        FrameNumber newFrame = cel->getFrame();

        // moving the frame to the future
        if (frame < beforeFrame) {
          if (cel->getFrame() == frame) {
            newFrame = beforeFrame.previous();
          }
          else if (cel->getFrame() > frame &&
                   cel->getFrame() < beforeFrame) {
            --newFrame;
          }
        }
        // moving the frame to the past
        else if (beforeFrame < frame) {
          if (cel->getFrame() == frame) {
            newFrame = beforeFrame;
          }
          else if (cel->getFrame() >= beforeFrame &&
                   cel->getFrame() < frame) {
            ++newFrame;
          }
        }

        if (cel->getFrame() != newFrame)
          setCelFramePosition(layer->getSprite(), cel, newFrame);
      }
      break;
    }

    case GFXOBJ_LAYER_FOLDER: {
      LayerIterator it = static_cast<LayerFolder*>(layer)->getLayerBegin();
      LayerIterator end = static_cast<LayerFolder*>(layer)->getLayerEnd();

      for (; it != end; ++it)
        moveFrameBeforeLayer(*it, frame, beforeFrame);
      break;
    }

  }
}