File indexing completed on 2024-05-12 16:23:26

0001 /***************************************************************************
0002  *   Copyright (C) 2005-2013 by Linuxstopmotion contributors;              *
0003  *   see the AUTHORS file for details.                                     *
0004  *                                                                         *
0005  *   This program is free software; you can redistribute it and/or modify  *
0006  *   it under the terms of the GNU General Public License as published by  *
0007  *   the Free Software Foundation; either version 2 of the License, or     *
0008  *   (at your option) any later version.                                   *
0009  *                                                                         *
0010  *   This program is distributed in the hope that it will be useful,       *
0011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
0012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
0013  *   GNU General Public License for more details.                          *
0014  *                                                                         *
0015  *   You should have received a copy of the GNU General Public License     *
0016  *   along with this program; if not, write to the                         *
0017  *   Free Software Foundation, Inc.,                                       *
0018  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
0019  ***************************************************************************/
0020 
0021 #include "scene.h"
0022 
0023 #include "frame.h"
0024 #include "src/domain/filenamevisitor.h"
0025 
0026 class Sound;
0027 class WorkspaceFile;
0028 
0029 FrameOutOfRangeException::FrameOutOfRangeException() {
0030 }
0031 
0032 const char* FrameOutOfRangeException::what() const throw() {
0033     return "Internal error: Frame out of range!";
0034 }
0035 
0036 
0037 Scene::Scene() {
0038 }
0039 
0040 
0041 Scene::~Scene() {
0042     unsigned int numElem = frames.size();
0043     for (unsigned int i = 0; i < numElem; ++i) {
0044         delete frames[i];
0045     }
0046 }
0047 
0048 
0049 int Scene::getSize() const {
0050     return frames.size();
0051 }
0052 
0053 
0054 const Frame* Scene::getFrame(int frameNumber) const {
0055     if (frameNumber < 0 || getSize() <= frameNumber)
0056         throw FrameOutOfRangeException();
0057     return frames[frameNumber];
0058 }
0059 
0060 
0061 void Scene::cleanFrames(int fromFrame, int toFrame) {
0062     if (fromFrame < 0 || toFrame < fromFrame || getSize() <= toFrame)
0063         throw FrameOutOfRangeException();
0064     frames.erase(frames.begin() + fromFrame, frames.begin() + toFrame);
0065 }
0066 
0067 
0068 void Scene::addFrame(Frame* f, int index) {
0069     if (index < 0 || getSize() < index)
0070         throw FrameOutOfRangeException();
0071     frames.insert(frames.begin() + index, f);
0072 }
0073 
0074 void Scene::addFrames(int where, const std::vector<Frame*>& fs) {
0075     int sceneSize = getSize();
0076     if (where < 0 || sceneSize < where)
0077         throw FrameOutOfRangeException();
0078     std::vector<Frame*>::size_type newFramesCount = fs.size();
0079     preallocateFrames(newFramesCount);
0080     frames.reserve(sceneSize + newFramesCount);
0081     frames.insert(frames.begin() + where,
0082             fs.begin(), fs.end());
0083 }
0084 
0085 void Scene::preallocateFrames(int count) {
0086     frames.reserve(frames.size() + count);
0087 }
0088 
0089 
0090 void Scene::addSavedFrame(Frame *f) {
0091     frames.push_back(f);
0092 }
0093 
0094 Frame* Scene::removeFrame(int frame) {
0095     if (frame < 0 || getSize() <= frame)
0096         throw FrameOutOfRangeException();
0097     Frame* f = frames[frame];
0098     frames.erase(frames.begin() + frame);
0099     return f;
0100 }
0101 
0102 void Scene::removeFrames(int frame, int count, std::vector<Frame*>& out) {
0103     if (count < 0 || frame < 0 || getSize() < frame + count)
0104         throw FrameOutOfRangeException();
0105     out.reserve(out.size() + count);
0106     std::vector<Frame*>::iterator begin = frames.begin() + frame;
0107     std::vector<Frame*>::iterator end = begin + count;
0108     out.insert(out.end(), begin, end);
0109     frames.erase(begin, end);
0110 }
0111 
0112 void Scene::moveFrames(int fromFrame, int toFrame, int movePosition ) {
0113     int size = getSize();
0114     if (fromFrame < 0 || toFrame < fromFrame || size <= toFrame
0115             || movePosition < 0 || size <= movePosition)
0116         throw FrameOutOfRangeException();
0117     if (movePosition < fromFrame) {
0118         for (int i = fromFrame, j = movePosition; i <= toFrame; ++i, ++j) {
0119             Frame *f = frames[i];
0120             frames.erase(frames.begin() + i);
0121             frames.insert(frames.begin() + j, f);
0122         }
0123     } else {
0124         for (int i = fromFrame; i <= toFrame; ++i) {
0125             Frame *f = frames[fromFrame];
0126             frames.erase(frames.begin() + fromFrame);
0127             frames.insert(frames.begin() + movePosition, f);
0128         }
0129     }
0130 }
0131 
0132 void Scene::addSound(int frameNumber, int soundNumber, Sound* sound) {
0133     if (frameNumber < 0 || getSize() <= frameNumber)
0134         throw FrameOutOfRangeException();
0135     frames[frameNumber]->addSound(soundNumber, sound);
0136 }
0137 
0138 Sound* Scene::removeSound(int frameNumber, int index) {
0139     if (frameNumber < 0 || getSize() <= frameNumber)
0140         throw FrameOutOfRangeException();
0141     return frames[frameNumber]->removeSound(index);
0142 }
0143 
0144 const Sound* Scene::getSound(int frameNumber, int index) const {
0145     if (frameNumber < 0 || getSize() <= frameNumber)
0146         throw FrameOutOfRangeException();
0147     return frames[frameNumber]->getSound(index);
0148 }
0149 
0150 int Scene::soundCount(int frameNumber) const {
0151     if (frameNumber < 0 || getSize() <= frameNumber)
0152         throw FrameOutOfRangeException();
0153     return frames[frameNumber]->soundCount();
0154 }
0155 
0156 const char* Scene::setSoundName(int frameNumber, int soundNumber,
0157         const char* soundName) {
0158     if (frameNumber < 0 || getSize() <= frameNumber)
0159         throw FrameOutOfRangeException();
0160     return frames[frameNumber]->setSoundName(soundNumber, soundName);
0161 }
0162 
0163 const char* Scene::getSoundName(int frameNumber, int soundNumber) const {
0164     if (frameNumber < 0 || getSize() <= frameNumber)
0165         throw FrameOutOfRangeException();
0166     return frames[frameNumber]->getSoundName(soundNumber);
0167 }
0168 
0169 void Scene::replaceImage(int frameNumber, WorkspaceFile& otherImage) {
0170     if (frameNumber < 0 || getSize() <= frameNumber)
0171         throw FrameOutOfRangeException();
0172     frames[frameNumber]->replaceImage(otherImage);
0173 }
0174 
0175 int Scene::newSound(int frameNumber, WorkspaceFile& file) {
0176     if (frameNumber < 0 || getSize() <= frameNumber)
0177         throw FrameOutOfRangeException();
0178     return frames[frameNumber]->newSound(file);
0179 }
0180 
0181 int Scene::soundCount() const {
0182     int s = 0;
0183     for (FrameVector::const_iterator i = frames.begin();
0184             i != frames.end();
0185             ++i) {
0186         s += (*i)->soundCount();
0187     }
0188     return s;
0189 }
0190 
0191 void Scene::accept(FileNameVisitor& v) const {
0192     v.reportNewScene();
0193     for (FrameVector::const_iterator i = frames.begin();
0194             i != frames.end();
0195             ++i) {
0196         (*i)->accept(v);
0197     }
0198 }