diff options
| -rw-r--r-- | engines/titanic/core/game_object.cpp | 38 | ||||
| -rw-r--r-- | engines/titanic/core/game_object.h | 2 | ||||
| -rw-r--r-- | engines/titanic/support/movie.cpp | 6 | ||||
| -rw-r--r-- | engines/titanic/support/video_surface.cpp | 22 | ||||
| -rw-r--r-- | engines/titanic/support/video_surface.h | 12 | 
5 files changed, 62 insertions, 18 deletions
diff --git a/engines/titanic/core/game_object.cpp b/engines/titanic/core/game_object.cpp index 02a64dcad2..d7c93b9524 100644 --- a/engines/titanic/core/game_object.cpp +++ b/engines/titanic/core/game_object.cpp @@ -20,14 +20,14 @@   *   */ -#include "titanic/support/files_manager.h" -#include "titanic/game_manager.h" -#include "titanic/support/screen_manager.h" -#include "titanic/titanic.h" -#include "titanic/support/video_surface.h"  #include "titanic/core/game_object.h"  #include "titanic/core/resource_key.h"  #include "titanic/pet_control/pet_control.h" +#include "titanic/support/files_manager.h" +#include "titanic/support/screen_manager.h" +#include "titanic/support/video_surface.h" +#include "titanic/game_manager.h" +#include "titanic/titanic.h"  namespace Titanic { @@ -51,7 +51,7 @@ CGameObject::CGameObject(): CNamedItem() {  	_visible = true;  	_field60 = 0;  	_cursorId = CURSOR_ARROW; -	_field78 = 0; +	_initialFrame = 0;  	_frameNumber = -1;  	_field90 = 0;  	_field94 = 0; @@ -222,7 +222,7 @@ void CGameObject::draw(CScreenManager *screenManager, const Common::Point &destP  }  void CGameObject::loadResource(const CString &name) { -	switch (name.imageTypeSuffix()) { +	switch (name.fileTypeSuffix()) {  	case FILETYPE_IMAGE:  		loadImage(name);  		break; @@ -233,7 +233,25 @@ void CGameObject::loadResource(const CString &name) {  }  void CGameObject::loadMovie(const CString &name, bool pendingFlag) { -	warning("TODO: CGameObject::loadMovie"); +	g_vm->_filesManager.fn5(name); + +	// Create the surface if it doesn't already exist +	if (!_surface) { +		CGameManager *gameManager = getGameManager(); +		_surface = new OSVideoSurface(CScreenManager::setCurrent(), nullptr);		 +	} + +	// Load the new movie resource +	CResourceKey key(name); +	_surface->loadResource(key); + +	if (_surface->hasSurface() && !pendingFlag) { +		_bounds.setWidth(_surface->getWidth()); +		_bounds.setHeight(_surface->getHeight()); +	} + +	if (_initialFrame) +		loadFrame(_initialFrame);  }  void CGameObject::loadImage(const CString &name, bool pendingFlag) { @@ -264,7 +282,7 @@ void CGameObject::loadImage(const CString &name, bool pendingFlag) {  		makeDirty();  	} -	_field78 = 0; +	_initialFrame = 0;  }  void CGameObject::loadFrame(int frameNumber) { @@ -403,7 +421,7 @@ bool CGameObject::hasActiveMovie() const {  int CGameObject::getMovie19() const {  	if (_surface && _surface->_movie)  		return _surface->_movie->proc19(); -	return _field78; +	return _initialFrame;  }  int CGameObject::getSurface45() const { diff --git a/engines/titanic/core/game_object.h b/engines/titanic/core/game_object.h index 2fc047e523..3914c54226 100644 --- a/engines/titanic/core/game_object.h +++ b/engines/titanic/core/game_object.h @@ -70,7 +70,7 @@ protected:  	int _field58;  	bool _visible;  	CMovieClipList _clipList1; -	int _field78; +	int _initialFrame;  	CMovieClipList _clipList2;  	int _frameNumber;  	int _field90; diff --git a/engines/titanic/support/movie.cpp b/engines/titanic/support/movie.cpp index 4fccc571ee..d614ea7d9b 100644 --- a/engines/titanic/support/movie.cpp +++ b/engines/titanic/support/movie.cpp @@ -145,6 +145,11 @@ void OSMovie::decodeFrame() {  	OSVideoSurface *videoSurface = static_cast<OSVideoSurface *>(_videoSurface);  	assert(videoSurface); +	// If the video surface doesn't yet have an underlying surface, create it +	if (!videoSurface->hasSurface()) +		videoSurface->resize(frame->w, frame->h); + +	// Lock access to the surface  	videoSurface->lock();  	assert(videoSurface->_rawSurface); @@ -160,6 +165,7 @@ void OSMovie::decodeFrame() {  		delete s;  	} +	// Unlock the surface  	videoSurface->unlock();  } diff --git a/engines/titanic/support/video_surface.cpp b/engines/titanic/support/video_surface.cpp index 1a0d48bebe..c7b437e1e7 100644 --- a/engines/titanic/support/video_surface.cpp +++ b/engines/titanic/support/video_surface.cpp @@ -241,8 +241,24 @@ void OSVideoSurface::loadJPEG(const CResourceKey &key) {  	_resourceKey = key;  } -void OSVideoSurface::loadMovie() { -	warning("TODO"); +void OSVideoSurface::loadMovie(const CResourceKey &key, bool destroyFlag) { +	// Delete any prior movie +	if (_movie) { +		delete _movie; +		_movie = nullptr; +	} + +	// Create the new movie and load the first frame to the video surface +	_movie = new OSMovie(key, this); +	_movie->setFrame(0); + +	// If flagged to destroy, then immediately destroy movie instance +	if (destroyFlag) { +		delete _movie; +		_movie = nullptr; +	} + +	_resourceKey = key;  }  bool OSVideoSurface::lock() { @@ -329,7 +345,7 @@ bool OSVideoSurface::load() {  		return true;  	case FILETYPE_MOVIE: -		loadMovie(); +		loadMovie(_resourceKey);  		return true;  	default: diff --git a/engines/titanic/support/video_surface.h b/engines/titanic/support/video_surface.h index d39dea627b..335215d1df 100644 --- a/engines/titanic/support/video_surface.h +++ b/engines/titanic/support/video_surface.h @@ -93,9 +93,11 @@ public:  	virtual void loadJPEG(const CResourceKey &key) = 0;  	/** -	 * Loads a movie file specified by the resource key +	 * Loads a movie file specified by the resource key. +	 * @param key			Resource key for movie to load +	 * @param destroyFlag	Immediately destroy movie after decoding first frame  	 */ -	virtual void loadMovie() = 0; +	virtual void loadMovie(const CResourceKey &key, bool destroyFlag = false) = 0;  	/**  	 * Lock the surface for direct access to the pixels @@ -241,9 +243,11 @@ public:  	virtual void loadJPEG(const CResourceKey &key);  	/** -	 * Loads a movie file specified by the resource key +	 * Loads a movie file specified by the resource key. +	 * @param key			Resource key for movie to load +	 * @param destroyFlag	Immediately destroy movie after decoding first frame  	 */ -	virtual void loadMovie(); +	virtual void loadMovie(const CResourceKey &key, bool destroyFlag = false);  	/**  	 * Lock the surface for direct access to the pixels  | 
