[Scummvm-cvs-logs] scummvm master -> 34d00f59365cf05a8817ade955a6440ab3019860

bluegr md5 at scummvm.org
Thu Jul 26 10:07:28 CEST 2012


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

Summary:
c0beaf2337 SCI: Differentiate between screen width and pitch
34d00f5936 SCI: Add some debug code to op_line


Commit: c0beaf2337bdadc8b18425c9a38182ba30910174
    https://github.com/scummvm/scummvm/commit/c0beaf2337bdadc8b18425c9a38182ba30910174
Author: Filippos Karapetis (md5 at scummvm.org)
Date: 2012-07-26T01:06:51-07:00

Commit Message:
SCI: Differentiate between screen width and pitch

This properly addresses the odd screen width (630) in Phantasmagoria 1

Changed paths:
    engines/sci/graphics/frameout.cpp
    engines/sci/graphics/screen.cpp
    engines/sci/graphics/screen.h



diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp
index fedae2e..0098728 100644
--- a/engines/sci/graphics/frameout.cpp
+++ b/engines/sci/graphics/frameout.cpp
@@ -125,23 +125,17 @@ void GfxFrameout::kernelAddPlane(reg_t object) {
 	if (_planes.empty()) {
 		// There has to be another way for sierra sci to do this or maybe script resolution is compiled into
 		//  interpreter (TODO)
-		uint16 tmpRunningWidth = readSelectorValue(_segMan, object, SELECTOR(resX));
-		uint16 tmpRunningHeight = readSelectorValue(_segMan, object, SELECTOR(resY));
+		uint16 scriptWidth = readSelectorValue(_segMan, object, SELECTOR(resX));
+		uint16 scriptHeight = readSelectorValue(_segMan, object, SELECTOR(resY));
 
-		// The above can be 0 in SCI3 (e.g. Phantasmagoria 2)
-		if (tmpRunningWidth == 0 && tmpRunningHeight == 0) {
-			tmpRunningWidth = 320;
-			tmpRunningHeight = 200;
-		}
-		
-		// HACK: Phantasmagoria 1 sets a window size of 630x450.
-		// We can't set a width of 630, as that messes up the pitch, so we hack
-		// the internal script width here
-		if (g_sci->getGameId() == GID_PHANTASMAGORIA) {
-			tmpRunningWidth = 325;
+		// Phantasmagoria 2 doesn't specify a script width/height
+		if (g_sci->getGameId() == GID_PHANTASMAGORIA2) {
+			scriptWidth = 640;
+			scriptHeight = 480;
 		}
 
-		_coordAdjuster->setScriptsResolution(tmpRunningWidth, tmpRunningHeight);
+		assert(scriptWidth > 0 && scriptHeight > 0);
+		_coordAdjuster->setScriptsResolution(scriptWidth, scriptHeight);
 	}
 
 	// Import of QfG character files dialog is shown in QFG4.
@@ -704,13 +698,13 @@ void GfxFrameout::kernelFrameout() {
 					// TODO: maybe we should clip the cels rect with this, i'm not sure
 					//  the only currently known usage is game menu of gk1
 				} else if (view) {
-						if ((itemEntry->scaleX == 128) && (itemEntry->scaleY == 128))
-							view->getCelRect(itemEntry->loopNo, itemEntry->celNo,
-								itemEntry->x, itemEntry->y, itemEntry->z, itemEntry->celRect);
-						else
-							view->getCelScaledRect(itemEntry->loopNo, itemEntry->celNo, 
-								itemEntry->x, itemEntry->y, itemEntry->z, itemEntry->scaleX,
-								itemEntry->scaleY, itemEntry->celRect);
+					if ((itemEntry->scaleX == 128) && (itemEntry->scaleY == 128))
+						view->getCelRect(itemEntry->loopNo, itemEntry->celNo,
+							itemEntry->x, itemEntry->y, itemEntry->z, itemEntry->celRect);
+					else
+						view->getCelScaledRect(itemEntry->loopNo, itemEntry->celNo, 
+							itemEntry->x, itemEntry->y, itemEntry->z, itemEntry->scaleX,
+							itemEntry->scaleY, itemEntry->celRect);
 
 					Common::Rect nsRect = itemEntry->celRect;
 					// Translate back to actual coordinate within scrollable plane
diff --git a/engines/sci/graphics/screen.cpp b/engines/sci/graphics/screen.cpp
index 3030fb4..246b6bf 100644
--- a/engines/sci/graphics/screen.cpp
+++ b/engines/sci/graphics/screen.cpp
@@ -53,23 +53,35 @@ GfxScreen::GfxScreen(ResourceManager *resMan) : _resMan(resMan) {
 
 #ifdef ENABLE_SCI32
 	// GK1 Mac uses a 640x480 resolution too
-	if (g_sci->getGameId() == GID_GK1 && g_sci->getPlatform() == Common::kPlatformMacintosh)
-		_upscaledHires = GFX_SCREEN_UPSCALED_640x480;
+	if (g_sci->getPlatform() == Common::kPlatformMacintosh) {
+		if (g_sci->getGameId() == GID_GK1)
+			_upscaledHires = GFX_SCREEN_UPSCALED_640x480;
+	}
 #endif
 
 	if (_resMan->detectHires()) {
 		_width = 640;
+		_pitch = 640;
 		_height = 480;
 	} else {
 		_width = 320;
+		_pitch = 320;
 		_height = getLowResScreenHeight();
 	}
 
+#ifdef ENABLE_SCI32
+	// Phantasmagoria 1 sets a window area of 630x450
+	if (g_sci->getGameId() == GID_PHANTASMAGORIA) {
+		_width = 630;
+		_height = 450;
+	}
+#endif
+
 	// Japanese versions of games use hi-res font on upscaled version of the game.
 	if ((g_sci->getLanguage() == Common::JA_JPN) && (getSciVersion() <= SCI_VERSION_1_1))
 		_upscaledHires = GFX_SCREEN_UPSCALED_640x400;
 
-	_pixels = _width * _height;
+	_pixels = _pitch * _height;
 
 	switch (_upscaledHires) {
 	case GFX_SCREEN_UPSCALED_640x400:
@@ -91,19 +103,12 @@ GfxScreen::GfxScreen(ResourceManager *resMan) : _resMan(resMan) {
 			_upscaledMapping[i] = (i * 12) / 5;
 		break;
 	default:
-		_displayWidth = _width;
+		_displayWidth = _pitch;
 		_displayHeight = _height;
 		memset(&_upscaledMapping, 0, sizeof(_upscaledMapping) );
 		break;
 	}
 
-	// Phantasmagoria 1 sets a window area of 630x450
-	if (g_sci->getGameId() == GID_PHANTASMAGORIA) {
-		// TODO: Also set width to 630 (can't be set right now, as it messes up
-		// the pitch). For now, a hack has been placed in GfxFrameout::kernelAddPlane()
-		_height = 450;
-	}
-
 	_displayPixels = _displayWidth * _displayHeight;
 	_visualScreen = (byte *)calloc(_pixels, 1);
 	_priorityScreen = (byte *)calloc(_pixels, 1);
@@ -214,7 +219,7 @@ byte GfxScreen::getDrawingMask(byte color, byte prio, byte control) {
 }
 
 void GfxScreen::putPixel(int x, int y, byte drawMask, byte color, byte priority, byte control) {
-	int offset = y * _width + x;
+	int offset = y * _pitch + x;
 
 	if (drawMask & GFX_SCREEN_MASK_VISUAL) {
 		_visualScreen[offset] = color;
@@ -247,7 +252,7 @@ void GfxScreen::putFontPixel(int startingY, int x, int y, byte color) {
 		// Do not scale ourselves, but put it on the display directly
 		putPixelOnDisplay(x, y + startingY, color);
 	} else {
-		int offset = (startingY + y) * _width + x;
+		int offset = (startingY + y) * _pitch + x;
 
 		_visualScreen[offset] = color;
 		if (!_upscaledHires) {
@@ -349,19 +354,19 @@ void GfxScreen::putKanjiChar(Graphics::FontSJIS *commonFont, int16 x, int16 y, u
 }
 
 byte GfxScreen::getVisual(int x, int y) {
-	return _visualScreen[y * _width + x];
+	return _visualScreen[y * _pitch + x];
 }
 
 byte GfxScreen::getPriority(int x, int y) {
-	return _priorityScreen[y * _width + x];
+	return _priorityScreen[y * _pitch + x];
 }
 
 byte GfxScreen::getControl(int x, int y) {
-	return _controlScreen[y * _width + x];
+	return _controlScreen[y * _pitch + x];
 }
 
 byte GfxScreen::isFillMatch(int16 x, int16 y, byte screenMask, byte t_color, byte t_pri, byte t_con, bool isEGA) {
-	int offset = y * _width + x;
+	int offset = y * _pitch + x;
 	byte match = 0;
 
 	if (screenMask & GFX_SCREEN_MASK_VISUAL) {
@@ -422,14 +427,14 @@ void GfxScreen::bitsSave(Common::Rect rect, byte mask, byte *memoryPtr) {
 	memcpy(memoryPtr, (void *)&mask, sizeof(mask)); memoryPtr += sizeof(mask);
 
 	if (mask & GFX_SCREEN_MASK_VISUAL) {
-		bitsSaveScreen(rect, _visualScreen, _width, memoryPtr);
+		bitsSaveScreen(rect, _visualScreen, _pitch, memoryPtr);
 		bitsSaveDisplayScreen(rect, memoryPtr);
 	}
 	if (mask & GFX_SCREEN_MASK_PRIORITY) {
-		bitsSaveScreen(rect, _priorityScreen, _width, memoryPtr);
+		bitsSaveScreen(rect, _priorityScreen, _pitch, memoryPtr);
 	}
 	if (mask & GFX_SCREEN_MASK_CONTROL) {
-		bitsSaveScreen(rect, _controlScreen, _width, memoryPtr);
+		bitsSaveScreen(rect, _controlScreen, _pitch, memoryPtr);
 	}
 	if (mask & GFX_SCREEN_MASK_DISPLAY) {
 		if (!_upscaledHires)
@@ -482,14 +487,14 @@ void GfxScreen::bitsRestore(byte *memoryPtr) {
 	memcpy((void *)&mask, memoryPtr, sizeof(mask)); memoryPtr += sizeof(mask);
 
 	if (mask & GFX_SCREEN_MASK_VISUAL) {
-		bitsRestoreScreen(rect, memoryPtr, _visualScreen, _width);
+		bitsRestoreScreen(rect, memoryPtr, _visualScreen, _pitch);
 		bitsRestoreDisplayScreen(rect, memoryPtr);
 	}
 	if (mask & GFX_SCREEN_MASK_PRIORITY) {
-		bitsRestoreScreen(rect, memoryPtr, _priorityScreen, _width);
+		bitsRestoreScreen(rect, memoryPtr, _priorityScreen, _pitch);
 	}
 	if (mask & GFX_SCREEN_MASK_CONTROL) {
-		bitsRestoreScreen(rect, memoryPtr, _controlScreen, _width);
+		bitsRestoreScreen(rect, memoryPtr, _controlScreen, _pitch);
 	}
 	if (mask & GFX_SCREEN_MASK_DISPLAY) {
 		if (!_upscaledHires)
@@ -567,7 +572,7 @@ void GfxScreen::dither(bool addToFlag) {
 	if (!_unditheringEnabled) {
 		// Do dithering on visual and display-screen
 		for (y = 0; y < _height; y++) {
-			for (x = 0; x < _width; x++) {
+			for (x = 0; x < _pitch; x++) {
 				color = *visualPtr;
 				if (color & 0xF0) {
 					color ^= color << 4;
@@ -592,7 +597,7 @@ void GfxScreen::dither(bool addToFlag) {
 			memset(&_ditheredPicColors, 0, sizeof(_ditheredPicColors));
 		// Do dithering on visual screen and put decoded but undithered byte onto display-screen
 		for (y = 0; y < _height; y++) {
-			for (x = 0; x < _width; x++) {
+			for (x = 0; x < _pitch; x++) {
 				color = *visualPtr;
 				if (color & 0xF0) {
 					color ^= color << 4;
diff --git a/engines/sci/graphics/screen.h b/engines/sci/graphics/screen.h
index 73ea596..01fb899 100644
--- a/engines/sci/graphics/screen.h
+++ b/engines/sci/graphics/screen.h
@@ -132,6 +132,7 @@ public:
 
 private:
 	uint16 _width;
+	uint16 _pitch;
 	uint16 _height;
 	uint _pixels;
 	uint16 _displayWidth;


Commit: 34d00f59365cf05a8817ade955a6440ab3019860
    https://github.com/scummvm/scummvm/commit/34d00f59365cf05a8817ade955a6440ab3019860
Author: Filippos Karapetis (md5 at scummvm.org)
Date: 2012-07-26T01:06:52-07:00

Commit Message:
SCI: Add some debug code to op_line

Changed paths:
    engines/sci/engine/vm.cpp



diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp
index 5a2a39d..3f43966 100644
--- a/engines/sci/engine/vm.cpp
+++ b/engines/sci/engine/vm.cpp
@@ -1173,6 +1173,7 @@ void run_vm(EngineState *s) {
 
 		case op_line: // 0x3f (63)
 			// Debug opcode (line number)
+			//debug("Script %d, line %d", scr->getScriptNumber(), opparams[0]);
 			break;
 
 		case op_lag: // 0x40 (64)






More information about the Scummvm-git-logs mailing list