[Scummvm-cvs-logs] SF.net SVN: scummvm: [25034] scummvm/trunk/engines/kyra

vinterstum at users.sourceforge.net vinterstum at users.sourceforge.net
Sat Jan 6 18:11:09 CET 2007


Revision: 25034
          http://scummvm.svn.sourceforge.net/scummvm/?rev=25034&view=rev
Author:   vinterstum
Date:     2007-01-06 09:11:08 -0800 (Sat, 06 Jan 2007)

Log Message:
-----------
A few minor fixes and optimizations (biggest one is splitting decodeFrameDeltaPage() into two functions to avoid a high amount of conditional jumps per decided animation frame

Modified Paths:
--------------
    scummvm/trunk/engines/kyra/animator.cpp
    scummvm/trunk/engines/kyra/scene.cpp
    scummvm/trunk/engines/kyra/screen.cpp
    scummvm/trunk/engines/kyra/screen.h
    scummvm/trunk/engines/kyra/sequences_v2.cpp
    scummvm/trunk/engines/kyra/wsamovie.cpp
    scummvm/trunk/engines/kyra/wsamovie.h

Modified: scummvm/trunk/engines/kyra/animator.cpp
===================================================================
--- scummvm/trunk/engines/kyra/animator.cpp	2007-01-06 17:07:13 UTC (rev 25033)
+++ scummvm/trunk/engines/kyra/animator.cpp	2007-01-06 17:11:08 UTC (rev 25034)
@@ -677,8 +677,9 @@
 		animObj->x1 = ch->x1;
 		animObj->y1 = ch->y1;
 		
-		_brandonScaleX = _vm->_scaleTable[ch->y1];
-		_brandonScaleY = _vm->_scaleTable[ch->y1];
+		int newScale = _vm->_scaleTable[ch->y1];
+		_brandonScaleX = newScale;
+		_brandonScaleY = newScale;
 
 		animObj->x1 += (_brandonScaleX * xOffset) >> 8;
 		animObj->y1 += (_brandonScaleY * yOffset) >> 8;

Modified: scummvm/trunk/engines/kyra/scene.cpp
===================================================================
--- scummvm/trunk/engines/kyra/scene.cpp	2007-01-06 17:07:13 UTC (rev 25033)
+++ scummvm/trunk/engines/kyra/scene.cpp	2007-01-06 17:11:08 UTC (rev 25034)
@@ -147,7 +147,7 @@
 	
 	_currentRoom = sceneId;
 	
-	int tableId = _roomTable[_currentCharacter->sceneId].nameIndex;
+	int tableId = _roomTable[sceneId].nameIndex;
 	char fileNameBuffer[32];
 	strcpy(fileNameBuffer, _roomFilenameTable[tableId]);
 	strcat(fileNameBuffer, ".DAT");

Modified: scummvm/trunk/engines/kyra/screen.cpp
===================================================================
--- scummvm/trunk/engines/kyra/screen.cpp	2007-01-06 17:07:13 UTC (rev 25033)
+++ scummvm/trunk/engines/kyra/screen.cpp	2007-01-06 17:11:08 UTC (rev 25034)
@@ -1410,14 +1410,12 @@
 			break;
 		}
 		uint8 code = *src++;
-		if (!(code & 0x80)) {
-			int len = MIN(count, (code >> 4) + 3);
-			int offs = ((code & 0xF) << 8) | *src++;
+		if (!(code & 0x80)) { // 8th bit isn't set
+			int len = MIN(count, (code >> 4) + 3); //upper half of code is the length		
+			int offs = ((code & 0xF) << 8) | *src++; //lower half of code as byte 2 of offset.
 			const uint8 *dstOffs = dst - offs;
-			while (len--) {
-				*dst++ = *dstOffs++;
-			}
-		} else if (code & 0x40) {
+			memcpy(dst, dstOffs, len); dst += len;
+		} else if (code & 0x40) { // 7th bit is set
 			int len = (code & 0x3F) + 3;
 			if (code == 0xFE) {
 				len = READ_LE_UINT16(src); src += 2;
@@ -1434,15 +1432,12 @@
 					len = count;
 				}
 				const uint8 *dstOffs = dstOrig + offs;
-				while (len--) {
-					*dst++ = *dstOffs++;
-				}
+				memcpy(dst, dstOffs, len); dst += len;
 			}
-		} else if (code != 0x80) {
+		} else if (code != 0x80) { // not just the 8th bit set.
+			//Copy some bytes from source to dest.
 			int len = MIN(count, code & 0x3F);
-			while (len--) {
-				*dst++ = *src++;
-			}
+			memcpy(dst, src, len); dst += len; src += len;
 		} else {
 			break;
 		}
@@ -1492,8 +1487,8 @@
 	}
 }
 
-void Screen::decodeFrameDeltaPage(uint8 *dst, const uint8 *src, int pitch, int noXor) {
-	debugC(9, kDebugLevelScreen, "Screen::decodeFrameDeltaPage(%p, %p, %d, %d)", (const void *)dst, (const void *)src, pitch, noXor);
+void Screen::decodeFrameDeltaPage(uint8 *dst, const uint8 *src, const int pitch) {
+	debugC(9, kDebugLevelScreen, "Screen::decodeFrameDeltaPage(%p, %p, %d)", (const void *)dst, (const void *)src, pitch);
 	int count = 0;
 	uint8 *dstNext = dst;
 	while (1) {
@@ -1502,17 +1497,93 @@
 			uint8 len = *src++;
 			code = *src++;
 			while (len--) {
-				if (noXor) {
-					*dst++ = code;
+				*dst++ ^= code;
+				if (++count == pitch) {
+					count = 0;
+					dstNext += SCREEN_W;
+					dst = dstNext;
+				}
+			}
+		} else if (code & 0x80) {
+			code -= 0x80;
+			if (code != 0) {
+				dst += code;
+				
+				count += code;
+				while (count >= pitch) {
+					count -= pitch;
+					dstNext += SCREEN_W;
+					dst = dstNext + count;
+				}
+			} else {
+				uint16 subcode = READ_LE_UINT16(src); src += 2;
+				if (subcode == 0) {
+					break;
+				} else if (subcode & 0x8000) {
+					subcode -= 0x8000;
+					if (subcode & 0x4000) {
+						uint16 len = subcode - 0x4000;
+						code = *src++;
+						while (len--) {
+							*dst++ ^= code;
+							if (++count == pitch) {
+								count = 0;
+								dstNext += SCREEN_W;
+								dst = dstNext;
+							}
+						}
+					} else {
+						while (subcode--) {
+							*dst++ ^= *src++;
+							if (++count == pitch) {
+								count = 0;
+								dstNext += SCREEN_W;
+								dst = dstNext;
+							}
+						}
+					}
 				} else {
-					*dst++ ^= code;
+					dst += subcode;
+					
+					count += subcode;
+					while (count >= pitch) {
+						count -= pitch;
+						dstNext += SCREEN_W;
+						dst = dstNext + count;
+					}
+					
 				}
+			}
+		} else {
+			while (code--) {
+				*dst++ ^= *src++;
 				if (++count == pitch) {
 					count = 0;
 					dstNext += SCREEN_W;
 					dst = dstNext;
 				}
 			}
+		}
+	}
+}
+
+void Screen::decodeFrameDeltaPageNoXor(uint8 *dst, const uint8 *src, const int pitch) {
+	debugC(9, kDebugLevelScreen, "Screen::decodeFrameDeltaPageNoXor(%p, %p, %d)", (const void *)dst, (const void *)src, pitch);
+	int count = 0;
+	uint8 *dstNext = dst;
+	while (1) {
+		uint8 code = *src++;
+		if (code == 0) {
+			uint8 len = *src++;
+			code = *src++;
+			while (len--) {
+				*dst++ = code;
+				if (++count == pitch) {
+					count = 0;
+					dstNext += SCREEN_W;
+					dst = dstNext;
+				}
+			}
 		} else if (code & 0x80) {
 			code -= 0x80;
 			if (code != 0) {
@@ -1534,11 +1605,7 @@
 						uint16 len = subcode - 0x4000;
 						code = *src++;
 						while (len--) {
-							if (noXor) {
-								*dst++ = code;
-							} else {
-								*dst++ ^= code;
-							}
+							*dst++ = code;
 							if (++count == pitch) {
 								count = 0;
 								dstNext += SCREEN_W;
@@ -1547,11 +1614,7 @@
 						}
 					} else {
 						while (subcode--) {
-							if (noXor) {
-								*dst++ = *src++;
-							} else {
-								*dst++ ^= *src++;
-							}
+							*dst++ = *src++;
 							if (++count == pitch) {
 								count = 0;
 								dstNext += SCREEN_W;
@@ -1573,11 +1636,7 @@
 			}
 		} else {
 			while (code--) {
-				if (noXor) {
-					*dst++ = *src++;
-				} else {
-					*dst++ ^= *src++;
-				}
+				*dst++ = *src++;
 				if (++count == pitch) {
 					count = 0;
 					dstNext += SCREEN_W;

Modified: scummvm/trunk/engines/kyra/screen.h
===================================================================
--- scummvm/trunk/engines/kyra/screen.h	2007-01-06 17:07:13 UTC (rev 25033)
+++ scummvm/trunk/engines/kyra/screen.h	2007-01-06 17:11:08 UTC (rev 25034)
@@ -136,7 +136,9 @@
 	static void decodeFrame3(const uint8 *src, uint8 *dst, uint32 size);
 	static void decodeFrame4(const uint8 *src, uint8 *dst, uint32 dstSize);
 	static void decodeFrameDelta(uint8 *dst, const uint8 *src);
-	static void decodeFrameDeltaPage(uint8 *dst, const uint8 *src, int pitch, int noXor);
+	static void decodeFrameDeltaPage(uint8 *dst, const uint8 *src, const int pitch);
+	static void decodeFrameDeltaPageNoXor(uint8 *dst, const uint8 *src, const int pitch);
+	
 	uint8 *encodeShape(int x, int y, int w, int h, int flags);
 	void copyRegionToBuffer(int pageNum, int x, int y, int w, int h, uint8 *dest);
 	void loadBitmap(const char *filename, int tempPage, int dstPage, uint8 *palData);

Modified: scummvm/trunk/engines/kyra/sequences_v2.cpp
===================================================================
--- scummvm/trunk/engines/kyra/sequences_v2.cpp	2007-01-06 17:07:13 UTC (rev 25033)
+++ scummvm/trunk/engines/kyra/sequences_v2.cpp	2007-01-06 17:11:08 UTC (rev 25034)
@@ -115,7 +115,7 @@
 				break;
 			else {
 				uint32 loopTime = currTime - startTime;
-				delay(loopTime > _tickLength ? loopTime : _tickLength);
+				delay(loopTime < _tickLength ? loopTime : _tickLength);
 			}
 		}
 

Modified: scummvm/trunk/engines/kyra/wsamovie.cpp
===================================================================
--- scummvm/trunk/engines/kyra/wsamovie.cpp	2007-01-06 17:07:13 UTC (rev 25033)
+++ scummvm/trunk/engines/kyra/wsamovie.cpp	2007-01-06 17:11:08 UTC (rev 25034)
@@ -143,7 +143,7 @@
 			if (_flags & WF_OFFSCREEN_DECODE) {
 				Screen::decodeFrameDelta(dst, _deltaBuffer);
 			} else {
-				Screen::decodeFrameDeltaPage(dst, _deltaBuffer, _width, 1);
+				Screen::decodeFrameDeltaPageNoXor(dst, _deltaBuffer, _width);
 			}
 		}
 		_currentFrame = 0;
@@ -206,7 +206,7 @@
 	if (_flags & WF_OFFSCREEN_DECODE) {
 		Screen::decodeFrameDelta(dst, _deltaBuffer);
 	} else {
-		Screen::decodeFrameDeltaPage(dst, _deltaBuffer, _width, 0);
+		Screen::decodeFrameDeltaPage(dst, _deltaBuffer, _width);
 	}
 }
 
@@ -246,6 +246,11 @@
 		}
 	}
 	
+	if (flags & 2)
+	{
+		_flags |= WF_MASKED_BLIT;
+	}
+	
 	if (!(unk1 & 2)) {
 		_flags |= WF_OFFSCREEN_DECODE;
 		const int offscreenBufferSize = _width * _height;

Modified: scummvm/trunk/engines/kyra/wsamovie.h
===================================================================
--- scummvm/trunk/engines/kyra/wsamovie.h	2007-01-06 17:07:13 UTC (rev 25033)
+++ scummvm/trunk/engines/kyra/wsamovie.h	2007-01-06 17:11:08 UTC (rev 25034)
@@ -69,15 +69,17 @@
 	virtual int frames() { return _opened ? _numFrames : -1; }
 
 	virtual void displayFrame(int frameNum);
-protected:
-	virtual void processFrame(int frameNum, uint8 *dst);
 
 	enum WSAFlags {
+		WF_MASKED_BLIT = 0x1,		
 		WF_OFFSCREEN_DECODE = 0x10,
 		WF_NO_FIRST_FRAME = 0x40,
 		WF_HAS_PALETTE = 0x100
 	};
 
+protected:
+	virtual void processFrame(int frameNum, uint8 *dst);
+
 	uint16 _currentFrame;
 	uint16 _numFrames;
 	uint16 _width;


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