[Scummvm-cvs-logs] CVS: scummvm/scumm costume.cpp,1.85,1.86

Max Horn fingolfin at users.sourceforge.net
Sun Jul 13 04:14:39 CEST 2003


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

Modified Files:
	costume.cpp 
Log Message:
reduce code duplication; theoretical masking implementation for C64 costumes, can't test since masking is disabled in gfx.cpp for C64/V1 games

Index: costume.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/costume.cpp,v
retrieving revision 1.85
retrieving revision 1.86
diff -u -d -r1.85 -r1.86
--- costume.cpp	13 Jul 2003 10:35:05 -0000	1.85
+++ costume.cpp	13 Jul 2003 11:13:50 -0000	1.86
@@ -308,14 +308,16 @@
 	const byte *src;
 	byte *dst;
 	byte len;
-	int y;
-	byte color;
+	uint y, height;
+	byte color, pcolor;
+	bool rep;
 
-	y = 0;
+	y = v1.y;
 	src = _srcptr;
 	dst = v1.destptr;
 	len = v1.replen;
 	color = v1.repcolor;
+	height = _height;
 
 	// TODO:
 	// * figure out how to get the right colors/palette
@@ -326,57 +328,48 @@
 //	const byte *palette = _palette;
 
 	v1.skip_width >>= 3;
+
+	if (len)
+		goto StartPos;
+
 	do {
-		color = *src++;
-		if (color & 0x80) {
-			len = color & 0x7f;
+		len = *src++;
+		if (len & 0x80)
 			color = *src++;
-			while (len--) {
-				if (!_mirror) {
-					if ((color >> 6) & 3) dst[6] = dst[7] = palette[(color >> 6) & 3];
-					if ((color >> 4) & 3) dst[4] = dst[5] = palette[(color >> 4) & 3];
-					if ((color >> 2) & 3) dst[2] = dst[3] = palette[(color >> 2) & 3];
-					if ((color >> 0) & 3) dst[0] = dst[1] = palette[(color >> 0) & 3];
-				} else {
-					if ((color >> 6) & 3) dst[0] = dst[1] = palette[(color >> 6) & 3];
-					if ((color >> 4) & 3) dst[2] = dst[3] = palette[(color >> 4) & 3];
-					if ((color >> 2) & 3) dst[4] = dst[5] = palette[(color >> 2) & 3];
-					if ((color >> 0) & 3) dst[6] = dst[7] = palette[(color >> 0) & 3];
-				}
-				dst += _outwidth;
-				y++;
-				if (y >= _height) {
-					if (!--v1.skip_width)
-						return;
-					y = 0;
-					v1.destptr += 8 * v1.scaleXstep;
-					dst = v1.destptr;
-				}
-			}
-		} else {
-			len = color;
-			while (len--) {
+	StartPos:;
+		rep = (len & 0x80) != 0;
+		len &= 0x7f;
+		while (len--) {
+			if (!rep)
 				color = *src++;
+			
+			if (y < _outheight) {
+#define MASK_AT(xoff)	(v1.mask_ptr && ((v1.mask_ptr[(v1.x+xoff) >> 3] | v1.mask_ptr[((v1.x+xoff) >> 3) + v1.imgbufoffs]) & revBitMask[(v1.x+xoff) & 7]))
 				if (!_mirror) {
-					if ((color >> 6) & 3) dst[6] = dst[7] = palette[(color >> 6) & 3];
-					if ((color >> 4) & 3) dst[4] = dst[5] = palette[(color >> 4) & 3];
-					if ((color >> 2) & 3) dst[2] = dst[3] = palette[(color >> 2) & 3];
-					if ((color >> 0) & 3) dst[0] = dst[1] = palette[(color >> 0) & 3];
+					pcolor = (color >> 0) & 3; if (pcolor) { if (!MASK_AT(0)) dst[0] = palette[pcolor]; if (!MASK_AT(1)) dst[1] = palette[pcolor]; }
+					pcolor = (color >> 2) & 3; if (pcolor) { if (!MASK_AT(2)) dst[2] = palette[pcolor]; if (!MASK_AT(3)) dst[3] = palette[pcolor]; }
+					pcolor = (color >> 4) & 3; if (pcolor) { if (!MASK_AT(4)) dst[4] = palette[pcolor]; if (!MASK_AT(5)) dst[5] = palette[pcolor]; }
+					pcolor = (color >> 6) & 3; if (pcolor) { if (!MASK_AT(6)) dst[6] = palette[pcolor]; if (!MASK_AT(7)) dst[7] = palette[pcolor]; }
 				} else {
-					if ((color >> 6) & 3) dst[0] = dst[1] = palette[(color >> 6) & 3];
-					if ((color >> 4) & 3) dst[2] = dst[3] = palette[(color >> 4) & 3];
-					if ((color >> 2) & 3) dst[4] = dst[5] = palette[(color >> 2) & 3];
-					if ((color >> 0) & 3) dst[6] = dst[7] = palette[(color >> 0) & 3];
-				}
-				dst += _outwidth;
-				y++;
-				if (y >= _height) {
-					if (!--v1.skip_width)
-						return;
-					y = 0;
-					v1.destptr += 8 * v1.scaleXstep;
-					dst = v1.destptr;
+					pcolor = (color >> 6) & 3; if (pcolor) { if (!MASK_AT(0)) dst[0] = palette[pcolor]; if (!MASK_AT(1)) dst[1] = palette[pcolor]; }
+					pcolor = (color >> 4) & 3; if (pcolor) { if (!MASK_AT(2)) dst[2] = palette[pcolor]; if (!MASK_AT(3)) dst[3] = palette[pcolor]; }
+					pcolor = (color >> 2) & 3; if (pcolor) { if (!MASK_AT(4)) dst[4] = palette[pcolor]; if (!MASK_AT(5)) dst[5] = palette[pcolor]; }
+					pcolor = (color >> 0) & 3; if (pcolor) { if (!MASK_AT(6)) dst[6] = palette[pcolor]; if (!MASK_AT(7)) dst[7] = palette[pcolor]; }
 				}
+#undef MASK_AT
+			}
+			dst += _outwidth;
+			y++;
+			if (!--height) {
+				if (!--v1.skip_width)
+					return;
+				height = _height;
+				y = v1.y;
+				v1.x += 8 * v1.scaleXstep;
+				if (v1.x < 0 || v1.x >= _vm->_screenWidth)
+					return;
+				v1.destptr += 8 * v1.scaleXstep;
+				dst = v1.destptr;
 			}
 		}
 	} while(1);





More information about the Scummvm-git-logs mailing list