diff options
| author | Paul Gilbert | 2014-03-13 22:25:16 -0400 | 
|---|---|---|
| committer | Paul Gilbert | 2014-03-13 22:25:16 -0400 | 
| commit | 3f0cd4771c94a83c72f09f74ba351a3905357d1c (patch) | |
| tree | 5bc2e37b658b01403a5cb59337094719f7e3192a | |
| parent | 84fb90e7a52daffd862159d54cda4817aa930a6f (diff) | |
| download | scummvm-rg350-3f0cd4771c94a83c72f09f74ba351a3905357d1c.tar.gz scummvm-rg350-3f0cd4771c94a83c72f09f74ba351a3905357d1c.tar.bz2 scummvm-rg350-3f0cd4771c94a83c72f09f74ba351a3905357d1c.zip | |
MADS: Fixed handling of dirty rects to copy areas to the physical screen
| -rw-r--r-- | engines/mads/dialogs.cpp | 2 | ||||
| -rw-r--r-- | engines/mads/game.cpp | 2 | ||||
| -rw-r--r-- | engines/mads/game_data.cpp | 2 | ||||
| -rw-r--r-- | engines/mads/mads.cpp | 2 | ||||
| -rw-r--r-- | engines/mads/mads.h | 2 | ||||
| -rw-r--r-- | engines/mads/messages.cpp | 2 | ||||
| -rw-r--r-- | engines/mads/module.mk | 2 | ||||
| -rw-r--r-- | engines/mads/msurface.cpp | 2 | ||||
| -rw-r--r-- | engines/mads/nebular/dialogs_nebular.cpp | 2 | ||||
| -rw-r--r-- | engines/mads/nebular/game_nebular.cpp | 2 | ||||
| -rw-r--r-- | engines/mads/scene.cpp | 4 | ||||
| -rw-r--r-- | engines/mads/scene.h | 2 | ||||
| -rw-r--r-- | engines/mads/scene_data.cpp | 20 | ||||
| -rw-r--r-- | engines/mads/scene_data.h | 16 | ||||
| -rw-r--r-- | engines/mads/screen.cpp (renamed from engines/mads/graphics.cpp) | 23 | ||||
| -rw-r--r-- | engines/mads/screen.h (renamed from engines/mads/graphics.h) | 25 | ||||
| -rw-r--r-- | engines/mads/sprites.cpp | 2 | ||||
| -rw-r--r-- | engines/mads/user_interface.cpp | 2 | 
18 files changed, 84 insertions, 30 deletions
| diff --git a/engines/mads/dialogs.cpp b/engines/mads/dialogs.cpp index d159d48ace..571cca5d29 100644 --- a/engines/mads/dialogs.cpp +++ b/engines/mads/dialogs.cpp @@ -23,7 +23,7 @@  #include "common/scummsys.h"  #include "common/config-manager.h"  #include "mads/mads.h" -#include "mads/graphics.h" +#include "mads/screen.h"  #include "mads/msurface.h"  #include "mads/nebular/dialogs_nebular.h" diff --git a/engines/mads/game.cpp b/engines/mads/game.cpp index 6a7f6fb18d..bcebc04a00 100644 --- a/engines/mads/game.cpp +++ b/engines/mads/game.cpp @@ -25,7 +25,7 @@  #include "mads/game.h"  #include "mads/game_data.h"  #include "mads/events.h" -#include "mads/graphics.h" +#include "mads/screen.h"  #include "mads/msurface.h"  #include "mads/resources.h"  #include "mads/nebular/game_nebular.h" diff --git a/engines/mads/game_data.cpp b/engines/mads/game_data.cpp index ba24ed9ca1..cbc8f93a4b 100644 --- a/engines/mads/game_data.cpp +++ b/engines/mads/game_data.cpp @@ -24,7 +24,7 @@  #include "mads/mads.h"  #include "mads/game.h"  #include "mads/nebular/game_nebular.h" -#include "mads/graphics.h" +#include "mads/screen.h"  #include "mads/msurface.h"  #include "mads/resources.h" diff --git a/engines/mads/mads.cpp b/engines/mads/mads.cpp index 6dfdf7b3b8..9cab1ad8f9 100644 --- a/engines/mads/mads.cpp +++ b/engines/mads/mads.cpp @@ -26,7 +26,7 @@  #include "common/events.h"  #include "engines/util.h"  #include "mads/mads.h" -#include "mads/graphics.h" +#include "mads/screen.h"  #include "mads/msurface.h"  #include "mads/resources.h"  #include "mads/sound.h" diff --git a/engines/mads/mads.h b/engines/mads/mads.h index 2fbac32c4a..749c69a64c 100644 --- a/engines/mads/mads.h +++ b/engines/mads/mads.h @@ -35,7 +35,7 @@  #include "mads/events.h"  #include "mads/font.h"  #include "mads/game.h" -#include "mads/graphics.h" +#include "mads/screen.h"  #include "mads/msurface.h"  #include "mads/resources.h"  #include "mads/sound.h" diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp index dcac541cf8..21463aa58a 100644 --- a/engines/mads/messages.cpp +++ b/engines/mads/messages.cpp @@ -23,7 +23,7 @@  #include "common/scummsys.h"  #include "mads/mads.h"  #include "mads/font.h" -#include "mads/graphics.h" +#include "mads/screen.h"  #include "mads/messages.h"  #include "mads/scene_data.h" diff --git a/engines/mads/module.mk b/engines/mads/module.mk index 2f4982f9f8..a65519faea 100644 --- a/engines/mads/module.mk +++ b/engines/mads/module.mk @@ -18,7 +18,6 @@ MODULE_OBJS := \  	font.o \  	game.o \  	game_data.o \ -	graphics.o \  	hotspots.o \  	interface.o \  	mads.o \ @@ -29,6 +28,7 @@ MODULE_OBJS := \  	resources.o \  	scene.o \  	scene_data.o \ +	screen.o \  	sequence.o \  	sound.o \  	sprites.o \ diff --git a/engines/mads/msurface.cpp b/engines/mads/msurface.cpp index e8d391ff89..c8c66234cb 100644 --- a/engines/mads/msurface.cpp +++ b/engines/mads/msurface.cpp @@ -22,7 +22,7 @@  #include "engines/util.h"  #include "mads/compression.h" -#include "mads/graphics.h" +#include "mads/screen.h"  #include "mads/mads.h"  #include "mads/msurface.h"  #include "mads/resources.h" diff --git a/engines/mads/nebular/dialogs_nebular.cpp b/engines/mads/nebular/dialogs_nebular.cpp index 6d2321eae2..dc74f39fe8 100644 --- a/engines/mads/nebular/dialogs_nebular.cpp +++ b/engines/mads/nebular/dialogs_nebular.cpp @@ -23,7 +23,7 @@  #include "common/scummsys.h"  #include "common/config-manager.h"  #include "mads/mads.h" -#include "mads/graphics.h" +#include "mads/screen.h"  #include "mads/msurface.h"  #include "mads/nebular/dialogs_nebular.h" diff --git a/engines/mads/nebular/game_nebular.cpp b/engines/mads/nebular/game_nebular.cpp index 65abb40f1e..8948689622 100644 --- a/engines/mads/nebular/game_nebular.cpp +++ b/engines/mads/nebular/game_nebular.cpp @@ -24,7 +24,7 @@  #include "common/config-manager.h"  #include "mads/mads.h"  #include "mads/game.h" -#include "mads/graphics.h" +#include "mads/screen.h"  #include "mads/msurface.h"  #include "mads/nebular/game_nebular.h"  #include "mads/nebular/dialogs_nebular.h" diff --git a/engines/mads/scene.cpp b/engines/mads/scene.cpp index ef5fd78f74..8bf0b6a527 100644 --- a/engines/mads/scene.cpp +++ b/engines/mads/scene.cpp @@ -438,7 +438,7 @@ void Scene::drawElements(ScreenTransition transitionType, bool surfaceFlag) {  	_dirtyAreas.merge(1, DIRTY_AREAS_SIZE);  	// Copy dirty areas to the main display surface -	_dirtyAreas.copy(&_vm->_screen, &_backgroundSurface, _posAdjust); +	_dirtyAreas.copy(&_backgroundSurface, &_vm->_screen, _posAdjust);  	// Handle dirty areas for foreground objects  	_spriteSlots.setDirtyAreas(); @@ -463,7 +463,7 @@ void Scene::drawElements(ScreenTransition transitionType, bool surfaceFlag) {  		_vm->_sound->startQueuedCommands();  	} else {  		// Copy dirty areas to the screen -		_dirtyAreas.copy(&_vm->_screen, &_backgroundSurface, _vm->_screen._offset); +		_dirtyAreas.copyToScreen(_vm->_screen._offset);  	}  	warning("TODO: sub_115A2"); diff --git a/engines/mads/scene.h b/engines/mads/scene.h index 79c5910d85..0b20fb077f 100644 --- a/engines/mads/scene.h +++ b/engines/mads/scene.h @@ -27,7 +27,7 @@  #include "common/array.h"  #include "common/rect.h"  #include "mads/assets.h" -#include "mads/graphics.h" +#include "mads/screen.h"  #include "mads/hotspots.h"  #include "mads/messages.h"  #include "mads/msurface.h" diff --git a/engines/mads/scene_data.cpp b/engines/mads/scene_data.cpp index 8f981ef37d..fe768934c3 100644 --- a/engines/mads/scene_data.cpp +++ b/engines/mads/scene_data.cpp @@ -24,7 +24,7 @@  #include "mads/scene_data.h"  #include "mads/mads.h"  #include "mads/compression.h" -#include "mads/graphics.h" +#include "mads/screen.h"  #include "mads/resources.h"  #include "mads/nebular/nebular_scenes.h" @@ -276,7 +276,20 @@ void DirtyAreas::mergeAreas(int idx1, int idx2) {  	da1._textActive = true;  } -void DirtyAreas::copy(MSurface *dest, MSurface *src, const Common::Point &posAdjust) { +void DirtyAreas::copy(MSurface *srcSurface, MSurface *destSurface, const Common::Point &posAdjust) { +	for (uint i = 0; i < size(); ++i) { +		const Common::Rect &srcBounds = (*this)[i]._bounds; + +		Common::Rect bounds(srcBounds.left + posAdjust.x, srcBounds.top + posAdjust.y, +			srcBounds.right + posAdjust.x, srcBounds.bottom + posAdjust.y); + +		if ((*this)[i]._active && bounds.isValidRect()) { +			srcSurface->copyTo(destSurface, bounds, Common::Point(bounds.left, bounds.top)); +		} +	} +} + +void DirtyAreas::copyToScreen(const Common::Point &posAdjust) {  	for (uint i = 0; i < size(); ++i) {  		const Common::Rect &srcBounds = (*this)[i]._bounds; @@ -284,8 +297,7 @@ void DirtyAreas::copy(MSurface *dest, MSurface *src, const Common::Point &posAdj  			srcBounds.right + posAdjust.x, srcBounds.bottom + posAdjust.y);  		if ((*this)[i]._active && (*this)[i]._bounds.isValidRect()) { -			src->copyTo(dest, bounds, Common::Point((*this)[i]._bounds.left, -				(*this)[i]._bounds.top)); +			_vm->_screen.copyRectToScreen(bounds);  		}  	}  } diff --git a/engines/mads/scene_data.h b/engines/mads/scene_data.h index d0c61ae3f7..7a41bab1f8 100644 --- a/engines/mads/scene_data.h +++ b/engines/mads/scene_data.h @@ -151,7 +151,21 @@ public:  	bool intersects(int idx1, int idx2);  	void mergeAreas(int idx1, int idx2); -	void copy(MSurface *dest, MSurface *src, const Common::Point &posAdjust); + +	/** +	 * Copy the data specified by the dirty rect list between surfaces +	 * @param srcSurface	Source surface +	 * @param destSurface	Dest surface +	 * @param posAdjust		Position adjustment +	 */ +	void copy(MSurface *srcSurface, MSurface *destSurface, const Common::Point &posAdjust); + +	/** +	 * Use the lsit of dirty areas to copy areas of the screen surface to +	 * the physical screen +	 * @param posAdjust		Position adjustment	 */ +	void copyToScreen(const Common::Point &posAdjust); +  	void reset();  }; diff --git a/engines/mads/graphics.cpp b/engines/mads/screen.cpp index 769b4dd2d2..20ff4f6df2 100644 --- a/engines/mads/graphics.cpp +++ b/engines/mads/screen.cpp @@ -23,17 +23,32 @@  #include "common/scummsys.h"  #include "mads/mads.h"  #include "mads/game.h" -#include "mads/graphics.h" +#include "mads/screen.h"  #include "mads/palette.h"  namespace MADS { +ScreenSurface::ScreenSurface() { +	_dataP = nullptr; +} +  void ScreenSurface::init() {  	setSize(g_system->getWidth(), g_system->getHeight());  } +void ScreenSurface::copyRectToScreen(const Common::Point &destPos, +		const Common::Rect &bounds) { +	byte *buf = getBasePtr(destPos.x, destPos.y); +	g_system->copyRectToScreen(buf, this->pitch, bounds.left, bounds.top, +		bounds.width(), bounds.height()); +} + +void ScreenSurface::copyRectToScreen(const Common::Rect &bounds) { +	copyRectToScreen(Common::Point(bounds.left, bounds.top), bounds); +} + +  void ScreenSurface::updateScreen() { -	g_system->copyRectToScreen((const byte *)pixels, pitch, 0, 0, w, h);  	g_system->updateScreen();  } @@ -75,8 +90,7 @@ void ScreenSurface::transition(ScreenTransition transitionType, bool surfaceFlag  }  void ScreenSurface::setPointer(MSurface *s) { -	_pixels = s->getData(); -	_pitch = s->w; +	_dataP = s->getData();  }  void ScreenSurface::fadeOut() { @@ -86,6 +100,7 @@ void ScreenSurface::fadeOut() {  void ScreenSurface::fadeIn() {  	warning("TODO: Proper fade in");  	_vm->_palette->setFullPalette(_vm->_palette->_mainPalette); +	_vm->_screen.copyRectToScreen(Common::Rect(0, 0, 320, 200));  }  } // End of namespace MADS diff --git a/engines/mads/graphics.h b/engines/mads/screen.h index d4933ae68d..e101020fc8 100644 --- a/engines/mads/graphics.h +++ b/engines/mads/screen.h @@ -20,8 +20,8 @@   *   */ -#ifndef MADS_GRAPHICS_H -#define MADS_GRAPHICS_H +#ifndef MADS_SCREEN_H +#define MADS_SCREEN_H  #include "common/scummsys.h"  #include "common/array.h" @@ -58,13 +58,12 @@ private:  	void fadeIn();  public:  	Common::Point _offset; -	byte *_pixels; -	int _pitch; +	byte *_dataP;  public:  	/**  	 * Constructor  	 */ -	ScreenSurface() {} +	ScreenSurface();  	/**  	 * Initialise the surface @@ -74,6 +73,20 @@ public:  	void setPointer(MSurface *s);  	/** +	 * Copys an area of the screen surface to a given destination position on +	 * the ScummVM physical screen buffer +	 * @param destPos	Destination position +	 * @param bounds	Area of screen surface to copy +	 */ +	void copyRectToScreen(const Common::Point &destPos, const Common::Rect &bounds); + +	/** +	 * Copys an area of the screen surface to the ScmmVM physical screen buffer +	 * @param bounds	Area of screen surface to copy +	 */ +	void copyRectToScreen(const Common::Rect &bounds); + +	/**  	 * Updates the screen with the contents of the surface  	 */  	void updateScreen(); @@ -83,4 +96,4 @@ public:  } // End of namespace MADS -#endif /* MADS_GRAPHICS_H */ +#endif /* MADS_SCREEN_H */ diff --git a/engines/mads/sprites.cpp b/engines/mads/sprites.cpp index a7a46ce29f..6f227fa341 100644 --- a/engines/mads/sprites.cpp +++ b/engines/mads/sprites.cpp @@ -24,7 +24,7 @@  #include "engines/util.h"  #include "graphics/palette.h"  #include "mads/mads.h" -#include "mads/graphics.h" +#include "mads/screen.h"  #include "mads/msurface.h"  #include "mads/sprites.h" diff --git a/engines/mads/user_interface.cpp b/engines/mads/user_interface.cpp index 3bbf6a0b2b..ec5ca8a0b5 100644 --- a/engines/mads/user_interface.cpp +++ b/engines/mads/user_interface.cpp @@ -22,7 +22,7 @@  #include "common/scummsys.h"  #include "mads/mads.h" -#include "mads/graphics.h" +#include "mads/screen.h"  #include "mads/user_interface.h"  #include "mads/msurface.h" | 
