diff options
author | Matthew Hoops | 2011-09-20 10:56:51 -0400 |
---|---|---|
committer | Matthew Hoops | 2011-09-20 10:56:51 -0400 |
commit | 635c8aa370e78cfc74dc66dd7efad5924ba348d2 (patch) | |
tree | 71cf4d6952b286e937a4cb4906865dc0b0d48fd0 | |
parent | d29e50504176c76b6f86cd5b6d6e43e923de170c (diff) | |
download | scummvm-rg350-635c8aa370e78cfc74dc66dd7efad5924ba348d2.tar.gz scummvm-rg350-635c8aa370e78cfc74dc66dd7efad5924ba348d2.tar.bz2 scummvm-rg350-635c8aa370e78cfc74dc66dd7efad5924ba348d2.zip |
PEGASUS: Add first stab at the Movie class
Seems this means the end of the base classes -- onto actual game logic from here on out!
-rw-r--r-- | engines/pegasus/module.mk | 1 | ||||
-rwxr-xr-x | engines/pegasus/movie.cpp | 156 | ||||
-rwxr-xr-x | engines/pegasus/movie.h | 78 |
3 files changed, 235 insertions, 0 deletions
diff --git a/engines/pegasus/module.mk b/engines/pegasus/module.mk index 5c77fac6ad..97830fe119 100644 --- a/engines/pegasus/module.mk +++ b/engines/pegasus/module.mk @@ -12,6 +12,7 @@ MODULE_OBJS = \ hotspot.o \ input.o \ menu.o \ + movie.o \ notification.o \ overview.o \ pegasus.o \ diff --git a/engines/pegasus/movie.cpp b/engines/pegasus/movie.cpp new file mode 100755 index 0000000000..c341d0c18a --- /dev/null +++ b/engines/pegasus/movie.cpp @@ -0,0 +1,156 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * Additional copyright for this file: + * Copyright (C) 1995-1997 Presto Studios, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/system.h" +#include "graphics/surface.h" +#include "video/qt_decoder.h" +#include "video/video_decoder.h" + +#include "pegasus/movie.h" + +namespace Pegasus { + +Movie::Movie(const tDisplayElementID id) : Animation(id) { + _video = 0; + _directDraw = false; + setScale(600); +} + +Movie::~Movie() { + releaseMovie(); +} + +// *** Make sure this will stop displaying the movie. + +void Movie::releaseMovie() { + if (_video) { + delete _video; + _video = 0; + disposeAllCallBacks(); + deallocateSurface(); + // TODO: Decrease global direct draw counter + } +} + +void Movie::initFromMovieFile(const Common::String &fileName, bool transparent) { + _transparent = transparent; + + releaseMovie(); + _video = new Video::QuickTimeDecoder(); + if (!_video->loadFile(fileName)) + error("Could not load video '%s'", fileName.c_str()); + + _video->pauseVideo(true); + + Common::Rect bounds(0, 0, _video->getWidth(), _video->getHeight()); + allocateSurface(bounds); + setBounds(bounds); + + setStart(0, getScale()); + setStop(_video->getDuration() * getScale() / 1000, getScale()); +} + +void Movie::setDirectDraw(const bool flag) { + _directDraw = flag; + // TODO: Increase/decrease the global direct draw counter +} + +void Movie::redrawMovieWorld() { + if (_video && _video->needsUpdate()) { + const Graphics::Surface *frame = _video->decodeNextFrame(); + + if (_directDraw) { + // Copy to the screen + // TODO: Scaling + Common::Rect bounds; + getBounds(bounds); + g_system->copyRectToScreen((byte *)frame->pixels, frame->pitch, bounds.left, bounds.top, frame->w, frame->h); + } else { + // Just copy to our surface + _surface->copyFrom(*frame); + } + } +} + +void Movie::draw(const Common::Rect &r) { + if (_transparent) + copyToCurrentPortTransparent(r); + else + copyToCurrentPort(r); +} + +void Movie::setVolume(uint16 volume) { + // TODO +} + +void Movie::setTime(const TimeValue time, const TimeScale scale) { + if (_video) + _video->seekToTime(Audio::Timestamp(0, time, ((scale == 0) ? getScale() : scale))); +} + +TimeValue Movie::getTime(const TimeScale scale) { + if (_video) { + TimeScale actualScale = ((scale == 0) ? getScale() : scale); + + uint32 startTime = _startTime * actualScale / _startScale; + uint32 stopTime = _stopTime * actualScale / _stopScale; + return CLIP<int>(_video->getElapsedTime() * actualScale / 1000, startTime, stopTime); + } + + return 0; +} + +void Movie::setRate(const Common::Rational rate) { + if (rate != 1 && rate != 0) + error("Cannot set movie rate"); +} + +void Movie::start() { + if (_video && _video->isPaused()) + _video->pauseVideo(false); + + TimeBase::start(); +} + +void Movie::stop() { + if (_video && !_video->isPaused()) + _video->pauseVideo(true); + + TimeBase::stop(); +} + +void Movie::resume() { + if (_video && _video->isPaused()) + _video->pauseVideo(false); + + TimeBase::resume(); +} + +void Movie::checkCallBacks() { + TimeBase::checkCallBacks(); + redrawMovieWorld(); +} + +} // End of namespace Pegasus diff --git a/engines/pegasus/movie.h b/engines/pegasus/movie.h new file mode 100755 index 0000000000..551d8cdc1b --- /dev/null +++ b/engines/pegasus/movie.h @@ -0,0 +1,78 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * Additional copyright for this file: + * Copyright (C) 1995-1997 Presto Studios, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef PEGASUS_MOVIE_H +#define PEGASUS_MOVIE_H + +#include "common/str.h" + +#include "pegasus/elements.h" +#include "pegasus/surface.h" + +namespace Video { + class SeekableVideoDecoder; +} + +namespace Pegasus { + +class Movie : public Animation, public PixelImage { +public: + Movie(const tDisplayElementID); + virtual ~Movie(); + + virtual void initFromMovieFile(const Common::String &fileName, bool transparent); + + bool isMovieValid() { return _video != 0; } + + virtual void releaseMovie(); + + virtual void draw(const Common::Rect &); + virtual void redrawMovieWorld(); + + void setDirectDraw(const bool); + + virtual void setTime(const TimeValue, const TimeScale = 0); + virtual TimeValue getTime(const TimeScale = 0); + + virtual void setRate(const Common::Rational); + + virtual void start(); + virtual void stop(); + virtual void resume(); + + // *** HACK ALERT + Video::SeekableVideoDecoder *getMovie() { return _video; } + void setVolume(uint16); + + virtual void checkCallBacks(); + +protected: + Video::SeekableVideoDecoder *_video; + bool _directDraw; +}; + +} // End of namespace Pegasus + +#endif |