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

lordhoto at users.sourceforge.net lordhoto at users.sourceforge.net
Sun May 11 17:57:50 CEST 2008


Revision: 32023
          http://scummvm.svn.sourceforge.net/scummvm/?rev=32023&view=rev
Author:   lordhoto
Date:     2008-05-11 08:57:50 -0700 (Sun, 11 May 2008)

Log Message:
-----------
Implemented page switch animation in kyra3 album.

Modified Paths:
--------------
    scummvm/trunk/engines/kyra/gui_mr.cpp
    scummvm/trunk/engines/kyra/kyra_mr.h
    scummvm/trunk/engines/kyra/screen_hof.cpp
    scummvm/trunk/engines/kyra/screen_hof.h
    scummvm/trunk/engines/kyra/screen_v2.cpp
    scummvm/trunk/engines/kyra/screen_v2.h
    scummvm/trunk/engines/kyra/text_mr.cpp

Modified: scummvm/trunk/engines/kyra/gui_mr.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui_mr.cpp	2008-05-11 15:24:25 UTC (rev 32022)
+++ scummvm/trunk/engines/kyra/gui_mr.cpp	2008-05-11 15:57:50 UTC (rev 32023)
@@ -742,11 +742,14 @@
 	restorePage3();
 	_screen->copyBlockToPage(0, 0, 0, 320, 200, _screenBuffer);
 	_screen->copyBlockToPage(4, 0, 0, 320, 200, _album.backUpPage);
-	delete[] _album.backUpPage;
-	_album.backUpPage = 0;
 
 	memcpy(_screen->getPalette(0), _screen->getPalette(1), 768);
 	_screen->fadePalette(_screen->getPalette(0), 9);
+
+	delete[] _album.backUpRect;
+	_album.backUpRect = 0;
+	delete[] _album.backUpPage;
+	_album.backUpPage = 0;
 	delete[] _album.file;
 	_album.file = 0;
 
@@ -1045,16 +1048,16 @@
 	_screen->updateScreen();
 }
 
-void KyraEngine_MR::albumSwitchPages(int oldPage, int newPage, int unk) {
-	debugC(9, kDebugLevelMain, "KyraEngine_MR::albumSwitchPages()");
+void KyraEngine_MR::albumSwitchPages(int oldPage, int newPage, int srcPage) {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::albumSwitchPages(%d, %d, %d)", oldPage, newPage, srcPage);
 	if (newPage > oldPage) {
-		//XXX
+		_screen->wsaFrameAnimationStep(0xA0, 0x07, 0xA0, 0x07, 0x96, 0xBA, 0x64, 0xBA, srcPage, 0, 2);
 
 		_screen->copyRegion(260, 7, 260, 7, 50, 186, 2, 0, Screen::CR_NO_P_CHECK);
 		_screen->updateScreen();
 		delayWithTicks(1);
 
-		//XXX
+		_screen->wsaFrameAnimationStep(0xA0, 0x07, 0xA0, 0x07, 0x96, 0xBA, 0x32, 0xBA, srcPage, 0, 2);
 
 		_screen->copyRegion(210, 7, 210, 7, 50, 186, 2, 0, Screen::CR_NO_P_CHECK);
 		_screen->updateScreen();
@@ -1064,22 +1067,24 @@
 		_screen->updateScreen();
 		delayWithTicks(1);
 
-		//XXX
+		_screen->wsaFrameAnimationStep(0x10, 0x07, 0x6E, 0x07, 0x96, 0xBA, 0x32, 0xBA, 2, 0, 2);
+		_screen->updateScreen();
 		delayWithTicks(1);
 
-		//XXX
+		_screen->wsaFrameAnimationStep(0x10, 0x07, 0x3C, 0x07, 0x96, 0xBA, 0x64, 0xBA, 2, 0, 2);
+		_screen->updateScreen();
 		delayWithTicks(1);
 
 		_screen->copyRegion(10, 7, 10, 7, 150, 186, 2, 0, Screen::CR_NO_P_CHECK);
 		_screen->updateScreen();
 	} else {
-		//XXX
+		_screen->wsaFrameAnimationStep(0x0A, 0x07, 0x3C, 0x07, 0x96, 0xBA, 0x64, 0xBA, srcPage, 0, 2);
 
 		_screen->copyRegion(10, 7, 10, 7, 50, 186, 2, 0, Screen::CR_NO_P_CHECK);
 		_screen->updateScreen();
 		delayWithTicks(1);
 
-		//XXX
+		_screen->wsaFrameAnimationStep(0x0A, 0x07, 0x6E, 0x07, 0x96, 0xBA, 0x32, 0xBA, srcPage, 0, 2);
 
 		_screen->copyRegion(60, 7, 60, 7, 50, 186, 2, 0, Screen::CR_NO_P_CHECK);
 		_screen->updateScreen();
@@ -1089,10 +1094,12 @@
 		_screen->updateScreen();
 		delayWithTicks(1);
 
-		//XXX
+		_screen->wsaFrameAnimationStep(0xA0, 0x07, 0xA0, 0x07, 0x96, 0xBA, 0x32, 0xBA, 2, 0, 2);
+		_screen->updateScreen();
 		delayWithTicks(1);
 
-		//XXX
+		_screen->wsaFrameAnimationStep(0xA0, 0x07, 0xA0, 0x07, 0x96, 0xBA, 0x64, 0xBA, 2, 0, 2);
+		_screen->updateScreen();
 		delayWithTicks(1);
 
 		_screen->copyRegion(160, 7, 160, 7, 150, 186, 2, 0, Screen::CR_NO_P_CHECK);

Modified: scummvm/trunk/engines/kyra/kyra_mr.h
===================================================================
--- scummvm/trunk/engines/kyra/kyra_mr.h	2008-05-11 15:24:25 UTC (rev 32022)
+++ scummvm/trunk/engines/kyra/kyra_mr.h	2008-05-11 15:57:50 UTC (rev 32023)
@@ -572,7 +572,7 @@
 	void albumRestoreRect();
 	void albumUpdateRect();
 
-	void albumSwitchPages(int oldPage, int newPage, int unk);
+	void albumSwitchPages(int oldPage, int newPage, int srcPage);
 
 	int albumNextPage(Button *caller);
 	int albumPrevPage(Button *caller);

Modified: scummvm/trunk/engines/kyra/screen_hof.cpp
===================================================================
--- scummvm/trunk/engines/kyra/screen_hof.cpp	2008-05-11 15:24:25 UTC (rev 32022)
+++ scummvm/trunk/engines/kyra/screen_hof.cpp	2008-05-11 15:57:50 UTC (rev 32023)
@@ -31,15 +31,9 @@
 namespace Kyra {
 
 Screen_HoF::Screen_HoF(KyraEngine_HoF *vm, OSystem *system)
-	: Screen_v2(vm, system) {
-	_vm = vm;
-	_wsaFrameAnimBuffer = new uint8[1024];
+	: Screen_v2(vm, system), _vm(vm) {
 }
 
-Screen_HoF::~Screen_HoF() {
-	delete[] _wsaFrameAnimBuffer;
-}
-
 void Screen_HoF::setScreenDim(int dim) {
 	debugC(9, kDebugLevelScreen, "Screen_HoF::setScreenDim(%d)", dim);
 	assert(dim < _screenDimTableCount);
@@ -74,80 +68,10 @@
 		grayOverlay[i] = findLeastDifferentColor(tmpPal + 3 * i, srcPal, lastColor);
 }
 
-void Screen_HoF::wsaFrameAnimationStep(int x1, int y1, int x2, int y2,
-	int w1, int h1, int w2, int h2, int srcPage, int dstPage, int dim) {
-
-	if (!(w1 || h1 || w2 || h2))
-		return;
-
-	ScreenDim cdm = _screenDimTable[dim];
-	cdm.sx <<= 3;
-	cdm.w <<= 3;
-
-	int na = 0, nb = 0, nc = w2;
-
-	if (!calcBounds(cdm.w, cdm.h, x2, y2, w2, h2, na, nb, nc))
-		return;
-
-	const uint8 *src = getPagePtr(srcPage) + y1 * 320;
-	uint8 *dst = getPagePtr(dstPage) + (y2 + cdm.sy) * 320;
-
-	int u = -1;
-
-	do {
-		int t = (nb * h1) / h2;
-		if (t != u) {
-			u = t;
-			const uint8 *s = src + (x1 + t) * 320;
-			uint8 *dt = (uint8*) _wsaFrameAnimBuffer;
-
-			t = w2 - w1;
-			if (!t) {
-				memcpy(dt, s, w2);
-			} else if (t > 0) {
-				if (w1 == 1) {
-                    memset(dt, *s, w2);
-				} else {
-					t = ((((((w2 - w1 + 1) & 0xffff) << 8) / w1) + 0x100) & 0xffff) << 8;
-					int bp = 0;
-					for (int i = 0; i < w1; i++) {
-						int cnt = (t >> 16);
-						bp += (t & 0xffff);
-						if (bp > 0xffff) {
-							bp -= 0xffff;
-							cnt++;
-						}
-						memset(dt, *s++, cnt);
-						dt += cnt;
-					}
-				}
-			} else {
-				if (w2 == 1) {
-					*dt = *s;
-				} else {
-					t = (((((w1 - w2) & 0xffff) << 8) / w2) & 0xffff) << 8;
-					int bp = 0;
-					for (int i = 0; i < w2; i++) {
-						*dt++ = *s++;
-						bp += (t & 0xffff);
-						if (bp > 0xffff) {
-							bp -= 0xffff;
-							s++;
-						}
-						s += (t >> 16);
-					}
-				}
-			}
-		}
-		memcpy(dst + x2 + cdm.sx, _wsaFrameAnimBuffer + na, w2);
-		dst += 320;
-	} while (++nb < h2);
-}
-
 void Screen_HoF::cmpFadeFrameStep(int srcPage, int srcW, int srcH, int srcX, int srcY, int dstPage, int dstW,
 	int dstH, int dstX, int dstY, int cmpW, int cmpH, int cmpPage) {
 
-	if (!(cmpW || cmpH ))
+	if (!cmpW || !cmpH)
 		return;
 
 	int r1, r2, r3, r4, r5, r6;
@@ -192,8 +116,7 @@
 	memcpy(dst, src, numBytes);
 }
 
-
-void Screen_HoF::copyRegionEx(int srcPage, int srcW, int srcH, int dstPage, int dstX,int dstY, int dstW, int dstH, const ScreenDim *dim, bool flag) {
+void Screen_HoF::copyRegionEx(int srcPage, int srcW, int srcH, int dstPage, int dstX, int dstY, int dstW, int dstH, const ScreenDim *dim, bool flag) {
 	int x0 = dim->sx << 3;
 	int y0 = dim->sy;
 	int w0 = dim->w << 3;
@@ -229,51 +152,5 @@
 	}
 }
 
-bool Screen_HoF::calcBounds(int w0, int h0, int &x1, int &y1, int &w1, int &h1, int &x2, int &y2, int &w2) {
-	x2 = 0;
-	y2 = 0;
-	w2 = w1;
-
-	int t = x1 + w1;
-	if (t < 1) {
-		w1 = h1 = -1;
-	} else {
-		if (t <= x1) {
-			x2 = w1 - t;
-			w1 = t;
-			x1 = 0;
-		}
-		t = w0 - x1;
-		if (t < 1) {
-			w1 = h1 = -1;
-		} else {
-			if (t <= w1) {
-				w1 = t;
-			}
-			w2 -= w1;
-			t = h1 + y1;
-			if (t < 1) {
-				w1 = h1 = -1;
-			} else {
-				if (t <= y1) {
-					y2 = h1 - t;
-					h1 = t;
-					y1 = 0;
-				}
-                t = h0 - y1;
-				if (t < 1) {
-					w1 = h1 = -1;
-				} else {
-					if (t <= h1) {
-						h1 = t;
-					}
-				}
-			}
-		}
-	}
-
-	return (w1 == -1) ? false : true;
-}
-
 } // end of namespace Kyra
 

Modified: scummvm/trunk/engines/kyra/screen_hof.h
===================================================================
--- scummvm/trunk/engines/kyra/screen_hof.h	2008-05-11 15:24:25 UTC (rev 32022)
+++ scummvm/trunk/engines/kyra/screen_hof.h	2008-05-11 15:57:50 UTC (rev 32023)
@@ -36,15 +36,12 @@
 friend class Debugger_v2;
 public:
 	Screen_HoF(KyraEngine_HoF *vm, OSystem *system);
-	~Screen_HoF();
 
 	void setScreenDim(int dim);
 	const ScreenDim *getScreenDim(int dim);
 
 	// sequence player
 	void generateGrayOverlay(const uint8 *srcPal, uint8 *grayOverlay, int factor, int addR, int addG, int addB, int lastColor, bool flag);
-	bool calcBounds(int w0, int h0, int &x1, int &y1, int &w1, int &h1, int &x2, int &y2, int &w2);
-	void wsaFrameAnimationStep(int x1, int y1, int x2, int y2, int w1, int h1, int w2, int h2,	int srcPage, int dstPage, int dim);
 	void cmpFadeFrameStep(int srcPage, int srcW, int srcH, int srcX, int srcY, int dstPage,	int dstW, int dstH, int dstX, int dstY, int cmpW, int cmpH, int cmpPage);
 	void copyPageMemory(int srcPage, int srcPos, int dstPage, int dstPos, int numBytes);
 	void copyRegionEx(int srcPage, int srcW, int srcH, int dstPage, int dstX,int dstY, int dstW, int dstH, const ScreenDim *d, bool flag = false);
@@ -53,8 +50,6 @@
 
 	static const ScreenDim _screenDimTable[];
 	static const int _screenDimTableCount;
-
-	uint8 *_wsaFrameAnimBuffer;
 };
 
 } // End of namespace Kyra

Modified: scummvm/trunk/engines/kyra/screen_v2.cpp
===================================================================
--- scummvm/trunk/engines/kyra/screen_v2.cpp	2008-05-11 15:24:25 UTC (rev 32022)
+++ scummvm/trunk/engines/kyra/screen_v2.cpp	2008-05-11 15:57:50 UTC (rev 32023)
@@ -29,6 +29,15 @@
 
 namespace Kyra {
 
+Screen_v2::Screen_v2(KyraEngine *vm, OSystem *system) : Screen(vm, system), _wsaFrameAnimBuffer(0) {
+	_wsaFrameAnimBuffer = new uint8[1024];
+	assert(_wsaFrameAnimBuffer);
+}
+
+Screen_v2::~Screen_v2() {
+	delete[] _wsaFrameAnimBuffer;
+}
+
 uint8 *Screen_v2::generateOverlay(const uint8 *palette, uint8 *buffer, int startColor, uint16 factor) {
 	if (!palette || !buffer)
 		return buffer;
@@ -336,5 +345,121 @@
 	setTextColor(cmap, 0, 15);
 }
 
+void Screen_v2::wsaFrameAnimationStep(int x1, int y1, int x2, int y2,
+	int w1, int h1, int w2, int h2, int srcPage, int dstPage, int dim) {
+
+	if (!(w1 || h1 || w2 || h2))
+		return;
+
+	ScreenDim cdm = *getScreenDim(dim);
+	cdm.sx <<= 3;
+	cdm.w <<= 3;
+
+	int na = 0, nb = 0, nc = w2;
+
+	if (!calcBounds(cdm.w, cdm.h, x2, y2, w2, h2, na, nb, nc))
+		return;
+
+	const uint8 *src = getPagePtr(srcPage) + y1 * 320;
+	uint8 *dst = getPagePtr(dstPage) + (y2 + cdm.sy) * 320;
+
+	int u = -1;
+
+	do {
+		int t = (nb * h1) / h2;
+		if (t != u) {
+			u = t;
+			const uint8 *s = src + (x1 + t) * 320;
+			uint8 *dt = (uint8 *)_wsaFrameAnimBuffer;
+
+			t = w2 - w1;
+			if (!t) {
+				memcpy(dt, s, w2);
+			} else if (t > 0) {
+				if (w1 == 1) {
+                    memset(dt, *s, w2);
+				} else {
+					t = ((((((w2 - w1 + 1) & 0xffff) << 8) / w1) + 0x100) & 0xffff) << 8;
+					int bp = 0;
+					for (int i = 0; i < w1; i++) {
+						int cnt = (t >> 16);
+						bp += (t & 0xffff);
+						if (bp > 0xffff) {
+							bp -= 0xffff;
+							cnt++;
+						}
+						memset(dt, *s++, cnt);
+						dt += cnt;
+					}
+				}
+			} else {
+				if (w2 == 1) {
+					*dt = *s;
+				} else {
+					t = (((((w1 - w2) & 0xffff) << 8) / w2) & 0xffff) << 8;
+					int bp = 0;
+					for (int i = 0; i < w2; i++) {
+						*dt++ = *s++;
+						bp += (t & 0xffff);
+						if (bp > 0xffff) {
+							bp -= 0xffff;
+							s++;
+						}
+						s += (t >> 16);
+					}
+				}
+			}
+		}
+		memcpy(dst + x2 + cdm.sx, _wsaFrameAnimBuffer + na, w2);
+		dst += 320;
+	} while (++nb < h2);
+}
+
+bool Screen_v2::calcBounds(int w0, int h0, int &x1, int &y1, int &w1, int &h1, int &x2, int &y2, int &w2) {
+	x2 = 0;
+	y2 = 0;
+	w2 = w1;
+
+	int t = x1 + w1;
+	if (t < 1) {
+		w1 = h1 = -1;
+	} else {
+		if (t <= x1) {
+			x2 = w1 - t;
+			w1 = t;
+			x1 = 0;
+		}
+		t = w0 - x1;
+		if (t < 1) {
+			w1 = h1 = -1;
+		} else {
+			if (t <= w1) {
+				w1 = t;
+			}
+			w2 -= w1;
+			t = h1 + y1;
+			if (t < 1) {
+				w1 = h1 = -1;
+			} else {
+				if (t <= y1) {
+					y2 = h1 - t;
+					h1 = t;
+					y1 = 0;
+				}
+                t = h0 - y1;
+				if (t < 1) {
+					w1 = h1 = -1;
+				} else {
+					if (t <= h1) {
+						h1 = t;
+					}
+				}
+			}
+		}
+	}
+
+	return (w1 == -1) ? false : true;
+}
+
 } // end of namespace Kyra
 

Modified: scummvm/trunk/engines/kyra/screen_v2.h
===================================================================
--- scummvm/trunk/engines/kyra/screen_v2.h	2008-05-11 15:24:25 UTC (rev 32022)
+++ scummvm/trunk/engines/kyra/screen_v2.h	2008-05-11 15:57:50 UTC (rev 32023)
@@ -33,7 +33,8 @@
 
 class Screen_v2 : public Screen {
 public:
-	Screen_v2(KyraEngine *vm, OSystem *system) : Screen(vm, system) {}
+	Screen_v2(KyraEngine *vm, OSystem *system);
+	~Screen_v2();
 
 	// screen page handling
 	void copyWsaRect(int x, int y, int w, int h, int dimState, int plotFunc, const uint8 *src,
@@ -57,13 +58,18 @@
 
 	// rect handling
 	int getRectSize(int w, int h);
+	bool calcBounds(int w0, int h0, int &x1, int &y1, int &w1, int &h1, int &x2, int &y2, int &w2);
 
 	// text display
 	void setTextColorMap(const uint8 *cmap);
 
 	// layer handling
 	virtual int getLayer(int x, int y);
+
+	// special WSA handling
+	void wsaFrameAnimationStep(int x1, int y1, int x2, int y2, int w1, int h1, int w2, int h2,	int srcPage, int dstPage, int dim);
 protected:
+	uint8 *_wsaFrameAnimBuffer;
 };
 
 } // end of namespace Kyra

Modified: scummvm/trunk/engines/kyra/text_mr.cpp
===================================================================
--- scummvm/trunk/engines/kyra/text_mr.cpp	2008-05-11 15:24:25 UTC (rev 32022)
+++ scummvm/trunk/engines/kyra/text_mr.cpp	2008-05-11 15:57:50 UTC (rev 32023)
@@ -606,6 +606,7 @@
 			_album.wsa->setY(90);
 			_album.wsa->setDrawPage(2);
 
+			albumRestoreRect();
 			_album.wsa->displayFrame(frame, 0x4000);
 			albumUpdateRect();
 


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