[Scummvm-cvs-logs] CVS: scummvm/scumm gfx.cpp,2.134,2.135

Max Horn fingolfin at users.sourceforge.net
Sun Jun 1 17:36:01 CEST 2003


Update of /cvsroot/scummvm/scummvm/scumm
In directory sc8-pr-cvs1:/tmp/cvs-serv24467

Modified Files:
	gfx.cpp 
Log Message:
cleanup color cyclcing code; also perform color cycling on 'indirect' palettes like the shadow palette(s) (bug #706721)

Index: gfx.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/gfx.cpp,v
retrieving revision 2.134
retrieving revision 2.135
diff -u -d -r2.134 -r2.135
--- gfx.cpp	1 Jun 2003 17:29:45 -0000	2.134
+++ gfx.cpp	2 Jun 2003 00:34:58 -0000	2.135
@@ -2420,12 +2420,55 @@
 		cycl->delay = 0;
 }
 
+/**
+ * Cycle the colors in the given palette in the intervael [cycleStart, cycleEnd]
+ * either one step forward or backward.
+ */
+static void cyclePalette(byte *palette, int cycleStart, int cycleEnd, int size, bool forward) {
+	byte *start = palette + cycleStart * size;
+	byte *end = palette + cycleEnd * size;
+	int num = cycleEnd - cycleStart;
+	byte tmp[6];
+	
+	assert(size <= 6);
+	
+	if (forward) {
+		memmove(tmp, end, size);
+		memmove(start + size, start, num * size);
+		memmove(start, tmp, size);
+	} else {
+		memmove(tmp, start, size);
+		memmove(start, start + size, num * size);
+		memmove(end, tmp, size);
+	}
+}
+
+/**
+ * Adjust an 'indirect' color palette for the color cycling performed on its master
+ * palette. An indirect palette is a palette which contains indices pointing into
+ * another palette - it provides a level of indirection to map palette colors to
+ * other colors. Now when the target palette is cycled, the indirect palette suddenly
+ * point at the wrong color(s). This function takes care of adjusting an indirect
+ * palette by searching through it and replacing all indices that are in the
+ * cycle range by the new (cycled) index.
+ */
+static void cycleIndirectPalette(byte *palette, int cycleStart, int cycleEnd, bool forward) {
+	int num = cycleEnd - cycleStart + 1;
+	int i;
+	int offset = forward ? 1 : num - 1;
+	
+	for (i = 0; i < 256; i++) {
+		if (cycleStart <= palette[i] && palette[i] <= cycleEnd) {
+			palette[i] = (palette[i] - cycleStart + offset) % num + cycleStart;
+		}
+	}
+}
+
+
 void Scumm::cyclePalette() {
 	ColorCycle *cycl;
 	int valueToAdd;
-	int i, num;
-	byte *start, *end;
-	byte tmp[3];
+	int i, j;
 
 	if (VAR_TIMER == 0xFF) {
 		// FIXME - no idea if this is right :-/
@@ -2441,26 +2484,29 @@
 		return;
 
 	for (i = 0, cycl = _colorCycle; i < 16; i++, cycl++) {
-		if (cycl->delay && (cycl->counter += valueToAdd) >= cycl->delay) {
-			do {
-				cycl->counter -= cycl->delay;
-			} while (cycl->delay <= cycl->counter);
+		if (!cycl->delay || cycl->start > cycl->end)
+			continue;
+		cycl->counter += valueToAdd;
+		if (cycl->counter >= cycl->delay) {
+			cycl->counter %= cycl->delay;
 
 			setDirtyColors(cycl->start, cycl->end);
 			moveMemInPalRes(cycl->start, cycl->end, cycl->flags & 2);
-			start = &_currentPalette[cycl->start * 3];
-			end = &_currentPalette[cycl->end * 3];
 
-			num = cycl->end - cycl->start;
+			::cyclePalette(_currentPalette, cycl->start, cycl->end, 3, !(cycl->flags & 2));
 
-			if (!(cycl->flags & 2)) {
-				memmove(tmp, end, 3);
-				memmove(start + 3, start, num * 3);
-				memmove(start, tmp, 3);
-			} else {
-				memmove(tmp, start, 3);
-				memmove(start, start + 3, num * 3);
-				memmove(end, tmp, 3);
+			// Also cycle the other, indirect palettes
+			if (_proc_special_palette) {
+				::cycleIndirectPalette(_proc_special_palette, cycl->start, cycl->end, !(cycl->flags & 2));
+			}
+			
+			if (_shadowPalette) {
+				if (_features & GF_AFTER_V7) {
+					for (j = 0; j < NUM_SHADOW_PALETTE; j++)
+						::cycleIndirectPalette(_shadowPalette + j * 256, cycl->start, cycl->end, !(cycl->flags & 2));
+				} else {
+					::cycleIndirectPalette(_shadowPalette, cycl->start, cycl->end, !(cycl->flags & 2));
+				}
 			}
 		}
 	}
@@ -2471,40 +2517,11 @@
  * color cycling will be disturbed by the palette fade.
  */
 void Scumm::moveMemInPalRes(int start, int end, byte direction) {
-	byte *startptr, *endptr;
-	byte *startptr2, *endptr2;
-	int num;
-	byte tmp[6];
-
 	if (!_palManipCounter)
 		return;
 
-	startptr = _palManipPalette + start * 3;
-	endptr = _palManipPalette + end * 3;
-	startptr2 = _palManipIntermediatePal + start * 6;
-	endptr2 = _palManipIntermediatePal + end * 6;
-	num = end - start;
-
-	if (!endptr) {
-		warning("moveMemInPalRes(%d,%d): Bad end pointer", start, end);
-		return;
-	}
-
-	if (!direction) {
-		memmove(tmp, endptr, 3);
-		memmove(startptr + 3, startptr, num * 3);
-		memmove(startptr, tmp, 3);
-		memmove(tmp, endptr2, 6);
-		memmove(startptr2 + 6, startptr2, num * 6);
-		memmove(startptr2, tmp, 6);
-	} else {
-		memmove(tmp, startptr, 3);
-		memmove(startptr, startptr + 3, num * 3);
-		memmove(endptr, tmp, 3);
-		memmove(tmp, startptr2, 6);
-		memmove(startptr2, startptr2 + 6, num * 6);
-		memmove(endptr2, tmp, 6);
-	}
+	::cyclePalette(_palManipPalette, start, end, 3, !direction);
+	::cyclePalette(_palManipIntermediatePal, start, end, 6, !direction);
 }
 
 void Scumm::palManipulateInit(int start, int end, int string_id, int time) {
@@ -2584,7 +2601,7 @@
 	int i;
 	byte *curpal;
 
-	if (slot < 0 || slot > 7)
+	if (slot < 0 || slot >= NUM_SHADOW_PALETTE)
 		error("setupShadowPalette: invalid slot %d", slot);
 
 	if (startColor < 0 || startColor > 255 || endColor < 0 || startColor > 255 || endColor < startColor)





More information about the Scummvm-git-logs mailing list