[Scummvm-cvs-logs] CVS: scummvm/scumm gfx.cpp,2.383,2.383.2.1 gfx.h,1.97,1.97.2.1 intern.h,2.322.2.1,2.322.2.2 script_v90he.cpp,2.116.2.2,2.116.2.3 wiz_he.cpp,2.1,2.1.2.1 wiz_he.h,2.1,2.1.2.1

kirben kirben at users.sourceforge.net
Sat Mar 12 06:22:30 CET 2005


Update of /cvsroot/scummvm/scummvm/scumm
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32484/scumm

Modified Files:
      Tag: branch-0-7-0
	gfx.cpp gfx.h intern.h script_v90he.cpp wiz_he.cpp wiz_he.h 
Log Message:

Backport wizImage fixs and updates


Index: gfx.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/gfx.cpp,v
retrieving revision 2.383
retrieving revision 2.383.2.1
diff -u -d -r2.383 -r2.383.2.1
--- gfx.cpp	10 Dec 2004 15:16:45 -0000	2.383
+++ gfx.cpp	12 Mar 2005 14:21:55 -0000	2.383.2.1
@@ -1454,11 +1454,36 @@
 	}
 }
 
-void Gdi::copyVirtScreenBuffers(const Common::Rect &rect) {
+void Gdi::copyVirtScreenBuffers(Common::Rect rect) {
+	byte *src, *dst;
+	VirtScreen *vs = &_vm->virtscr[0];
+
+	debug(1,"copyVirtScreenBuffers: Left %d Right %d Top %d Bottom %d", rect.left, rect.right, rect.top, rect.bottom);
+
+	if (rect.top > vs->h || rect.bottom < 0)
+		return;
+
+	if (rect.left > vs->w || rect.right < 0)
+		return;
+
+	rect.left = MAX(0, (int)rect.left);
+	rect.left = MIN((int)rect.left, (int)vs->w - 1);
+
+	rect.right = MAX(0, (int)rect.right);
+	rect.right = MIN((int)rect.right, (int)vs->w);
+
+	rect.top = MAX(0, (int)rect.top);
+	rect.top = MIN((int)rect.top, (int)vs->h - 1);
+
+	rect.bottom = MAX(0, (int)rect.bottom);
+	rect.bottom = MIN((int)rect.bottom, (int)vs->h);
+
 	const int rw = rect.width();
 	const int rh = rect.height();
-	byte *src, *dst;
 	
+	if (rw == 0 || rh == 0)
+		return;
+
 	src = _vm->virtscr[0].getBackPixels(rect.left, rect.top);
 	dst = _vm->virtscr[0].getPixels(rect.left, rect.top);
 	

Index: gfx.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/gfx.h,v
retrieving revision 1.97
retrieving revision 1.97.2.1
diff -u -d -r1.97 -r1.97.2.1
--- gfx.h	27 Nov 2004 17:50:22 -0000	1.97
+++ gfx.h	12 Mar 2005 14:21:57 -0000	1.97.2.1
@@ -277,7 +277,7 @@
 	void drawBMAPBg(const byte *ptr, VirtScreen *vs, int startstrip);
 	void drawBMAPObject(const byte *ptr, VirtScreen *vs, int obj, int x, int y, int w, int h);
 	
-	void copyVirtScreenBuffers(const Common::Rect &rect);
+	void copyVirtScreenBuffers(Common::Rect rect);
 
 	void disableZBuffer() { _zbufferDisabled = true; }
 	void enableZBuffer() { _zbufferDisabled = false; }

Index: intern.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/intern.h,v
retrieving revision 2.322.2.1
retrieving revision 2.322.2.2
diff -u -d -r2.322.2.1 -r2.322.2.2
--- intern.h	12 Mar 2005 13:36:33 -0000	2.322.2.1
+++ intern.h	12 Mar 2005 14:21:57 -0000	2.322.2.2
@@ -857,6 +857,8 @@
 	
 	void drawWizComplexPolygon(int resnum, int state, int po_x, int po_y, int arg14, int angle, int zoom, const Common::Rect *r);
 	void displayWizComplexImage(const WizParameters *params);
+	void createWizEmptyImage(const WizParameters *params);
+	void fillWizRect(const WizParameters *params);
 	void processWizImage(const WizParameters *params);
 	int getWizImageStates(int resnum);	
 	int isWizPixelNonTransparent(int restype, int resnum, int state, int x, int y, int flags);

Index: script_v90he.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/script_v90he.cpp,v
retrieving revision 2.116.2.2
retrieving revision 2.116.2.3
diff -u -d -r2.116.2.2 -r2.116.2.3
--- script_v90he.cpp	12 Mar 2005 13:36:34 -0000	2.116.2.2
+++ script_v90he.cpp	12 Mar 2005 14:21:57 -0000	2.116.2.3
@@ -483,11 +483,11 @@
 
 	switch (subOp) {
 	case -14: // HE99+
-		_wizParams.processFlags |= 0x20;
+		_wizParams.processFlags |= 0x2000;
 		pop();
 		break;
 	case -13: // HE99+
-		_wizParams.processFlags |= 0x40;
+		_wizParams.processFlags |= 0x4000;
 		pop();
 		break;
 	case 0:

Index: wiz_he.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/wiz_he.cpp,v
retrieving revision 2.1
retrieving revision 2.1.2.1
diff -u -d -r2.1 -r2.1.2.1
--- wiz_he.cpp	27 Nov 2004 17:50:23 -0000	2.1
+++ wiz_he.cpp	12 Mar 2005 14:21:57 -0000	2.1.2.1
@@ -230,14 +230,22 @@
 		}
 		int h = r1.height();
 		int w = r1.width();
+		if (srcx < 0) {
+			src -= srcx;
+		}
+		if (srcy < 0) {
+			src -= srcy * srcw;
+		}
 		dst += r2.left + r2.top * dstw;
 		while (h--) {
+			const uint8 *p = src;
 			for (int i = 0; i < w; ++i) {
-				uint8 col = *src++;
+				uint8 col = *p++;
 				if (transColor == -1 || transColor != col) {
 					dst[i] = palPtr[col];
 				}
 			}
+			src += srcw;
 			dst += dstw;
 		}
 	}
@@ -355,101 +363,88 @@
 }
 
 int Wiz::isWizPixelNonTransparent(const uint8 *data, int x, int y, int w, int h) {
-	int ret = 0;
+	if (x < 0 || x >= w || y < 0 || y >= h) {
+		return 0;
+	}
 	while (y != 0) {
 		data += READ_LE_UINT16(data) + 2;
 		--y;
 	}
 	uint16 off = READ_LE_UINT16(data); data += 2;
-	if (off != 0) {
-		if (x == 0) {
-			ret = (~*data) & 1;			
+	if (off == 0) {
+		return 0;
+	}
+	while (x > 0) {
+		uint8 code = *data++;
+		if (code & 1) {
+			code >>= 1;
+			if (code > x) {
+				return 0;
+			}
+			x -= code;
+		} else if (code & 2) {
+			code = (code >> 2) + 1;
+			if (code > x) {
+				return 1;
+			}
+			x -= code;
+			++data;
 		} else {
-			do {
-				uint8 code = *data++;
-				if (code & 1) {
-					code >>= 1;
-					if (code > x) {
-						ret = 0;
-						break;
-					}
-					x -= code;
-				} else if (code & 2) {
-					code = (code >> 2) + 1;
-					if (code > x) {
-						ret = 1;
-						break;
-					}
-					x -= code;
-					++data;
-				} else {
-					code = (code >> 2) + 1;
-					if (code > x) {
-						ret = 1;
-						break;
-					}
-					x -= code;
-					data += code;
-				}				
-			} while (x > 0);
+			code = (code >> 2) + 1;
+			if (code > x) {
+				return 1;
+			}
+			x -= code;
+			data += code;
 		}
 	}
-	return ret;
+	return (~data[0]) & 1;
 }
 
 uint8 Wiz::getWizPixelColor(const uint8 *data, int x, int y, int w, int h, uint8 color) {
-	uint8 c = color;
-	if (x >= 0 && x < w && y >= 0 && y < h) {
-		while (y != 0) {
-			data += READ_LE_UINT16(data) + 2;
-			--y;
-		}
-		uint16 off = READ_LE_UINT16(data); data += 2;
-		if (off != 0) {
-			if (x == 0) {
-				c = (*data & 1) ? color : *data;
-			} else {
-				do {
-					uint8 code = *data++;
-					if (code & 1) {
-						code >>= 1;
-						if (code > x) {
-							c = color;
-							break;
-						}
-						x -= code;
-					} else if (code & 2) {
-						code = (code >> 2) + 1;
-						if (code > x) {
-							c = *data;
-							break;
-						}
-						x -= code;
-						++data;
-					} else {
-						code = (code >> 2) + 1;
-						if (code > x) {
-							c = *(data + x);
-							break;
-						}
-						x -= code;
-						data += code;
-					}				
-				} while (x > 0);
+	if (x < 0 || x >= w || y < 0 || y >= h) {
+		return color;
+	}
+	while (y != 0) {
+		data += READ_LE_UINT16(data) + 2;
+		--y;
+	}
+	uint16 off = READ_LE_UINT16(data); data += 2;
+	if (off == 0) {
+		return color;
+	}
+	while (x > 0) {
+		uint8 code = *data++;
+		if (code & 1) {
+			code >>= 1;
+			if (code > x) {
+				return color;
+			}
+			x -= code;
+		} else if (code & 2) {
+			code = (code >> 2) + 1;
+			if (code > x) {
+				return data[0];
 			}
+			x -= code;
+			++data;
+		} else {
+			code = (code >> 2) + 1;
+			if (code > x) {
+				return data[x];
+			}
+			x -= code;
+			data += code;
 		}
 	}
-	return c;
+	return (data[0] & 1) ? color : data[1];
 }
 
 uint8 Wiz::getRawWizPixelColor(const uint8 *data, int x, int y, int w, int h, uint8 color) {
-	uint8 c;
-	if (x >= 0 && x < w && y >= 0 && y < h) {
-		c = data[y * w + x];
-	} else {
-		c = color;
+	if (x < 0 || x >= w || y < 0 || y >= h) {
+		return color;
 	}
-	return c;
+	return data[y * w + x];
 }
 
 void Wiz::computeWizHistogram(uint32 *histogram, const uint8 *data, const Common::Rect *srcRect) {
@@ -1215,6 +1210,114 @@
 	}
 }
 
+void ScummEngine_v90he::createWizEmptyImage(const WizParameters *params) {
+	debug(1, "ScummEngine_v90he::createWizEmptyImage(%d, %d, %d)", params->img.resNum, params->resDefImgW, params->resDefImgH);
+	int img_w = 640;
+	if (params->processFlags & 0x2000) {
+		img_w = params->resDefImgW;
+	}
+	int img_h = 480;
+	if (params->processFlags & 0x4000) {
+		img_h = params->resDefImgH;
+	}
+	int img_x = 0;
+	int img_y = 0;
+	if (params->processFlags & 1) {
+		img_x = params->img.x1;
+		img_y = params->img.y1;
+	}
+	const uint16 flags = 0xB;
+	int res_size = 0x1C;
+	if (flags & 1) {
+		res_size += 0x308;
+	}
+	if (flags & 2) {
+		res_size += 0x10;
+	}
+	if (flags & 8) {
+		res_size += 0x10C;
+	}
+	res_size += 8 + img_w * img_h;
+	
+	uint8 *res_data = createResource(rtImage, params->img.resNum, res_size);
+	if (!res_data) {
+		VAR(119) = -1;
+	} else {
+		VAR(119) = 0;
+		WRITE_BE_UINT32(res_data, 'AWIZ'); res_data += 4;
+		WRITE_BE_UINT32(res_data, res_size); res_data += 4;
+		WRITE_BE_UINT32(res_data, 'WIZH'); res_data += 4;
+		WRITE_BE_UINT32(res_data, 0x14); res_data += 4;
+		WRITE_LE_UINT32(res_data, 0); res_data += 4;
+		WRITE_LE_UINT32(res_data, img_w); res_data += 4;
+		WRITE_LE_UINT32(res_data, img_h); res_data += 4;
+		if (flags & 1) {
+			WRITE_BE_UINT32(res_data, 'RGBS'); res_data += 4;
+			WRITE_BE_UINT32(res_data, 0x308); res_data += 4;
+			memcpy(res_data, _currentPalette, 0x300); res_data += 0x300;			
+		}
+		if (flags & 2) {
+			WRITE_BE_UINT32(res_data, 'SPOT'); res_data += 4;
+			WRITE_BE_UINT32(res_data, 0x10); res_data += 4;
+			WRITE_BE_UINT32(res_data, img_x); res_data += 4;
+			WRITE_BE_UINT32(res_data, img_y); res_data += 4;
+		}
+		if (flags & 8) {
+			WRITE_BE_UINT32(res_data, 'RMAP'); res_data += 4;
+			WRITE_BE_UINT32(res_data, 0x10C); res_data += 4;
+			WRITE_BE_UINT32(res_data, 0); res_data += 4;
+			for (int i = 0; i < 0x100; ++i) {
+				*res_data++ = i;
+			}
+		}
+		WRITE_BE_UINT32(res_data, 'WIZD'); res_data += 4;
+		WRITE_BE_UINT32(res_data, 8 + img_w * img_h); res_data += 4;
+	}
+}
+
+void ScummEngine_v90he::fillWizRect(const WizParameters *params) {
+	int state = 0;
+	if (params->processFlags & 0x400) {
+		state = params->img.state;
+	}
+	uint8 *dataPtr = getResourceAddress(rtImage, params->img.resNum);
+	if (dataPtr) {	
+		const uint8 *wizh = findWrappedBlock(MKID('WIZH'), dataPtr, state, 0);
+		assert(wizh);
+		uint32 ic = READ_LE_UINT32(wizh + 0x0);
+		uint32 iw = READ_LE_UINT32(wizh + 0x4);
+		uint32 ih = READ_LE_UINT32(wizh + 0x8);
+		assert(ic == 0 || ic == 2 || ic == 3);	
+		Common::Rect r1(iw, ih);
+		if (params->processFlags & 0x200) {
+			if (!r1.intersects(params->box)) {
+				return;
+			}
+			r1.clip(params->box);
+		}
+		if (params->processFlags & 0x40000) {
+			r1.clip(params->box2);
+		}
+		uint8 color;
+		if (params->processFlags & 0x20000) {
+			color = params->fillColor;
+		} else {
+			color = VAR(93);
+		}
+		/*
+		uint8 *wizd = findWrappedBlock(MKID('WIZD'), dataPtr, state, 0);
+		assert(wizd);
+		int dx = r1.width();
+		int dy = r1.height();
+		wizd += r1.top * iw + r1.left;
+		while (dy--) {
+			memset(wizd, color, dx);
+			wizd += iw;
+		} 
+		*/	
+}
+}
+
 void ScummEngine_v90he::processWizImage(const WizParameters *params) {
 	debug(1, "ScummEngine_v90he::processWizImage()");
 	switch (params->processMode) {
@@ -1272,15 +1375,11 @@
 			}
 		}
 		break;
-	case 6:
-	// HE 99+
-	case 7:
 	case 8:
+		createWizEmptyImage(params);
+		break;
 	case 9:
-	case 10:
-	case 11:
-	case 12:
-		warning("unhandled processWizImage mode %d", params->processMode);
+		fillWizRect(params);
 		break;
 	default:
 		warning("invalid processWizImage mode %d", params->processMode);

Index: wiz_he.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/wiz_he.h,v
retrieving revision 2.1
retrieving revision 2.1.2.1
diff -u -d -r2.1 -r2.1.2.1
--- wiz_he.h	27 Nov 2004 17:50:23 -0000	2.1
+++ wiz_he.h	12 Mar 2005 14:21:57 -0000	2.1.2.1
@@ -63,9 +63,17 @@
 	int zoom;
 	int unk_15C;
 	int unk_160;
+	int unk_164;
+	int resDefImgW;
+	int resDefImgH;
+	int unk_174;
+	int unk_178;
 	uint8 remapColor[256];
 	uint8 remapIndex[256];
 	int remapNum;
+	int unk_380;
+	byte fillColor;
+	Common::Rect box2;
 	WizImage img;
 };
 





More information about the Scummvm-git-logs mailing list