[Scummvm-cvs-logs] scummvm master -> b76b038ffc8173942927dd9be42dc731573ee3ed

tramboi bertrand_augereau at yahoo.fr
Sun Sep 18 17:37:31 CEST 2011


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
b76b038ffc DREAMWEB: 'bresenhams' ported to C++


Commit: b76b038ffc8173942927dd9be42dc731573ee3ed
    https://github.com/scummvm/scummvm/commit/b76b038ffc8173942927dd9be42dc731573ee3ed
Author: Bertrand Augereau (bertrand_augereau at yahoo.fr)
Date: 2011-09-18T10:30:45-07:00

Commit Message:
DREAMWEB: 'bresenhams' ported to C++

Changed paths:
    devtools/tasmrecover/tasm-recover
    engines/dreamweb/dreamgen.cpp
    engines/dreamweb/dreamgen.h
    engines/dreamweb/pathfind.cpp
    engines/dreamweb/stubs.h



diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover
index e892105..f41fb5f 100755
--- a/devtools/tasmrecover/tasm-recover
+++ b/devtools/tasmrecover/tasm-recover
@@ -197,6 +197,7 @@ generator = cpp(context, "DreamGen", blacklist = [
 	'hangonp',
 	'findnextcolon',
 	'usetext',
+	'bresenhams',
 	], skip_output = [
 	# These functions are processed but not output
 	'dreamweb',
diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp
index 1bcb34c..4ef2255 100644
--- a/engines/dreamweb/dreamgen.cpp
+++ b/engines/dreamweb/dreamgen.cpp
@@ -14731,134 +14731,6 @@ holdingreel:
 	data.byte(kWatchmode) = 2;
 }
 
-void DreamGenContext::bresenhams() {
-	STACK_CHECK;
-	workoutframes();
-	dx = data;
-	es = dx;
-	di = 8173;
-	si = 1;
-	data.byte(kLinedirection) = 0;
-	cx = data.word(kLineendx);
-	_sub(cx, data.word(kLinestartx));
-	if (flags.z())
-		goto vertline;
-	if (!flags.s())
-		goto line1;
-	_neg(cx);
-	bx = data.word(kLineendx);
-	_xchg(bx, data.word(kLinestartx));
-	data.word(kLineendx) = bx;
-	bx = data.word(kLineendy);
-	_xchg(bx, data.word(kLinestarty));
-	data.word(kLineendy) = bx;
-	data.byte(kLinedirection) = 1;
-line1:
-	bx = data.word(kLineendy);
-	_sub(bx, data.word(kLinestarty));
-	if (flags.z())
-		goto horizline;
-	if (!flags.s())
-		goto line3;
-	_neg(bx);
-	_neg(si);
-line3:
-	push(si);
-	data.byte(kLineroutine) = 0;
-	_cmp(bx, cx);
-	if (flags.le())
-		goto line4;
-	data.byte(kLineroutine) = 1;
-	_xchg(bx, cx);
-line4:
-	_shl(bx, 1);
-	data.word(kIncrement1) = bx;
-	_sub(bx, cx);
-	si = bx;
-	_sub(bx, cx);
-	data.word(kIncrement2) = bx;
-	ax = data.word(kLinestartx);
-	bx = data.word(kLinestarty);
-	ah = bl;
-	_inc(cx);
-	bx = pop();
-	_cmp(data.byte(kLineroutine), 1);
-	if (flags.z())
-		goto hislope;
-	goto loslope;
-vertline:
-	ax = data.word(kLinestarty);
-	bx = data.word(kLineendy);
-	cx = bx;
-	_sub(cx, ax);
-	if (!flags.l())
-		goto line31;
-	_neg(cx);
-	ax = bx;
-	data.byte(kLinedirection) = 1;
-line31:
-	_inc(cx);
-	bx = data.word(kLinestartx);
-	_xchg(ax, bx);
-	ah = bl;
-	bx = si;
-line32:
-	_stosw();
-	_add(ah, bl);
-	if (--cx)
-		goto line32;
-	goto lineexit;
-horizline:
-	ax = data.word(kLinestartx);
-	bx = data.word(kLinestarty);
-	ah = bl;
-	_inc(cx);
-horizloop:
-	_stosw();
-	_inc(al);
-	if (--cx)
-		goto horizloop;
-	goto lineexit;
-loslope:
-loloop:
-	_stosw();
-	_inc(al);
-	_or(si, si);
-	if (!flags.s())
-		goto line12;
-	_add(si, data.word(kIncrement1));
-	if (--cx)
-		goto loloop;
-	goto lineexit;
-line12:
-	_add(si, data.word(kIncrement2));
-	_add(ah, bl);
-	if (--cx)
-		goto loloop;
-	goto lineexit;
-hislope:
-hiloop:
-	_stosw();
-	_add(ah, bl);
-	_or(si, si);
-	if (!flags.s())
-		goto line23;
-	_add(si, data.word(kIncrement1));
-	if (--cx)
-		goto hiloop;
-	goto lineexit;
-line23:
-	_add(si, data.word(kIncrement2));
-	_inc(al);
-	if (--cx)
-		goto hiloop;
-lineexit:
-	_sub(di, 8173);
-	ax = di;
-	_shr(ax, 1);
-	data.byte(kLinelength) = al;
-}
-
 void DreamGenContext::workoutframes() {
 	STACK_CHECK;
 	bx = data.word(kLinestartx);
@@ -17396,7 +17268,6 @@ void DreamGenContext::__dispatch_call(uint16 addr) {
 		case addr_examineobtext: examineobtext(); break;
 		case addr_printmessage2: printmessage2(); break;
 		case addr_setwalk: setwalk(); break;
-		case addr_bresenhams: bresenhams(); break;
 		case addr_workoutframes: workoutframes(); break;
 		case addr_showicon: showicon(); break;
 		case addr_middlepanel: middlepanel(); break;
diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h
index 026b412..ca2e089 100644
--- a/engines/dreamweb/dreamgen.h
+++ b/engines/dreamweb/dreamgen.h
@@ -100,7 +100,6 @@ public:
 	static const uint16 addr_middlepanel = 0xca68;
 	static const uint16 addr_showicon = 0xca64;
 	static const uint16 addr_workoutframes = 0xca54;
-	static const uint16 addr_bresenhams = 0xca50;
 	static const uint16 addr_setwalk = 0xca44;
 	static const uint16 addr_printmessage2 = 0xca30;
 	static const uint16 addr_examineobtext = 0xca20;
@@ -1282,7 +1281,7 @@ public:
 	void buttonenter();
 	void checkinput();
 	//void crosshair();
-	void bresenhams();
+	void setmode();
 	void getbackfromops();
 	//void frameoutv();
 	void showbyte();
@@ -1496,7 +1495,7 @@ public:
 	void entersymbol();
 	void showword();
 	void dirfile();
-	void setmode();
+	//void bresenhams();
 	//void walktotext();
 	void pickupconts();
 	void locklightoff();
diff --git a/engines/dreamweb/pathfind.cpp b/engines/dreamweb/pathfind.cpp
index d6ef7f4..d367f02 100644
--- a/engines/dreamweb/pathfind.cpp
+++ b/engines/dreamweb/pathfind.cpp
@@ -130,5 +130,125 @@ bool DreamGenContext::checkifpathison(uint8 index) {
 	return pathOn == 0xff;
 }
 
+void DreamGenContext::bresenhams() {
+	workoutframes();
+	int8 *lineData = (int8 *)data.ptr(kLinedata, 0);
+	int16 startX = (int16)data.word(kLinestartx);
+	int16 startY = (int16)data.word(kLinestarty);
+	int16 endX = (int16)data.word(kLineendx);
+	int16 endY = (int16)data.word(kLineendy);
+
+	if (endX == startX) {
+		uint16 deltaY;
+		int8 y;
+		if (endY < startY) {
+			deltaY = startY - endY;
+			y = (int8)endY;
+			data.byte(kLinedirection) = 1;
+		} else {
+			deltaY = endY - startY;
+			y = (int8)startY;
+			data.byte(kLinedirection) = 0;
+		}
+		++deltaY;
+		int8 x = (int8)startX;
+		data.byte(kLinelength) = deltaY;
+		do {
+			lineData[0] = x;
+			lineData[1] = y;
+			lineData += 2;
+			++y;
+			--deltaY;
+		} while (deltaY);
+		return;
+	}
+	uint16 deltaX;
+	if (endX < startX) {
+		deltaX = startX - endX;
+		SWAP(startX, endX);
+		SWAP(startY, endY);
+		data.word(kLinestartx) = (uint16)startX;
+		data.word(kLinestarty) = (uint16)startY;
+		data.word(kLineendx) = (uint16)endX;
+		data.word(kLineendy) = (uint16)endY;
+		data.byte(kLinedirection) = 1;
+	} else {
+		deltaX = endX - startX;
+		data.byte(kLinedirection) = 0;
+	}
+
+	int16 increment;
+	if (endY == startY) {
+		int8 x = (int8)startX;
+		int8 y = (int8)startY;
+		++deltaX;
+		data.byte(kLinelength) = deltaX;
+		do {
+			lineData[0] = x;
+			lineData[1] = y;
+			lineData += 2;
+			++x;
+			--deltaX;
+		} while (deltaX);
+		return;
+	}
+	uint16 deltaY;
+	if (startY > endY) {
+		deltaY = startY - endY;
+		increment = -1;
+	} else {
+		deltaY = endY - startY;
+		increment = 1;
+	}
+
+	uint16 delta1, delta2;
+	if (deltaY > deltaX) {
+		data.byte(kLineroutine) = 1;
+		delta1 = deltaY;
+		delta2 = deltaX;
+	} else {
+		data.byte(kLineroutine) = 0;
+		delta1 = deltaX;
+		delta2 = deltaY;
+	}
+
+	data.word(kIncrement1) = delta2 * 2;
+	int16 remainder = delta2 * 2 - delta1;
+	data.word(kIncrement2) = delta2 * 2 - delta1 * 2;
+	++delta1;
+	int8 x = (int8)startX;
+	int8 y = (int8)startY;
+	data.byte(kLinelength) = delta1;
+	if (data.byte(kLineroutine) != 1) {
+		do {
+			lineData[0] = x;
+			lineData[1] = y;
+			lineData += 2;
+			++x;
+			if (remainder < 0) {
+				remainder += data.word(kIncrement1);
+			} else {
+				remainder += data.word(kIncrement2);
+				y += increment;
+			}
+			--delta1;
+		} while (delta1);
+	} else {
+		do {
+			lineData[0] = x;
+			lineData[1] = y;
+			lineData += 2;
+			y += increment;
+			if (remainder < 0) {
+				remainder += data.word(kIncrement1);
+			} else {
+				remainder += data.word(kIncrement2);
+				++x;
+			}
+			--delta1;
+		} while (delta1);
+	}
+}
+
 } /*namespace dreamgen */
 
diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h
index ab27274..5950616 100644
--- a/engines/dreamweb/stubs.h
+++ b/engines/dreamweb/stubs.h
@@ -243,4 +243,6 @@
 	void usetext();
 	void getblockofpixel();
 	uint8 getblockofpixel(uint8 x, uint8 y);
+	void bresenhams();
+
 






More information about the Scummvm-git-logs mailing list