diff -ur ScummVM-cvs20030128/scummvm/scumm/smush/scumm_renderer.cpp ScummVM-cvs20030128+hack/scummvm/scumm/smush/scumm_renderer.cpp
old
|
new
|
|
200 | 200 | _scumm(scumm), |
201 | 201 | _smixer(0), |
202 | 202 | _insaneSpeed(speed), |
203 | | _pending_updates(0) { |
| 203 | _pending_updates(0), |
| 204 | _startTime(_scumm->_system->get_msecs()) { |
204 | 205 | } |
205 | 206 | |
206 | | static ScummRenderer * s_renderer; |
| 207 | uint32 ScummRenderer::getElapsedTime() { |
| 208 | return _scumm->_system->get_msecs() - _startTime; |
| 209 | } |
207 | 210 | |
208 | | static void smush_handler(void * engine) { |
209 | | s_renderer->update(); |
| 211 | uint32 ScummRenderer::getFrameTime() { |
| 212 | return (getFrame() * _insaneSpeed) / 1000; |
210 | 213 | } |
211 | 214 | |
212 | 215 | Mixer * ScummRenderer::getMixer() { |
… |
… |
|
214 | 217 | _smixer = new ScummMixer(_scumm->_mixer); |
215 | 218 | if(!_smixer) error("unable to allocate a smush mixer"); |
216 | 219 | _smixer->_silentMixer = _scumm->_silentDigitalImuse; |
217 | | s_renderer = this; |
218 | | _scumm->_timer->installProcedure(&smush_handler, _insaneSpeed); |
219 | 220 | } |
220 | 221 | return _smixer; |
221 | 222 | } |
… |
… |
|
224 | 225 | _scumm->_insaneState = false; |
225 | 226 | _scumm->exitCutscene(); |
226 | 227 | if(_smixer) { |
227 | | _scumm->_timer->releaseProcedure(&smush_handler); |
228 | 228 | delete _smixer; |
229 | 229 | _smixer = 0; |
230 | 230 | } |
… |
… |
|
240 | 240 | } |
241 | 241 | |
242 | 242 | bool ScummRenderer::wait(int32 ms) { |
243 | | // Because waitForTimer() also is the function that checks for user |
244 | | // input we always want to call it at least once between frames, or |
245 | | // the user may become unable to interrupt the movie. |
246 | | do { |
247 | | _scumm->waitForTimer(1); |
248 | | } while(_pending_updates <= 0); |
249 | | return true; |
| 243 | int32 elapsed_time, frame_time; |
| 244 | |
| 245 | elapsed_time = getElapsedTime(); |
| 246 | frame_time = getFrameTime(); |
| 247 | |
| 248 | if (frame_time < elapsed_time) { |
| 249 | // Don't wait -- just check for user input. |
| 250 | _scumm->waitForTimer(0); |
| 251 | } else { |
| 252 | _scumm->waitForTimer(frame_time - elapsed_time); |
| 253 | } |
| 254 | return true; |
250 | 255 | } |
251 | 256 | |
252 | 257 | bool ScummRenderer::startDecode(const char * fname, int32 version, int32 nbframes) { |
… |
… |
|
277 | 282 | } |
278 | 283 | |
279 | 284 | void ScummRenderer::save(int32 frame) { |
| 285 | int32 elapsed_time, frame_time; |
| 286 | |
280 | 287 | int width = MIN(getWidth(), _scumm->_realWidth); |
281 | 288 | int height = MIN(getHeight(), _scumm->_realHeight); |
282 | | |
| 289 | |
| 290 | elapsed_time = getElapsedTime(); |
| 291 | frame_time = getFrameTime(); |
283 | 292 | |
284 | 293 | // In theory, this will always be true. In reality, there may be |
285 | 294 | // several pending updates because the computer wasn't fast enough to |
286 | | // process them all. In that case, skip the frame to catch up. |
287 | | if (--_pending_updates <= 0) { |
| 295 | // process them all. If we lag too far behind, skip frames in an |
| 296 | // attempt to catch up. |
| 297 | |
| 298 | if (elapsed_time - frame_time < 200) { |
288 | 299 | _scumm->_system->copy_rect((const byte *)data(), getWidth(), 0, 0, width, height); |
289 | 300 | _scumm->_system->update_screen(); |
290 | 301 | } else { |
diff -ur ScummVM-cvs20030128/scummvm/scumm/smush/scumm_renderer.h ScummVM-cvs20030128+hack/scummvm/scumm/smush/scumm_renderer.h
old
|
new
|
|
46 | 46 | ScummMixer * _smixer; |
47 | 47 | uint32 _insaneSpeed; |
48 | 48 | volatile int _pending_updates; |
| 49 | uint32 _startTime; |
| 50 | uint32 getElapsedTime(); |
| 51 | uint32 getFrameTime(); |
49 | 52 | public: |
50 | 53 | ScummRenderer(Scumm * scumm, uint32 speed); |
51 | 54 | virtual ~ScummRenderer(); |