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 }