diff options
| author | Sven Hesse | 2012-07-06 06:50:04 +0200 | 
|---|---|---|
| committer | Sven Hesse | 2012-07-30 01:44:43 +0200 | 
| commit | 9af01cd58417e796b82cf6bb36e1bd30b0875f0e (patch) | |
| tree | 04ed603d25adbe6edc4f9b008f360dc7e125a31e | |
| parent | 67d7c3f11fdaf697f7f3c3779643121793ba4eb7 (diff) | |
| download | scummvm-rg350-9af01cd58417e796b82cf6bb36e1bd30b0875f0e.tar.gz scummvm-rg350-9af01cd58417e796b82cf6bb36e1bd30b0875f0e.tar.bz2 scummvm-rg350-9af01cd58417e796b82cf6bb36e1bd30b0875f0e.zip | |
GOB: Move the background saving into its own class BackBuffer
| -rw-r--r-- | engines/gob/aniobject.cpp | 73 | ||||
| -rw-r--r-- | engines/gob/aniobject.h | 11 | ||||
| -rw-r--r-- | engines/gob/backbuffer.cpp | 100 | ||||
| -rw-r--r-- | engines/gob/backbuffer.h | 59 | ||||
| -rw-r--r-- | engines/gob/module.mk | 1 | 
5 files changed, 182 insertions, 62 deletions
| diff --git a/engines/gob/aniobject.cpp b/engines/gob/aniobject.cpp index 8d739fb3a4..8d3a6897bf 100644 --- a/engines/gob/aniobject.cpp +++ b/engines/gob/aniobject.cpp @@ -28,23 +28,20 @@  namespace Gob {  ANIObject::ANIObject(const ANIFile &ani) : _ani(&ani), _cmp(0), -	_visible(false), _paused(false), _mode(kModeContinuous), -	_x(0), _y(0), _background(0), _drawn(false) { +	_visible(false), _paused(false), _mode(kModeContinuous), _x(0), _y(0) {  	setAnimation(0);  	setPosition();  }  ANIObject::ANIObject(const CMPFile &cmp) : _ani(0), _cmp(&cmp), -	_visible(false), _paused(false), _mode(kModeContinuous), -	_x(0), _y(0), _background(0), _drawn(false) { +	_visible(false), _paused(false), _mode(kModeContinuous), _x(0), _y(0) {  	setAnimation(0);  	setPosition();  }  ANIObject::~ANIObject() { -	delete _background;  }  void ANIObject::setVisible(bool visible) { @@ -188,46 +185,36 @@ bool ANIObject::draw(Surface &dest, int16 &left, int16 &top,  bool ANIObject::drawCMP(Surface &dest, int16 &left, int16 &top,                                         int16 &right, int16 &bottom) { -	if (!_background) { +	if (!hasBuffer()) {  		uint16 width, height;  		_cmp->getMaxSize(width, height); -		_background = new Surface(width, height, dest.getBPP()); +		resizeBuffer(width, height);  	} -	const uint16 cR = _cmp->getWidth (_animation) - 1; -	const uint16 cB = _cmp->getHeight(_animation) - 1; +	left   = _x; +	top    = _y; +	right  = _x + _cmp->getWidth (_animation) - 1; +	bottom = _y + _cmp->getHeight(_animation) - 1; -	_backgroundLeft   = CLIP<int16>(   + _x, 0, dest.getWidth () - 1); -	_backgroundTop    = CLIP<int16>(   + _y, 0, dest.getHeight() - 1); -	_backgroundRight  = CLIP<int16>(cR + _x, 0, dest.getWidth () - 1); -	_backgroundBottom = CLIP<int16>(cB + _y, 0, dest.getHeight() - 1); - -	_background->blit(dest, _backgroundLeft , _backgroundTop, -	                        _backgroundRight, _backgroundBottom, 0, 0); +	if (!saveScreen(dest, left, top, right, bottom)) +		return false;  	_cmp->draw(dest, _animation, _x, _y, 0); -	_drawn = true; - -	left   = _backgroundLeft; -	top    = _backgroundTop; -	right  = _backgroundRight; -	bottom = _backgroundBottom; -  	return true;  }  bool ANIObject::drawANI(Surface &dest, int16 &left, int16 &top,                                         int16 &right, int16 &bottom) { -	if (!_background) { +	if (!hasBuffer()) {  		uint16 width, height;  		_ani->getMaxSize(width, height); -		_background = new Surface(width, height, dest.getBPP()); +		resizeBuffer(width, height);  	}  	const ANIFile::Animation &animation = _ani->getAnimationInfo(_animation); @@ -236,45 +223,23 @@ bool ANIObject::drawANI(Surface &dest, int16 &left, int16 &top,  	const ANIFile::FrameArea &area = animation.frameAreas[_frame]; -	_backgroundLeft   = CLIP<int16>(area.left   + _x, 0, dest.getWidth () - 1); -	_backgroundTop    = CLIP<int16>(area.top    + _y, 0, dest.getHeight() - 1); -	_backgroundRight  = CLIP<int16>(area.right  + _x, 0, dest.getWidth () - 1); -	_backgroundBottom = CLIP<int16>(area.bottom + _y, 0, dest.getHeight() - 1); +	left   = _x + area.left; +	top    = _y + area.top; +	right  = _x + area.right; +	bottom = _y + area.bottom; -	_background->blit(dest, _backgroundLeft , _backgroundTop, -	                        _backgroundRight, _backgroundBottom, 0, 0); +	if (!saveScreen(dest, left, top, right, bottom)) +		return false;  	_ani->draw(dest, _animation, _frame, _x, _y); -	_drawn = true; - -	left   = _backgroundLeft; -	top    = _backgroundTop; -	right  = _backgroundRight; -	bottom = _backgroundBottom; -  	return true;  }  bool ANIObject::clear(Surface &dest, int16 &left, int16 &top,                                       int16 &right, int16 &bottom) { -	if (!_drawn) -		return false; - -	const int16 bgRight  = _backgroundRight  - _backgroundLeft; -	const int16 bgBottom = _backgroundBottom - _backgroundTop; - -	dest.blit(*_background, 0, 0, bgRight, bgBottom, _backgroundLeft, _backgroundTop); - -	_drawn = false; - -	left   = _backgroundLeft; -	top    = _backgroundTop; -	right  = _backgroundRight; -	bottom = _backgroundBottom; - -	return true; +	return restoreScreen(dest, left, top, right, bottom);  }  void ANIObject::advance() { diff --git a/engines/gob/aniobject.h b/engines/gob/aniobject.h index 00f42b43ce..3c374f7b8f 100644 --- a/engines/gob/aniobject.h +++ b/engines/gob/aniobject.h @@ -25,6 +25,8 @@  #include "common/system.h" +#include "gob/backbuffer.h" +  namespace Gob {  class ANIFile; @@ -32,7 +34,7 @@ class CMPFile;  class Surface;  /** An ANI object, controlling an animation within an ANI file. */ -class ANIObject { +class ANIObject : public BackBuffer {  public:  	enum Mode {  		kModeContinuous, ///< Play the animation continuously. @@ -118,13 +120,6 @@ private:  	int16 _x; ///< The current X position.  	int16 _y; ///< The current Y position. -	Surface *_background; ///< The saved background. -	bool _drawn;          ///< Was the animation drawn? - -	int16 _backgroundLeft;   ///< The left position of the saved background. -	int16 _backgroundTop;    ///< The top of the saved background. -	int16 _backgroundRight;  ///< The right position of the saved background. -	int16 _backgroundBottom; ///< The bottom position of the saved background.  	bool drawCMP(Surface &dest, int16 &left, int16 &top, int16 &right, int16 &bottom);  	bool drawANI(Surface &dest, int16 &left, int16 &top, int16 &right, int16 &bottom); diff --git a/engines/gob/backbuffer.cpp b/engines/gob/backbuffer.cpp new file mode 100644 index 0000000000..752042d46e --- /dev/null +++ b/engines/gob/backbuffer.cpp @@ -0,0 +1,100 @@ +/* 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. + * + * 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/util.h" + +#include "gob/backbuffer.h" +#include "gob/surface.h" + +namespace Gob { + +BackBuffer::BackBuffer() : _background(0), _saved(false) { +} + +BackBuffer::~BackBuffer() { +	delete _background; +} + +bool BackBuffer::hasBuffer() const { +	return _background != 0; +} + +bool BackBuffer::hasSavedBackground() const { +	return _saved; +} + +void BackBuffer::trashBuffer() { +	_saved = false; +} + +void BackBuffer::resizeBuffer(uint16 width, uint16 height) { +	trashBuffer(); + +	if (_background && (_background->getWidth() == width) && (_background->getHeight() == height)) +		return; + +	delete _background; + +	_background = new Surface(width, height, 1); +} + +bool BackBuffer::saveScreen(const Surface &dest, int16 &left, int16 &top, int16 &right, int16 &bottom) { +	if (!_background) +		return false; + +	const int16 width  = MIN<int16>(right  - left + 1, _background->getWidth ()); +	const int16 height = MIN<int16>(bottom - top  + 1, _background->getHeight()); +	if ((width <= 0) || (height <= 0)) +		return false; + +	right  = left + width  - 1; +	bottom = top  + height - 1; + +	_saveLeft   = left; +	_saveTop    = top; +	_saveRight  = right; +	_saveBottom = bottom; + +	_background->blit(dest, _saveLeft, _saveTop, _saveRight, _saveBottom, 0, 0); + +	_saved = true; + +	return true; +} + +bool BackBuffer::restoreScreen(Surface &dest, int16 &left, int16 &top, int16 &right, int16 &bottom) { +	if (!_saved) +		return false; + +	left   = _saveLeft; +	top    = _saveTop; +	right  = _saveRight; +	bottom = _saveBottom; + +	dest.blit(*_background, 0, 0, right - left, bottom - top, left, top); + +	_saved = false; + +	return true; +} + +} // End of namespace Gob diff --git a/engines/gob/backbuffer.h b/engines/gob/backbuffer.h new file mode 100644 index 0000000000..c978689e9f --- /dev/null +++ b/engines/gob/backbuffer.h @@ -0,0 +1,59 @@ +/* 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. + * + * 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 GOB_BACKBUFFER_H +#define GOB_BACKBUFFER_H + +#include "common/system.h" + +namespace Gob { + +class Surface; + +class BackBuffer { +public: +	BackBuffer(); +	~BackBuffer(); + +protected: +	void trashBuffer(); +	void resizeBuffer(uint16 width, uint16 height); + +	bool saveScreen   (const Surface &dest, int16 &left, int16 &top, int16 &right, int16 &bottom); +	bool restoreScreen(      Surface &dest, int16 &left, int16 &top, int16 &right, int16 &bottom); + +	bool hasBuffer() const; +	bool hasSavedBackground() const; + +private: +	Surface *_background; ///< The saved background. +	bool _saved;          ///< Was the background saved? + +	int16 _saveLeft;   ///< The left position of the saved background. +	int16 _saveTop;    ///< The top of the saved background. +	int16 _saveRight;  ///< The right position of the saved background. +	int16 _saveBottom; ///< The bottom position of the saved background. +}; + +} // End of namespace Gob + +#endif // GOB_BACKBUFFER_H diff --git a/engines/gob/module.mk b/engines/gob/module.mk index 8a792049e8..2169602e1b 100644 --- a/engines/gob/module.mk +++ b/engines/gob/module.mk @@ -3,6 +3,7 @@ MODULE := engines/gob  MODULE_OBJS := \  	anifile.o \  	aniobject.o \ +	backbuffer.o \  	cheater.o \  	cheater_geisha.o \  	cmpfile.o \ | 
