diff options
| -rw-r--r-- | sword1/animation.cpp | 17 | ||||
| -rw-r--r-- | sword1/animation.h | 3 | ||||
| -rw-r--r-- | sword2/driver/animation.cpp | 65 | ||||
| -rw-r--r-- | sword2/driver/animation.h | 8 | 
4 files changed, 58 insertions, 35 deletions
diff --git a/sword1/animation.cpp b/sword1/animation.cpp index 74f9494d7f..f8e5d16fd6 100644 --- a/sword1/animation.cpp +++ b/sword1/animation.cpp @@ -104,7 +104,7 @@ bool AnimationState::init(const char *name) {  	palnum = 0;  	maxPalnum = p; -	_sys->setPalette(palettes[palnum].pal, 0, 256); +	setPalette(palettes[palnum].pal);  	lut = lut2 = lookup[0];  	curpal = -1;  	cr = 0; @@ -140,6 +140,7 @@ bool AnimationState::init(const char *name) {  	/* Play audio - TODO: Sync with video?*/  	sndfile = new File();  	bgSoundStream = AudioStream::openStreamFile(name, sndfile); +  	if (bgSoundStream != NULL) {  		_snd->playInputStream(&bgSound, bgSoundStream, false, 255, 0, -1, false);  	} else { @@ -209,7 +210,7 @@ bool AnimationState::checkPaletteSwitch() {  	if (framenum == palettes[palnum].end) {  		unsigned char *l = lut2;  		palnum++; -		_sys->setPalette(palettes[palnum].pal, 0, 256); +		setPalette(palettes[palnum].pal);  		lutcalcnum = (BITDEPTH + palettes[palnum].end - (framenum + 1) + 2) / (palettes[palnum].end - (framenum + 1) + 2);  		lut2 = lut;  		lut = l; @@ -219,6 +220,10 @@ bool AnimationState::checkPaletteSwitch() {  	return false;  } +void AnimationState::setPalette(byte *pal) { +	_sys->setPalette(pal, 0, 256); +} +  #else  OverlayColor *AnimationState::lookup = 0; @@ -268,9 +273,9 @@ void AnimationState::plotYUV(OverlayColor *lut, int width, int height, byte *con  			int i = ((((dat[2][cpos] + ROUNDADD) >> SHIFT) * (BITDEPTH+1)) + ((dat[1][cpos] + ROUNDADD)>>SHIFT)) * 256;  			cpos++; -			ptr[linepos               ] = lut[i + dat[0][        ypos  ]]; +			ptr[linepos                ] = lut[i + dat[0][        ypos  ]];  			ptr[MOVIE_WIDTH + linepos++] = lut[i + dat[0][width + ypos++]]; -			ptr[linepos               ] = lut[i + dat[0][        ypos  ]]; +			ptr[linepos                ] = lut[i + dat[0][        ypos  ]];  			ptr[MOVIE_WIDTH + linepos++] = lut[i + dat[0][width + ypos++]];  		} @@ -376,6 +381,10 @@ bool AnimationState::decodeFrame() {  	return false;  } +MoviePlayer::MoviePlayer(Screen *scr, SoundMixer *snd, OSystem *sys) +	: _scr(scr), _snd(snd), _sys(sys) { +} +  /**   * Plays an animated cutscene.   * @param filename the file name of the cutscene file diff --git a/sword1/animation.h b/sword1/animation.h index 58b1be61ee..1c55bc4f07 100644 --- a/sword1/animation.h +++ b/sword1/animation.h @@ -129,6 +129,7 @@ private:  #ifdef BACKEND_8BIT  	void buildLookup(int p, int lines);  	bool checkPaletteSwitch(); +	void setPalette(byte *pal);  #else  	void buildLookup(void);  	void plotYUV(OverlayColor *lut, int width, int height, byte *const *dat); @@ -142,7 +143,7 @@ private:  	OSystem *_sys;  public: -	MoviePlayer(Screen *scr, SoundMixer *snd, OSystem *sys) : _scr(scr), _snd(snd), _sys(sys) {} +	MoviePlayer(Screen *scr, SoundMixer *snd, OSystem *sys);  	void play(const char *filename);  }; diff --git a/sword2/driver/animation.cpp b/sword2/driver/animation.cpp index 211c6b5fdb..d1fc9e59e4 100644 --- a/sword2/driver/animation.cpp +++ b/sword2/driver/animation.cpp @@ -38,18 +38,18 @@  namespace Sword2 {  AnimationState::AnimationState(Sword2Engine *vm) -	: _vm(vm) { +	: _vm(vm), _snd(_vm->_mixer), _sys(_vm->_system) {  }  AnimationState::~AnimationState() {  #ifdef USE_MPEG2 -	_vm->_mixer->stopHandle(bgSound); +	_snd->stopHandle(bgSound);  	if (decoder)  		mpeg2_close(decoder);  	delete mpgfile;  	delete sndfile;  #ifndef BACKEND_8BIT -	_vm->_system->hide_overlay(); +	_sys->hide_overlay();  	free(overlay);  #endif  	if (bgSoundStream) @@ -112,7 +112,7 @@ bool AnimationState::init(const char *name) {  	palnum = 0;  	maxPalnum = p; -	_vm->_graphics->setPalette(0, 256, palettes[palnum].pal, RDPAL_INSTANT); +	setPalette(palettes[palnum].pal);  	lut = lut2 = lookup[0];  	curpal = -1;  	cr = 0; @@ -122,7 +122,7 @@ bool AnimationState::init(const char *name) {  #else  	buildLookup();  	overlay = (OverlayColor*)calloc(MOVIE_WIDTH * MOVIE_HEIGHT, sizeof(OverlayColor)); -	_vm->_system->show_overlay(); +	_sys->show_overlay();  #endif  	// Open MPEG2 stream @@ -143,14 +143,14 @@ bool AnimationState::init(const char *name) {  	info = mpeg2_info(decoder);  	framenum = 0;  	frameskipped = 0; -	ticks = _vm->_system->get_msecs(); +	ticks = _sys->get_msecs();  	// Play audio  	sndfile = new File(); -	bgSoundStream = AudioStream::openStreamFile( name, sndfile ); +	bgSoundStream = AudioStream::openStreamFile(name, sndfile);  	if (bgSoundStream != NULL) { -		_vm->_mixer->playInputStream(&bgSound, bgSoundStream, false, 255, 0, -1, false); +		_snd->playInputStream(&bgSound, bgSoundStream, false, 255, 0, -1, false);  	} else {  		warning("Cutscene: Could not open Audio Track for %s", name);  	} @@ -218,7 +218,7 @@ bool AnimationState::checkPaletteSwitch() {  	if (framenum == palettes[palnum].end) {  		unsigned char *l = lut2;  		palnum++; -		_vm->_graphics->setPalette(0, 256, palettes[palnum].pal, RDPAL_INSTANT); +		setPalette(palettes[palnum].pal);  		lutcalcnum = (BITDEPTH + palettes[palnum].end - (framenum + 1) + 2) / (palettes[palnum].end - (framenum + 1) + 2);  		lut2 = lut;  		lut = l; @@ -228,6 +228,10 @@ bool AnimationState::checkPaletteSwitch() {  	return false;  } +void AnimationState::setPalette(byte *pal) { +	_vm->_graphics->setPalette(0, 256, pal, RDPAL_INSTANT); +} +  #else  OverlayColor *AnimationState::lookup = 0; @@ -256,13 +260,12 @@ void AnimationState::buildLookup() {  				if (b < 0) b = 0;  				else if (b > 255) b = 255; -				lookup[pos++] = _vm->_system->RGBToColor(r, g, b); +				lookup[pos++] = _sys->RGBToColor(r, g, b);  			}  		}  	}  } -  void AnimationState::plotYUV(OverlayColor *lut, int width, int height, byte *const *dat) {  	OverlayColor *ptr = overlay + (MOVIE_HEIGHT - height) / 2 * MOVIE_WIDTH + (MOVIE_WIDTH - width) / 2; @@ -294,8 +297,8 @@ void AnimationState::drawTextObject(SpriteInfo *s, uint8 *src) {  	// FIXME: These aren't the "right" colours, but look good to me. -	OverlayColor pen = _vm->_system->RGBToColor(255, 255, 255); -	OverlayColor border = _vm->_system->RGBToColor(0, 0, 0); +	OverlayColor pen = _sys->RGBToColor(255, 255, 255); +	OverlayColor border = _sys->RGBToColor(0, 0, 0);  	for (int y = 0; y < s->h; y++) {  		for (int x = 0; x < s->w; x++) { @@ -316,14 +319,14 @@ void AnimationState::drawTextObject(SpriteInfo *s, uint8 *src) {  }  void AnimationState::clearDisplay(void) { -	OverlayColor black = _vm->_system->RGBToColor(0, 0, 0); +	OverlayColor black = _sys->RGBToColor(0, 0, 0);  	for (int i = 0; i < MOVIE_WIDTH * MOVIE_HEIGHT; i++)  		overlay[i] = black;  }  void AnimationState::updateDisplay(void) { -	_vm->_system->copy_rect_overlay(overlay, MOVIE_WIDTH, 0, 0, MOVIE_WIDTH, MOVIE_HEIGHT); +	_sys->copy_rect_overlay(overlay, MOVIE_WIDTH, 0, 0, MOVIE_WIDTH, MOVIE_HEIGHT);  }  #endif @@ -359,7 +362,7 @@ bool AnimationState::decodeFrame() {  #ifdef BACKEND_8BIT  				if (checkPaletteSwitch() || (bgSoundStream == NULL) || -					((_vm->_mixer->getChannelElapsedTime(bgSound) * 12) / 1000 < framenum + 1) || frameskipped > 10) { +					((_snd->getChannelElapsedTime(bgSound) * 12) / 1000 < framenum + 1) || frameskipped > 10) {  					if (frameskipped > 10) {  						warning("force frame %i redraw", framenum);  						frameskipped = 0; @@ -367,8 +370,8 @@ bool AnimationState::decodeFrame() {  					_vm->_graphics->plotYUV(lut, sequence_i->width, sequence_i->height, info->display_fbuf->buf);  					if (bgSoundStream) { -						while ((_vm->_mixer->getChannelElapsedTime(bgSound) * 12) / 1000 < framenum) -							_vm->_system->delay_msecs(10); +						while ((_snd->getChannelElapsedTime(bgSound) * 12) / 1000 < framenum) +							_sys->delay_msecs(10);  					} else {  						ticks += 83;  						_vm->sleepUntil(ticks); @@ -386,7 +389,7 @@ bool AnimationState::decodeFrame() {  #else  				if ((bgSoundStream == NULL) || -					((_vm->_mixer->getChannelElapsedTime(bgSound) * 12) / 1000 < framenum + 1) || frameskipped > 10) { +					((_snd->getChannelElapsedTime(bgSound) * 12) / 1000 < framenum + 1) || frameskipped > 10) {  					if (frameskipped > 10) {  						warning("force frame %i redraw", framenum);  						frameskipped = 0; @@ -394,8 +397,8 @@ bool AnimationState::decodeFrame() {  					plotYUV(lookup, sequence_i->width, sequence_i->height, info->display_fbuf->buf);  					if (bgSoundStream) { -						while ((_vm->_mixer->getChannelElapsedTime(bgSound) * 12) / 1000 < framenum) -							_vm->_system->delay_msecs(10); +						while ((_snd->getChannelElapsedTime(bgSound) * 12) / 1000 < framenum) +							_sys->delay_msecs(10);  					} else {  						ticks += 83;  						_vm->sleepUntil(ticks); @@ -444,6 +447,10 @@ MovieInfo MoviePlayer::_movies[] = {  	{ "enddemo",  110 }  }; +MoviePlayer::MoviePlayer(Sword2Engine *vm) +	: _vm(vm), _snd(_vm->_mixer), _sys(_vm->_system), _textSurface(NULL) { +} +  void MoviePlayer::openTextObject(MovieTextObject *obj) {  	if (obj->textSprite)  		_vm->_graphics->createSurface(obj->textSprite, &_textSurface); @@ -530,7 +537,7 @@ int32 MoviePlayer::play(const char *filename, MovieTextObject *text[], uint8 *mu  			}  			if (startNextText && !handle.isActive()) { -				_vm->_mixer->playRaw(&handle, text[textCounter]->speech, text[textCounter]->speechBufferSize, 22050, flags); +				_snd->playRaw(&handle, text[textCounter]->speech, text[textCounter]->speechBufferSize, 22050, flags);  				startNextText = false;  			} @@ -558,7 +565,7 @@ int32 MoviePlayer::play(const char *filename, MovieTextObject *text[], uint8 *mu  		KeyboardEvent ke;  		if ((_vm->_input->readKey(&ke) == RD_OK && ke.keycode == 27) || _vm->_quit) { -			_vm->_mixer->stopHandle(handle); +			_snd->stopHandle(handle);  			skipCutscene = true;  			break;  		} @@ -567,7 +574,7 @@ int32 MoviePlayer::play(const char *filename, MovieTextObject *text[], uint8 *mu  	if (!skipCutscene) {  		// Sleep for one frame so that the last frame is displayed. -		_vm->_system->delay_msecs(1000 / 12); +		_sys->delay_msecs(1000 / 12);  	}  #ifndef BACKEND_8BIT @@ -603,7 +610,7 @@ int32 MoviePlayer::play(const char *filename, MovieTextObject *text[], uint8 *mu  	while (handle.isActive()) {  		_vm->_graphics->updateDisplay(false); -		_vm->_system->delay_msecs(100); +		_sys->delay_msecs(100);  	}  	// Clear the screen again @@ -711,7 +718,7 @@ int32 MoviePlayer::playDummy(const char *filename, MovieTextObject *text[], uint  				openTextObject(text[textCounter]);  				drawTextObject(NULL, text[textCounter]);  				if (text[textCounter]->speech) { -					_vm->_mixer->playRaw(&handle, text[textCounter]->speech, text[textCounter]->speechBufferSize, 22050, flags); +					_snd->playRaw(&handle, text[textCounter]->speech, text[textCounter]->speechBufferSize, 22050, flags);  				}  			}  			if (frameCounter == text[textCounter]->endFrame) { @@ -728,7 +735,7 @@ int32 MoviePlayer::playDummy(const char *filename, MovieTextObject *text[], uint  			KeyboardEvent ke;  			if ((_vm->_input->readKey(&ke) == RD_OK && ke.keycode == 27) || _vm->_quit) { -				_vm->_mixer->stopHandle(handle); +				_snd->stopHandle(handle);  				skipCutscene = true;  				break;  			} @@ -737,7 +744,7 @@ int32 MoviePlayer::playDummy(const char *filename, MovieTextObject *text[], uint  			// frame rate the original movies had, or even if it  			// was constant, but this seems to work reasonably. -			_vm->_system->delay_msecs(90); +			_sys->delay_msecs(90);  		}  		// Wait for the voice to stop playing. This is to make sure @@ -747,7 +754,7 @@ int32 MoviePlayer::playDummy(const char *filename, MovieTextObject *text[], uint  		while (handle.isActive()) {  			_vm->_graphics->updateDisplay(false); -			_vm->_system->delay_msecs(100); +			_sys->delay_msecs(100);  		}  		closeTextObject(text[textCounter]); diff --git a/sword2/driver/animation.h b/sword2/driver/animation.h index 84e7d70637..ab88b869df 100644 --- a/sword2/driver/animation.h +++ b/sword2/driver/animation.h @@ -69,6 +69,8 @@ namespace Sword2 {  class AnimationState {  private:  	Sword2Engine *_vm; +	SoundMixer *_snd; +	OSystem *_sys;  	uint framenum;  	uint frameskipped; @@ -129,6 +131,7 @@ private:  #ifdef BACKEND_8BIT  	void buildLookup(int p, int lines);  	bool checkPaletteSwitch(); +	void setPalette(byte *pal);  #else  	void buildLookup(void);  	void plotYUV(OverlayColor *lut, int width, int height, byte *const *dat); @@ -143,6 +146,9 @@ struct MovieInfo {  class MoviePlayer {  private:  	Sword2Engine *_vm; +	SoundMixer *_snd; +	OSystem *_sys; +  	uint8 *_textSurface;  	static struct MovieInfo _movies[]; @@ -154,7 +160,7 @@ private:  	int32 playDummy(const char *filename, MovieTextObject *text[], uint8 *musicOut);  public: -	MoviePlayer(Sword2Engine *vm) : _vm(vm), _textSurface(NULL) {} +	MoviePlayer(Sword2Engine *vm);  	int32 play(const char *filename, MovieTextObject *text[], uint8 *musicOut);  };  | 
