[Scummvm-cvs-logs] SF.net SVN: scummvm:[50099] scummvm/trunk/engines/sci/graphics

m_kiewitz at users.sourceforge.net m_kiewitz at users.sourceforge.net
Sun Jun 20 22:52:31 CEST 2010


Revision: 50099
          http://scummvm.svn.sourceforge.net/scummvm/?rev=50099&view=rev
Author:   m_kiewitz
Date:     2010-06-20 20:52:31 +0000 (Sun, 20 Jun 2010)

Log Message:
-----------
SCI: properly implement kPalVary functionality within kDrawPic and transitions, so pharkas finally works w/o palette corruption

Modified Paths:
--------------
    scummvm/trunk/engines/sci/graphics/frameout.cpp
    scummvm/trunk/engines/sci/graphics/paint16.cpp
    scummvm/trunk/engines/sci/graphics/palette.cpp
    scummvm/trunk/engines/sci/graphics/palette.h
    scummvm/trunk/engines/sci/graphics/transitions.cpp

Modified: scummvm/trunk/engines/sci/graphics/frameout.cpp
===================================================================
--- scummvm/trunk/engines/sci/graphics/frameout.cpp	2010-06-20 20:36:14 UTC (rev 50098)
+++ scummvm/trunk/engines/sci/graphics/frameout.cpp	2010-06-20 20:52:31 UTC (rev 50099)
@@ -161,7 +161,7 @@
 			planePictureCels = planePicture->getSci32celCount();
 
 			_coordAdjuster->pictureSetDisplayArea(planeRect);
-			_palette->increaseSysTimestamp();
+			_palette->drewPicture(planePictureNr);
 		}
 
 		// Fill our itemlist for this plane

Modified: scummvm/trunk/engines/sci/graphics/paint16.cpp
===================================================================
--- scummvm/trunk/engines/sci/graphics/paint16.cpp	2010-06-20 20:36:14 UTC (rev 50098)
+++ scummvm/trunk/engines/sci/graphics/paint16.cpp	2010-06-20 20:52:31 UTC (rev 50099)
@@ -76,9 +76,10 @@
 	picture->draw(animationNr, mirroredFlag, addToFlag, paletteId);
 	delete picture;
 
-	// We update our sys palette timestamp here (SCI1.1 only)
+	// We make a call to SciPalette here, for increasing sys timestamp and also loading targetpalette, if palvary active
+	//  (SCI1.1 only)
 	if (getSciVersion() == SCI_VERSION_1_1)
-		_palette->increaseSysTimestamp();
+		_palette->drewPicture(pictureId);
 }
 
 // This one is the only one that updates screen!

Modified: scummvm/trunk/engines/sci/graphics/palette.cpp
===================================================================
--- scummvm/trunk/engines/sci/graphics/palette.cpp	2010-06-20 20:36:14 UTC (rev 50098)
+++ scummvm/trunk/engines/sci/graphics/palette.cpp	2010-06-20 20:52:31 UTC (rev 50099)
@@ -212,13 +212,16 @@
 void GfxPalette::set(Palette *newPalette, bool force, bool forceRealMerge) {
 	uint32 systime = _sysPalette.timestamp;
 
-	// Pal-Vary is taking place -> abort merge
-	if (_palVaryResourceId != -1)
-		return;
-
 	if (force || newPalette->timestamp != systime) {
 		_sysPaletteChanged |= merge(newPalette, force, forceRealMerge);
 		newPalette->timestamp = _sysPalette.timestamp;
+
+		if (_palVaryResourceId != -1) {
+			// Pal-vary currently active, we don't set at any time, but also insert into origin palette
+			insert(newPalette, &_palVaryOriginPalette);
+			return;
+		}
+
 		if (_sysPaletteChanged && _screen->_picNotValid == 0) { // && systime != _sysPalette.timestamp) {
 			// Removed timestamp checking, because this shouldnt be needed anymore. I'm leaving it commented just in
 			//  case this causes regressions
@@ -228,6 +231,24 @@
 	}
 }
 
+bool GfxPalette::insert(Palette *newPalette, Palette *destPalette) {
+	bool paletteChanged = false;
+
+	for (int i = 1; i < 255; i++) {
+		if (newPalette->colors[i].used) {
+			if ((newPalette->colors[i].r != destPalette->colors[i].r) || (newPalette->colors[i].g != destPalette->colors[i].g) || (newPalette->colors[i].b != destPalette->colors[i].b)) {
+				destPalette->colors[i].r = newPalette->colors[i].r;
+				destPalette->colors[i].g = newPalette->colors[i].g;
+				destPalette->colors[i].b = newPalette->colors[i].b;
+				paletteChanged = true;
+			}
+			destPalette->colors[i].used = newPalette->colors[i].used;
+			newPalette->mapping[i] = i;
+		}
+	}
+	return paletteChanged;
+}
+
 bool GfxPalette::merge(Palette *newPalette, bool force, bool forceRealMerge) {
 	uint16 res;
 	int i,j;
@@ -236,20 +257,9 @@
 	if ((!forceRealMerge) && (!_alwaysForceRealMerge) && (getSciVersion() >= SCI_VERSION_1_1)) {
 		// SCI1.1+ doesnt do real merging anymore, but simply copying over the used colors from other palettes
 		//  There are some games with inbetween SCI1.1 interpreters, use real merging for them (e.g. laura bow 2 demo)
-		for (i = 1; i < 255; i++) {
-			if (newPalette->colors[i].used) {
-				if ((newPalette->colors[i].r != _sysPalette.colors[i].r) || (newPalette->colors[i].g != _sysPalette.colors[i].g) || (newPalette->colors[i].b != _sysPalette.colors[i].b)) {
-					_sysPalette.colors[i].r = newPalette->colors[i].r;
-					_sysPalette.colors[i].g = newPalette->colors[i].g;
-					_sysPalette.colors[i].b = newPalette->colors[i].b;
-					paletteChanged = true;
-				}
-				_sysPalette.colors[i].used = newPalette->colors[i].used;
-				newPalette->mapping[i] = i;
-			}
-		}
+
 		// We don't update the timestamp for SCI1.1, it's only updated on kDrawPic calls
-		return paletteChanged;
+		return insert(newPalette, &_sysPalette);
 
 	} else {
 		// colors 0 (black) and 255 (white) are not affected by merging
@@ -305,10 +315,15 @@
 	return paletteChanged;
 }
 
-// This is used for SCI1.1 and called from kDrawPic. We only update sysPalette timestamp this way for SCI1.1
-void GfxPalette::increaseSysTimestamp() {
+// This is called for SCI1.1, when kDrawPic got done. We update sysPalette timestamp this way for SCI1.1 and also load
+//  target-palette, if palvary is active
+void GfxPalette::drewPicture(GuiResourceId pictureId) {
 	if (!_alwaysForceRealMerge) // Don't do this on inbetween SCI1.1 games
 		_sysPalette.timestamp++;
+
+	if (_palVaryResourceId != -1) {
+		palVaryLoadTargetPalette(pictureId);
+	}
 }
 
 uint16 GfxPalette::matchColor(byte r, byte g, byte b) {
@@ -487,6 +502,17 @@
 	_palVaryTicks = 0;
 }
 
+bool GfxPalette::palVaryLoadTargetPalette(GuiResourceId resourceId) {
+	_palVaryResourceId = resourceId;
+	Resource *palResource = _resMan->findResource(ResourceId(kResourceTypePalette, resourceId), false);
+	if (palResource) {
+		// Load and initialize destination palette
+		createFromData(palResource->data, &_palVaryTargetPalette);
+		return true;
+	}
+	return false;
+}
+
 void GfxPalette::palVaryInstallTimer() {
 	int16 ticks = _palVaryTicks > 0 ? _palVaryTicks : 1;
 	// Call signal increase every [ticks]
@@ -497,11 +523,7 @@
 	if (_palVaryResourceId != -1)	// another palvary is taking place, return
 		return false;
 
-	_palVaryResourceId = resourceId;
-	Resource *palResource = _resMan->findResource(ResourceId(kResourceTypePalette, resourceId), false);
-	if (palResource) {
-		// Load and initialize destination palette
-		createFromData(palResource->data, &_palVaryTargetPalette);
+	if (palVaryLoadTargetPalette(resourceId)) {
 		// Save current palette
 		memcpy(&_palVaryOriginPalette, &_sysPalette, sizeof(Palette));
 
@@ -578,6 +600,13 @@
 	}
 }
 
+void GfxPalette::palVaryPrepareForTransition() {
+	if (_palVaryResourceId != -1) {
+		// Before doing transitions, we have to prepare palette
+		palVaryProcess(0, false);
+	}
+}
+
 // Processes pal vary updates
 void GfxPalette::palVaryProcess(int signal, bool setPalette) {
 	int16 stepChange = signal * _palVaryDirection;

Modified: scummvm/trunk/engines/sci/graphics/palette.h
===================================================================
--- scummvm/trunk/engines/sci/graphics/palette.h	2010-06-20 20:36:14 UTC (rev 50098)
+++ scummvm/trunk/engines/sci/graphics/palette.h	2010-06-20 20:52:31 UTC (rev 50099)
@@ -45,13 +45,14 @@
 	void modifyAmigaPalette(byte *data);
 	void setEGA();
 	void set(Palette *sciPal, bool force, bool forceRealMerge = false);
+	bool insert(Palette *newPaette, Palette *destPalette);
 	bool merge(Palette *pFrom, bool force, bool forceRealMerge);
 	uint16 matchColor(byte r, byte g, byte b);
 	void getSys(Palette *pal);
 
 	void setOnScreen();
 
-	void increaseSysTimestamp();
+	void drewPicture(GuiResourceId pictureId);
 
 	bool kernelSetFromResource(GuiResourceId resourceId, bool force);
 	void kernelSetFlag(uint16 fromColor, uint16 toColor, uint16 flag);
@@ -68,6 +69,7 @@
 	void kernelPalVaryPause(bool pause);
 	void kernelPalVaryDeinit();
 	void palVaryUpdate();
+	void palVaryPrepareForTransition();
 	void palVaryProcess(int signal, bool setPalette);
 
 	Palette _sysPalette;
@@ -75,6 +77,7 @@
 private:
 	void palVaryInit();
 	void palVaryInstallTimer();
+	bool palVaryLoadTargetPalette(GuiResourceId resourceId);
 	static void palVaryCallback(void *refCon);
 	void palVaryIncreaseSignal();
 

Modified: scummvm/trunk/engines/sci/graphics/transitions.cpp
===================================================================
--- scummvm/trunk/engines/sci/graphics/transitions.cpp	2010-06-20 20:36:14 UTC (rev 50098)
+++ scummvm/trunk/engines/sci/graphics/transitions.cpp	2010-06-20 20:52:31 UTC (rev 50099)
@@ -167,6 +167,8 @@
 		}
 	}
 
+	_palette->palVaryPrepareForTransition();
+
 	// Now we do the actual transition to the new screen
 	doTransition(_number, false);
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list