Ticket #2701: moveScreen.txt

File moveScreen.txt, 6.8 KB (added by Kirben, 18 years ago)

moveScreen patch

Line 
1Index: engines/scumm/scumm.cpp
2===================================================================
3--- engines/scumm/scumm.cpp (revision 23186)
4+++ engines/scumm/scumm.cpp (working copy)
5@@ -370,7 +370,6 @@
6 _newEffect = 0;
7 _switchRoomEffect2 = 0;
8 _switchRoomEffect = 0;
9- _scrollBuffer = NULL;
10
11 _doEffect = false;
12 _currentLights = 0;
13Index: engines/scumm/gfx.cpp
14===================================================================
15--- engines/scumm/gfx.cpp (revision 23186)
16+++ engines/scumm/gfx.cpp (working copy)
17@@ -3052,18 +3052,6 @@
18 _screenEffectFlag = false;
19 }
20
21-void ScummEngine::setScrollBuffer() {
22- if (_switchRoomEffect >= 130 && _switchRoomEffect <= 133) {
23- // We're going to use scrollEffect(), so we'll need a copy of
24- // the current VirtScreen zero.
25- VirtScreen *vs = &virtscr[0];
26-
27- free(_scrollBuffer);
28- _scrollBuffer = (byte *) malloc(vs->h * vs->pitch);
29- memcpy(_scrollBuffer, vs->getPixels(0, 0), vs->h * vs->pitch);
30- }
31-}
32-
33 /**
34 * Perform a transition effect. There are four different effects possible:
35 * 0: Iris effect
36@@ -3244,13 +3232,68 @@
37 }
38 }
39
40+void ScummEngine::moveScreen(int dx, int dy, int height) {
41+ // Short circuit check - do we have to do anything anyway?
42+ if ((dx == 0 && dy == 0) || height <= 0)
43+ return;
44+
45+ byte *src, *dst;
46+ int x, y;
47+
48+ Graphics::Surface screen;
49+ assert(_system->grabRawScreen(&screen));
50+
51+ // vertical movement
52+ if (dy > 0) {
53+ // move down - copy from bottom to top
54+ dst = (byte *)screen.pixels + (height - 1) * _screenWidth;
55+ src = dst - dy * _screenWidth;
56+ for (y = dy; y < height; y++) {
57+ memcpy(dst, src, _screenWidth);
58+ src -= _screenWidth;
59+ dst -= _screenWidth;
60+ }
61+ } else if (dy < 0) {
62+ // move up - copy from top to bottom
63+ dst = (byte *)screen.pixels;
64+ src = dst - dy * _screenWidth;
65+ for (y = -dy; y < height; y++) {
66+ memcpy(dst, src, _screenWidth);
67+ src += _screenWidth;
68+ dst += _screenWidth;
69+ }
70+ }
71+
72+ // horizontal movement
73+ if (dx > 0) {
74+ // move right - copy from right to left
75+ dst = (byte *)screen.pixels + (_screenWidth - 1);
76+ src = dst - dx;
77+ for (y = 0; y < height; y++) {
78+ for (x = dx; x < _screenWidth; x++) {
79+ *dst-- = *src--;
80+ }
81+ src += _screenWidth + (_screenWidth - dx);
82+ dst += _screenWidth + (_screenWidth - dx);
83+ }
84+ } else if (dx < 0) {
85+ // move left - copy from left to right
86+ dst = (byte *)screen.pixels;
87+ src = dst - dx;
88+ for (y = 0; y < height; y++) {
89+ for (x = -dx; x < _screenWidth; x++) {
90+ *dst++ = *src++;
91+ }
92+ src += _screenWidth - (_screenWidth + dx);
93+ dst += _screenWidth - (_screenWidth + dx);
94+ }
95+ }
96+
97+ _system->copyRectToScreen((byte *)screen.pixels, screen.pitch, 0, 0, screen.w, screen.h);
98+ screen.free();
99+}
100+
101 void ScummEngine::scrollEffect(int dir) {
102- // It is at least technically possible that this function will be
103- // called without _scrollBuffer having been set up, but will it ever
104- // happen? I don't know.
105- if (!_scrollBuffer)
106- warning("scrollEffect: No scroll buffer. This may look bad");
107-
108 VirtScreen *vs = &virtscr[0];
109
110 int x, y;
111@@ -3266,17 +3309,14 @@
112 switch (dir) {
113 case 0:
114 //up
115- y = step;
116+ y = 1 + step;
117 while (y < vs->h) {
118- _system->copyRectToScreen(vs->getPixels(0, 0),
119+ moveScreen(0, -step, vs->h);
120+ _system->copyRectToScreen(vs->getPixels(0, y - step),
121 vs->pitch,
122- 0, vs->h - y,
123- vs->w, y);
124- if (_scrollBuffer)
125- _system->copyRectToScreen(_scrollBuffer + y * vs->w,
126- vs->pitch,
127- 0, 0,
128- vs->w, vs->h - y);
129+ 0, vs->h - step,
130+ vs->w, step);
131+ _system->updateScreen();
132 waitForTimer(kPictureDelay);
133
134 y += step;
135@@ -3284,17 +3324,14 @@
136 break;
137 case 1:
138 // down
139- y = step;
140+ y = 1 + step;
141 while (y < vs->h) {
142+ moveScreen(0, step, vs->h);
143 _system->copyRectToScreen(vs->getPixels(0, vs->h - y),
144 vs->pitch,
145 0, 0,
146- vs->w, y);
147- if (_scrollBuffer)
148- _system->copyRectToScreen(_scrollBuffer,
149- vs->pitch,
150- 0, y,
151- vs->w, vs->h - y);
152+ vs->w, step);
153+ _system->updateScreen();
154 waitForTimer(kPictureDelay);
155
156 y += step;
157@@ -3302,17 +3339,14 @@
158 break;
159 case 2:
160 // left
161- x = step;
162+ x = 1 + step;
163 while (x < vs->w) {
164- _system->copyRectToScreen(vs->getPixels(0, 0),
165+ moveScreen(-step, 0, vs->h);
166+ _system->copyRectToScreen(vs->getPixels(x - step, 0),
167 vs->pitch,
168- vs->w - x, 0,
169- x, vs->h);
170- if (_scrollBuffer)
171- _system->copyRectToScreen(_scrollBuffer + x,
172- vs->pitch,
173- 0, 0,
174- vs->w - x, vs->h);
175+ vs->w - step, 0,
176+ step, vs->h);
177+ _system->updateScreen();
178 waitForTimer(kPictureDelay);
179
180 x += step;
181@@ -3320,26 +3354,20 @@
182 break;
183 case 3:
184 // right
185- x = step;
186+ x = 1 + step;
187 while (x < vs->w) {
188+ moveScreen(step, 0, vs->h);
189 _system->copyRectToScreen(vs->getPixels(vs->w - x, 0),
190 vs->pitch,
191 0, 0,
192- x, vs->h);
193- if (_scrollBuffer)
194- _system->copyRectToScreen(_scrollBuffer,
195- vs->pitch,
196- x, 0,
197- vs->w - x, vs->h);
198+ step, vs->h);
199+ _system->updateScreen();
200 waitForTimer(kPictureDelay);
201
202 x += step;
203 }
204 break;
205 }
206-
207- free(_scrollBuffer);
208- _scrollBuffer = NULL;
209 }
210
211 void ScummEngine::unkScreenEffect6() {
212Index: engines/scumm/scumm.h
213===================================================================
214--- engines/scumm/scumm.h (revision 23186)
215+++ engines/scumm/scumm.h (working copy)
216@@ -988,8 +988,6 @@
217 byte _newEffect, _switchRoomEffect2, _switchRoomEffect;
218 bool _doEffect;
219
220- byte *_scrollBuffer;
221-
222 public:
223 bool isLightOn() const;
224
225@@ -1084,6 +1082,7 @@
226 void transitionEffect(int a);
227 void dissolveEffect(int width, int height);
228 void scrollEffect(int dir);
229+ void moveScreen(int dx, int dy, int height);
230
231 // bomp
232 public:
233Index: engines/scumm/he/script_v60he.cpp
234===================================================================
235--- engines/scumm/he/script_v60he.cpp (revision 23186)
236+++ engines/scumm/he/script_v60he.cpp (working copy)
237@@ -519,7 +519,6 @@
238 } else if (a) {
239 _switchRoomEffect = (byte)(a & 0xFF);
240 _switchRoomEffect2 = (byte)(a >> 8);
241- setScrollBuffer();
242 } else {
243 fadeIn(_newEffect);
244 }
245Index: engines/scumm/script_v5.cpp
246===================================================================
247--- engines/scumm/script_v5.cpp (revision 23186)
248+++ engines/scumm/script_v5.cpp (working copy)
249@@ -1926,7 +1926,6 @@
250 }
251 _switchRoomEffect = (byte)(a & 0xFF);
252 _switchRoomEffect2 = (byte)(a >> 8);
253- setScrollBuffer();
254 } else {
255 fadeIn(_newEffect);
256 }
257Index: engines/scumm/script_v6.cpp
258===================================================================
259--- engines/scumm/script_v6.cpp (revision 23186)
260+++ engines/scumm/script_v6.cpp (working copy)
261@@ -1707,7 +1707,6 @@
262 if (a) {
263 _switchRoomEffect = (byte)(a & 0xFF);
264 _switchRoomEffect2 = (byte)(a >> 8);
265- setScrollBuffer();
266 } else {
267 fadeIn(_newEffect);
268 }