[Scummvm-cvs-logs] CVS: scummvm/bs2/driver palette.cpp,1.10,1.11 palette.h,1.2,1.3 rdwin.cpp,1.14,1.15

Torbj?rn Andersson eriktorbjorn at users.sourceforge.net
Sun Aug 24 23:16:18 CEST 2003


Update of /cvsroot/scummvm/scummvm/bs2/driver
In directory sc8-pr-cvs1:/tmp/cvs-serv10673/driver

Modified Files:
	palette.cpp palette.h rdwin.cpp 
Log Message:
FadeServer() is now called from ServiceWindows(), thus eliminating the need
for the making it a timer handler. This should eliminate the occasional
glitches I've been seeing with fades not being completed.

I'm also hoping that it will fix the problem where the game would sometimes
hang when moving between rooms. I know that at least once when I had that
happen to me the game was busy-waiting for the palette to fade.

At the very least, it's one place less to worry about thread-safety in.


Index: palette.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/bs2/driver/palette.cpp,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -d -r1.10 -r1.11
--- palette.cpp	23 Aug 2003 14:42:37 -0000	1.10
+++ palette.cpp	25 Aug 2003 06:13:28 -0000	1.11
@@ -320,8 +320,6 @@
 {
 	debug(0, "BS2_SetPalette(%d, %d, %d)", startEntry, noEntries, fadeNow);
 
-	StackLock lock(g_sword2->_paletteMutex);
-
 	if (noEntries == 0) {
 		RestorePalette();
 		return RD_OK;
@@ -421,122 +419,55 @@
 	return(fadeStatus);
 }
 
-
-void FadeServer(void *)
-
-{
+void FadeServer() {
+	static int32 previousTime = 0;
+	const byte *newPalette = (const byte *) fadePalette;
 	int32 currentTime;
 	int16 fadeMultiplier;
 	int16 i;
 
-	StackLock lock(g_sword2->_paletteMutex);
-	
-	switch (fadeStatus) {
-		case RDFADE_UP:
-			currentTime = SVM_timeGetTime();
-			if (currentTime >= fadeStartTime + fadeTotalTime) {
-				fadeStatus = RDFADE_NONE;
-				g_system->set_palette((const byte *) palCopy, 0, 256);
-			} else {
-				fadeMultiplier = (int16) (((int32) (currentTime - fadeStartTime) * 256) / fadeTotalTime);
-				for (i=0; i<256; i++) {
-					fadePalette[i][0] = (palCopy[i][0] * fadeMultiplier) >> 8;
-					fadePalette[i][1] = (palCopy[i][1] * fadeMultiplier) >> 8;
-					fadePalette[i][2] = (palCopy[i][2] * fadeMultiplier) >> 8;
-				}
-				g_system->set_palette((const byte *) fadePalette, 0, 256);
-			}
-			break;
-
-		case RDFADE_DOWN:
-			currentTime = SVM_timeGetTime();
-			if (currentTime >= fadeStartTime + fadeTotalTime) {
-				memset(fadePalette, 0, sizeof(fadePalette));
-				fadeStatus = RDFADE_BLACK;
-			} else {
-				fadeMultiplier = (int16) (((int32) (fadeTotalTime - (currentTime - fadeStartTime)) * 256) / fadeTotalTime);
-				for (i=0; i<256; i++) {
-					fadePalette[i][0] = (palCopy[i][0] * fadeMultiplier) >> 8;
-					fadePalette[i][1] = (palCopy[i][1] * fadeMultiplier) >> 8;
-					fadePalette[i][2] = (palCopy[i][2] * fadeMultiplier) >> 8;
-				}
-			}
-			g_system->set_palette((const byte *) fadePalette, 0, 256);
-			break;
-		}
-
-
-/*
-	int32 currentTime;
-	int16 fadeMultiplier;
-	int16 i;
-	HRESULT hr;
+	// This used to be called through a timer, but is now called from
+	// ServiceWindows() instead, since that's the only place where we
+	// actually update the screen.
 
+	// If we're not in the process of fading, do nothing.
+	if (fadeStatus != RDFADE_UP && fadeStatus != RDFADE_DOWN)
+		return;
 
-	if (lpPalette == NULL)
+	// I don't know if this is necessary, but let's limit how often the
+	// palette is updated, just to be safe.
+	currentTime = SVM_timeGetTime();
+	if (currentTime - previousTime <= 25)
 		return;
 
-	if (fadeStatus)
-	{
-		if (fadeStatus == RDFADE_UP)
-		{
-			currentTime = timeGetTime();
-			if (currentTime >= fadeStartTime + fadeTotalTime)
-			{
-				fadeStatus = RDFADE_NONE;
-				if (bFullScreen)
-					hr = IDirectDrawPalette_SetEntries(lpPalette, 0, 0, 256, (LPPALETTEENTRY) &palCopy[0][0]);
-				else
-					hr = IDirectDrawPalette_SetEntries(lpPalette, 0, 10, 236, (LPPALETTEENTRY) &palCopy[10][0]);
-			}
-			else
-			{
-				fadeMultiplier = (int16) (((int32) (currentTime - fadeStartTime) * 256) / fadeTotalTime);
-				for (i=0; i<256; i++)
-				{
-					fadePalette[i][0] = (palCopy[i][0] * fadeMultiplier) >> 8;
-					fadePalette[i][1] = (palCopy[i][1] * fadeMultiplier) >> 8;
-					fadePalette[i][2] = (palCopy[i][2] * fadeMultiplier) >> 8;
-				}
-				if (bFullScreen)
-					hr = IDirectDrawPalette_SetEntries(lpPalette, 0, 0, 256, (LPPALETTEENTRY) &fadePalette[0][0]);
-				else
-					hr = IDirectDrawPalette_SetEntries(lpPalette, 0, 10, 236, (LPPALETTEENTRY) &fadePalette[10][0]);
+	previousTime = currentTime;
+
+	if (fadeStatus == RDFADE_UP) {
+		if (currentTime >= fadeStartTime + fadeTotalTime) {
+			fadeStatus = RDFADE_NONE;
+			newPalette = (const byte *) palCopy;
+		} else {
+			fadeMultiplier = (int16) (((int32) (currentTime - fadeStartTime) * 256) / fadeTotalTime);
+			for (i = 0; i < 256; i++) {
+				fadePalette[i][0] = (palCopy[i][0] * fadeMultiplier) >> 8;
+				fadePalette[i][1] = (palCopy[i][1] * fadeMultiplier) >> 8;
+				fadePalette[i][2] = (palCopy[i][2] * fadeMultiplier) >> 8;
 			}
 		}
-		else if (fadeStatus == RDFADE_DOWN)
-		{
-			currentTime = timeGetTime();
-			if (currentTime >= fadeStartTime + fadeTotalTime)
-			{
-				for (i=0; i<256; i++)
-				{
-					fadePalette[i][0] = 0;
-					fadePalette[i][1] = 0;
-					fadePalette[i][2] = 0;
-				}
-				fadeStatus = RDFADE_BLACK;
-				if (bFullScreen)
-					hr = IDirectDrawPalette_SetEntries(lpPalette, 0, 0, 256, (LPPALETTEENTRY) &fadePalette[0][0]);
-				else
-					hr = IDirectDrawPalette_SetEntries(lpPalette, 0, 10, 236, (LPPALETTEENTRY) &fadePalette[10][0]);
-			}
-			else
-			{
-				fadeMultiplier = (int16) (((int32) (fadeTotalTime - (currentTime - fadeStartTime)) * 256) / fadeTotalTime);
-				for (i=0; i<256; i++)
-				{
-					fadePalette[i][0] = (palCopy[i][0] * fadeMultiplier) >> 8;
-					fadePalette[i][1] = (palCopy[i][1] * fadeMultiplier) >> 8;
-					fadePalette[i][2] = (palCopy[i][2] * fadeMultiplier) >> 8;
-				}
-				if (bFullScreen)
-					hr = IDirectDrawPalette_SetEntries(lpPalette, 0, 0, 256, (LPPALETTEENTRY) &fadePalette[0][0]);
-				else
-					hr = IDirectDrawPalette_SetEntries(lpPalette, 0, 10, 236, (LPPALETTEENTRY) &fadePalette[10][0]);
+	} else {
+		if (currentTime >= fadeStartTime + fadeTotalTime) {
+			fadeStatus = RDFADE_BLACK;
+			memset(fadePalette, 0, sizeof(fadePalette));
+		} else {
+			fadeMultiplier = (int16) (((int32) (fadeTotalTime - (currentTime - fadeStartTime)) * 256) / fadeTotalTime);
+			for (i = 0; i < 256; i++) {
+				fadePalette[i][0] = (palCopy[i][0] * fadeMultiplier) >> 8;
+				fadePalette[i][1] = (palCopy[i][1] * fadeMultiplier) >> 8;
+				fadePalette[i][2] = (palCopy[i][2] * fadeMultiplier) >> 8;
 			}
 		}
 	}
-*/
+
+	g_system->set_palette(newPalette, 0, 256);
 }
 

Index: palette.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/bs2/driver/palette.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- palette.h	31 Jul 2003 14:51:02 -0000	1.2
+++ palette.h	25 Aug 2003 06:13:28 -0000	1.3
@@ -59,7 +59,7 @@
 extern uint8 paletteMatch[64*64*64];
 
 extern int32 RestorePalette(void);
-extern void FadeServer(void *);
+extern void FadeServer();
 
 
 #endif

Index: rdwin.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/bs2/driver/rdwin.cpp,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- rdwin.cpp	24 Aug 2003 13:18:19 -0000	1.14
+++ rdwin.cpp	25 Aug 2003 06:13:28 -0000	1.15
@@ -543,6 +543,7 @@
 
 {
 	g_sword2->parseEvents();
+	FadeServer();
 	g_sword2->_system->update_screen();
 //	warning("stub ServiceWindows");  // too noisy
 /*





More information about the Scummvm-git-logs mailing list