[Scummvm-cvs-logs] SF.net SVN: scummvm:[39817] scummvm/trunk/engines/sci/gfx/res_view1.cpp

thebluegr at users.sourceforge.net thebluegr at users.sourceforge.net
Fri Apr 3 22:43:55 CEST 2009


Revision: 39817
          http://scummvm.svn.sourceforge.net/scummvm/?rev=39817&view=rev
Author:   thebluegr
Date:     2009-04-03 20:43:55 +0000 (Fri, 03 Apr 2009)

Log Message:
-----------
Cleanup of decompress_sci_view(). Also, ALL of the cases where that function returned 1 are fatal, as the resulting object will be invalid (null) and will crash ScummVM, so they've all been changed to asserts instead of warnings

Modified Paths:
--------------
    scummvm/trunk/engines/sci/gfx/res_view1.cpp

Modified: scummvm/trunk/engines/sci/gfx/res_view1.cpp
===================================================================
--- scummvm/trunk/engines/sci/gfx/res_view1.cpp	2009-04-03 19:25:04 UTC (rev 39816)
+++ scummvm/trunk/engines/sci/gfx/res_view1.cpp	2009-04-03 20:43:55 UTC (rev 39817)
@@ -66,108 +66,61 @@
 static int decompress_sci_view(int id, int loop, int cel, byte *resource, byte *dest, int mirrored, int pixmap_size, int size,
 	int runlength_pos, int literal_pos, int xl, int yl, int color_key) {
 	int writepos = mirrored ? xl : 0;
+	int linebase = 0;
 
-	if (mirrored) {
-		int linebase = 0;
+	while ((mirrored ? linebase < pixmap_size : writepos < pixmap_size) && literal_pos < size && runlength_pos < size) {
+		int op = resource[runlength_pos];
+		int bytes;
+		int readbytes = 0;
+		int color = 0;
 
-		while (linebase < pixmap_size && literal_pos < size && runlength_pos < size) {
-			int op = resource[runlength_pos];
-			int bytes;
-			int readbytes = 0;
-			int color = 0;
+		NEXT_RUNLENGTH_BYTE(1);
 
-			NEXT_RUNLENGTH_BYTE(1);
+		if (op & V1_RLE) {
+			bytes = op & 0x3f;
+			op &= (V1_RLE | V1_RLE_BG);
+			readbytes = (op & V1_RLE_BG) ? 0 : 1;
+		} else {
+			readbytes = bytes = op & 0x3f;
+			op = 0;
+		}
 
-			if (op & V1_RLE) {
-				bytes = op & 0x3f;
-				op &= (V1_RLE | V1_RLE_BG);
-				readbytes = (op & V1_RLE_BG) ? 0 : 1;
-			} else {
-				readbytes = bytes = op & 0x3f;
-				op = 0;
-			}
+		assert(runlength_pos + readbytes <= size);
 
-			if (runlength_pos + readbytes > size) {
-				GFXWARN("View %02x:(%d/%d) requires %d bytes to be read when %d are available at pos %d\n",
-				        id, loop, cel, readbytes, size - runlength_pos, runlength_pos - 1);
-				return 1;
-			}
-			/*
-			if (writepos - bytes < 0) {
-				GFXWARN("View %02x:(%d/%d) describes more bytes than needed: %d/%d bytes at rel. offset 0x%04x\n",
-						id, loop, cel, writepos - bytes, pixmap_size, pos - 1);
-				bytes = pixmap_size - writepos;
-			}
-			*/
-			if (op == V1_RLE) {
-				color = resource[literal_pos];
-				NEXT_LITERAL_BYTE(1);
-			}
+		/*
+		if (writepos - bytes < 0) {
+			GFXWARN("View %02x:(%d/%d) describes more bytes than needed: %d/%d bytes at rel. offset 0x%04x\n",
+					id, loop, cel, writepos - bytes, pixmap_size, pos - 1);
+			bytes = pixmap_size - writepos;
+		}
+		*/
 
-			if (!op && literal_pos + bytes > size) {
-				GFXWARN("View %02x:(%d/%d) requires %d bytes to be read when %d are available at pos %d\n",
-				        id, loop, cel, bytes, size - literal_pos, literal_pos - 1);
-				return 1;
-			}
+		if (mirrored && op == V1_RLE) {
+			color = resource[literal_pos];
+			NEXT_LITERAL_BYTE(1);
+		}
 
+		assert(op || literal_pos + bytes <= size);
+
+		if (!mirrored && (writepos + bytes > pixmap_size)) {
+			GFXWARN("Writing out of bounds: %d bytes at %d > size %d\n", bytes, writepos, pixmap_size);
+		}
+
+		if (mirrored) {
 			while (bytes--) {
+				writepos--;
 				if (op) {
-					if (op & V1_RLE_BG) {
-						writepos--;
-						*(dest + writepos) = color_key;
-					} else {
-						writepos--;
-						*(dest + writepos) = color;
-					}
+					*(dest + writepos) = (op & V1_RLE_BG) ? color_key : color;
 				} else {
-					writepos--;
 					*(dest + writepos) = *(resource + literal_pos);
 					NEXT_LITERAL_BYTE(1);
-
 				}
 				if (writepos == linebase) {
 					writepos += 2 * xl;
 					linebase += xl;
 				}
 			}
-		}
-	} else {
-		while (writepos < pixmap_size && literal_pos < size && runlength_pos < size) {
-			int op = resource[runlength_pos];
-			int bytes;
-			int readbytes = 0;
-
-			NEXT_RUNLENGTH_BYTE(1);
-
-			if (op & V1_RLE) {
-				bytes = op & 0x3f;
-				op &= (V1_RLE | V1_RLE_BG);
-				readbytes = (op & V1_RLE_BG) ? 0 : 1;
-			} else {
-				readbytes = bytes = op & 0x3f;
-				op = 0;
-			}
-
-			if (runlength_pos + readbytes > size) {
-				return 1;
-			}
-
-			if (writepos + bytes > pixmap_size) {
-				GFXWARN("View %02x:(%d/%d) describes more bytes than needed: %d/%d bytes at rel. offset 0x%04x\n",
-				        id, loop, cel, writepos - bytes, pixmap_size, runlength_pos - 1);
-				bytes = pixmap_size - writepos;
-			}
-
-			if (!op && literal_pos + bytes > size) {
-				GFXWARN("View %02x:(%d/%d) requires %d bytes to be read when %d are available at pos %d\n",
-				        id, loop, cel, bytes, size - literal_pos, literal_pos - 1);
-				return 1;
-			}
-
-			if (writepos + bytes > pixmap_size) {
-				GFXWARN("Writing out of bounds: %d bytes at %d > size %d\n", bytes, writepos, pixmap_size);
-			}
-
+		} else {
 			if (op) {
 				if (op & V1_RLE_BG)
 					memset(dest + writepos, color_key, bytes);
@@ -182,11 +135,9 @@
 				NEXT_LITERAL_BYTE(bytes);
 			}
 			writepos += bytes;
-
 		}
+	}
 
-	};
-
 	return 0;
 }
 


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