[Scummvm-cvs-logs] scummvm master -> a5528ecc7e7da65ae89bae9c9d2cabe6b4e99145

dreammaster dreammaster at scummvm.org
Sat Sep 6 22:40:45 CEST 2014


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
a5528ecc7e MADS: Fix spare screen background changes for TextView showing quotes


Commit: a5528ecc7e7da65ae89bae9c9d2cabe6b4e99145
    https://github.com/scummvm/scummvm/commit/a5528ecc7e7da65ae89bae9c9d2cabe6b4e99145
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2014-09-06T16:39:49-04:00

Commit Message:
MADS: Fix spare screen background changes for TextView showing quotes

Changed paths:
    engines/mads/nebular/menu_nebular.cpp
    engines/mads/nebular/menu_nebular.h
    engines/mads/scene_data.cpp
    engines/mads/scene_data.h



diff --git a/engines/mads/nebular/menu_nebular.cpp b/engines/mads/nebular/menu_nebular.cpp
index a217ba6..6e55b9c 100644
--- a/engines/mads/nebular/menu_nebular.cpp
+++ b/engines/mads/nebular/menu_nebular.cpp
@@ -434,7 +434,6 @@ void TextView::execute(MADSEngine *vm, const Common::String &resName) {
 TextView::TextView(MADSEngine *vm) : MenuView(vm) {
 	_animating = false;
 	_panSpeed = 0;
-	Common::fill(&_spareScreens[0], &_spareScreens[10], 0);
 	_spareScreen = nullptr;
 	_scrollCount = 0;
 	_lineY = -1;
@@ -449,7 +448,6 @@ TextView::TextView(MADSEngine *vm) : MenuView(vm) {
 }
 
 TextView::~TextView() {
-	delete _spareScreen;
 }
 
 void TextView::load() {
@@ -570,11 +568,17 @@ void TextView::processCommand() {
 		// Sets a secondary background number that can be later switched in with a PAGE command
 		paramP = commandStr + 6;
 		int spareIndex = commandStr[5] - '0';
-		if ((spareIndex >= 0) && (spareIndex <= 9)) {
-			int screenId = getParameter(&paramP);
+		assert(spareIndex < 4);
+		int screenId = getParameter(&paramP);
 
-			_spareScreens[spareIndex] = screenId;
-		}
+		// Load the spare background
+		SceneInfo *sceneInfo = SceneInfo::init(_vm);
+		sceneInfo->_width = MADS_SCREEN_WIDTH;
+		sceneInfo->_height = MADS_SCENE_HEIGHT;
+		_spareScreens[spareIndex].setSize(MADS_SCREEN_WIDTH, MADS_SCENE_HEIGHT);
+		sceneInfo->loadMadsV1Background(screenId, "", SCENEFLAG_TRANSLATE, 
+			_spareScreens[spareIndex]);
+		delete sceneInfo;
 
 	} else if (!strncmp(commandStr, "PAGE", 4)) {
 		// Signals to change to a previous specified secondary background
@@ -582,10 +586,8 @@ void TextView::processCommand() {
 		int spareIndex = getParameter(&paramP);
 
 		// Only allow background switches if one isn't currently in progress
-		if (!_spareScreen && (_spareScreens[spareIndex] != 0)) {
-			_spareScreen = new MSurface(MADS_SCREEN_WIDTH, MADS_SCREEN_HEIGHT);
-			//_spareScreen->loadBackground(_spareScreens[spareIndex], &_bgSpare);
-
+		if (!_spareScreen && _spareScreens[spareIndex].getPixels() != nullptr) {
+			_spareScreen = &_spareScreens[spareIndex];
 			_translationX = 0;
 		}
 
@@ -667,24 +669,23 @@ void TextView::doFrame() {
 	// If a screen transition is in progress and it's time for another column, handle it
 	if (_spareScreen) {
 		byte *srcP = _spareScreen->getBasePtr(_translationX, 0);
-		byte *destP = scene._backgroundSurface.getBasePtr(_translationX, 0);
+		byte *bgP = scene._backgroundSurface.getBasePtr(_translationX, 0);
+		byte *screenP = (byte *)_vm->_screen.getBasePtr(_translationX, 0);
 
-		for (int y = 0; y < MADS_SCENE_HEIGHT; ++y, srcP += _spareScreen->w,
-			destP += MADS_SCREEN_WIDTH) {
-			*destP = *srcP;
+		for (int y = 0; y < MADS_SCENE_HEIGHT; ++y, srcP += MADS_SCREEN_WIDTH,
+			bgP += MADS_SCREEN_WIDTH, screenP += MADS_SCREEN_WIDTH) {
+			*bgP = *srcP;
+			*screenP = *srcP;
 		}
 
-		if (++_translationX >= MADS_SCREEN_WIDTH) {
+		// Flag the column of the screen is modified
+		_vm->_screen.copyRectToScreen(Common::Rect(_translationX, 0,
+			_translationX + 1, MADS_SCENE_HEIGHT));
+
+		// Keep moving the column to copy to the right
+		if (++_translationX == MADS_SCREEN_WIDTH) {
 			// Surface transition is complete
-			/*
-			delete _spareScreen;
 			_spareScreen = nullptr;
-
-//			_vm->_palette->deleteRange(_bgCurrent);
-			delete _bgCurrent;
-			_bgCurrent = _bgSpare;
-			_bgSpare = nullptr;
-			*/
 		}
 	}
 
diff --git a/engines/mads/nebular/menu_nebular.h b/engines/mads/nebular/menu_nebular.h
index a22cb42..23d9fa3 100644
--- a/engines/mads/nebular/menu_nebular.h
+++ b/engines/mads/nebular/menu_nebular.h
@@ -166,7 +166,7 @@ private:
 	Common::Array<TextLine> _textLines;
 	Common::Point _pan;
 	int _panSpeed;
-	int _spareScreens[10];
+	MSurface _spareScreens[4];
 	int _scrollCount;
 	int _lineY;
 	uint32 _scrollTimeout;
diff --git a/engines/mads/scene_data.cpp b/engines/mads/scene_data.cpp
index e874468..66848ca 100644
--- a/engines/mads/scene_data.cpp
+++ b/engines/mads/scene_data.cpp
@@ -333,7 +333,7 @@ void SceneInfo::loadMadsV1Background(int sceneId, const Common::String &resName,
 
 	// Get the ART resource
 	if (sceneFlag) {
-		resourceName = Resources::formatName(RESPREFIX_RM, _artFileNum, ".ART");
+		resourceName = Resources::formatName(RESPREFIX_RM, sceneId, ".ART");
 	} else {
 		resourceName = "*" + Resources::formatResource(resName, resName);
 	}
@@ -346,9 +346,27 @@ void SceneInfo::loadMadsV1Background(int sceneId, const Common::String &resName,
 	assert(_width == bgSurface.w && _height == bgSurface.h);
 	stream = artResource.getItemStream(1);
 	stream->read(bgSurface.getPixels(), bgSurface.w * bgSurface.h);
+	delete stream;
+
+	if (flags & SCENEFLAG_TRANSLATE) {
+		// Load in the palette and translate it
+		Common::SeekableReadStream *palStream = artResource.getItemStream(0);
+		Common::Array<RGB6> palette;
+
+		palStream->skip(4);		// Skip width and height
+		int numColors = palStream->readUint16LE();
+		assert(numColors <= 252);
+		palette.resize(numColors);
+		for (int i = 0; i < numColors; ++i)
+			palette[i].load(palStream);
+		delete palStream;
+
+		// Translate the surface
+		_vm->_palette->_paletteUsage.process(palette, 0);
+		bgSurface.translate(palette);
+	}
 
 	// Close the ART file
-	delete stream;
 	artFile.close();
 }
 
diff --git a/engines/mads/scene_data.h b/engines/mads/scene_data.h
index 783a9ab..41e094b 100644
--- a/engines/mads/scene_data.h
+++ b/engines/mads/scene_data.h
@@ -55,7 +55,8 @@ class SpriteSlot;
 
 enum {
 	SCENEFLAG_DITHER		= 0x01,     // Dither to 16 colors
-	SCENEFLAG_LOAD_SHADOW	= 0x10		// Load hard shadows
+	SCENEFLAG_LOAD_SHADOW	= 0x10,		// Load hard shadows
+	SCENEFLAG_TRANSLATE		= 0x10000	// Translate palette of loaded background
 };
 
 class VerbInit {






More information about the Scummvm-git-logs mailing list