diff options
author | Marcus Comstedt | 2011-05-04 23:54:57 +0200 |
---|---|---|
committer | Marcus Comstedt | 2011-05-05 00:04:10 +0200 |
commit | 379b3104a43111113fb33114945999933944475a (patch) | |
tree | aab50c0543afef95b243dcb0c2a3af7271febef1 | |
parent | db22f32a446ea31693c3c13f336fae776742e082 (diff) | |
download | scummvm-rg350-379b3104a43111113fb33114945999933944475a.tar.gz scummvm-rg350-379b3104a43111113fb33114945999933944475a.tar.bz2 scummvm-rg350-379b3104a43111113fb33114945999933944475a.zip |
DRASCULA: Handle pitch in code using lockScreen()
The surface returned by OSystem::lockScreen() can have a pitch which
differs from w * bytesPerPixel, so modify the code to take this into
account. Fixes FMV problems on Dreamcast.
-rw-r--r-- | engines/drascula/drascula.h | 4 | ||||
-rw-r--r-- | engines/drascula/graphics.cpp | 61 |
2 files changed, 43 insertions, 22 deletions
diff --git a/engines/drascula/drascula.h b/engines/drascula/drascula.h index ac3f86b9ba..b70384614f 100644 --- a/engines/drascula/drascula.h +++ b/engines/drascula/drascula.h @@ -573,8 +573,8 @@ public: void enterName(); bool soundIsActive(); void waitFrameSSN(); - void mixVideo(byte *OldScreen, byte *NewScreen); - void decodeRLE(byte *BufferRLE, byte *MiVideoRLE); + void mixVideo(byte *OldScreen, byte *NewScreen, uint16 oldPitch); + void decodeRLE(byte *BufferRLE, byte *MiVideoRLE, uint16 pitch = 320); void decodeOffset(byte *BufferOFF, byte *MiVideoOFF, int length); int playFrameSSN(Common::SeekableReadStream *stream); diff --git a/engines/drascula/graphics.cpp b/engines/drascula/graphics.cpp index 4cd91e48a0..0811fbede1 100644 --- a/engines/drascula/graphics.cpp +++ b/engines/drascula/graphics.cpp @@ -134,14 +134,18 @@ void DrasculaEngine::showFrame(Common::SeekableReadStream *stream, bool firstFra } byte *prevFrame = (byte *)malloc(64000); - byte *screenBuffer = (byte *)_system->lockScreen()->pixels; - memcpy(prevFrame, screenBuffer, 64000); + Graphics::Surface *screenSurf = _system->lockScreen(); + byte *screenBuffer = (byte *)screenSurf->pixels; + uint16 screenPitch = screenSurf->pitch; + for (int y = 0; y < 200; y++) { + memcpy(prevFrame+y*320, screenBuffer+y*screenPitch, 320); + } - decodeRLE(pcxData, screenBuffer); + decodeRLE(pcxData, screenBuffer, screenPitch); free(pcxData); if (!firstFrame) - mixVideo(screenBuffer, prevFrame); + mixVideo(screenBuffer, prevFrame, screenPitch); _system->unlockScreen(); _system->updateScreen(); @@ -446,7 +450,9 @@ void DrasculaEngine::screenSaver() { int x1_, y1_, off1, off2; - byte *screenBuffer = (byte *)_system->lockScreen()->pixels; + Graphics::Surface *screenSurf = _system->lockScreen(); + byte *screenBuffer = (byte *)screenSurf->pixels; + uint16 screenPitch = screenSurf->pitch; for (int i = 0; i < 200; i++) { for (int j = 0; j < 320; j++) { x1_ = j + tempRow[i]; @@ -464,7 +470,7 @@ void DrasculaEngine::screenSaver() { y1_ = checkWrapY(y1_); off2 = 320 * y1_ + x1_; - screenBuffer[320 * i + j] = ghost[bgSurface[off2] + (copia[off1] << 8)]; + screenBuffer[screenPitch * i + j] = ghost[bgSurface[off2] + (copia[off1] << 8)]; } } @@ -533,11 +539,14 @@ int DrasculaEngine::playFrameSSN(Common::SeekableReadStream *stream) { free(BufferSSN); waitFrameSSN(); - byte *screenBuffer = (byte *)_system->lockScreen()->pixels; + Graphics::Surface *screenSurf = _system->lockScreen(); + byte *screenBuffer = (byte *)screenSurf->pixels; + uint16 screenPitch = screenSurf->pitch; if (FrameSSN) - mixVideo(screenBuffer, screenSurface); + mixVideo(screenBuffer, screenSurface, screenPitch); else - memcpy(screenBuffer, screenSurface, 64000); + for (int y = 0; y < 200; y++) + memcpy(screenBuffer+y*screenPitch, screenSurface+y*320, 320); _system->unlockScreen(); _system->updateScreen(); @@ -549,11 +558,14 @@ int DrasculaEngine::playFrameSSN(Common::SeekableReadStream *stream) { decodeOffset(BufferSSN, screenSurface, length); free(BufferSSN); waitFrameSSN(); - byte *screenBuffer = (byte *)_system->lockScreen()->pixels; + Graphics::Surface *screenSurf = _system->lockScreen(); + byte *screenBuffer = (byte *)screenSurf->pixels; + uint16 screenPitch = screenSurf->pitch; if (FrameSSN) - mixVideo(screenBuffer, screenSurface); + mixVideo(screenBuffer, screenSurface, screenPitch); else - memcpy(screenBuffer, screenSurface, 64000); + for (int y = 0; y < 200; y++) + memcpy(screenBuffer+y*screenPitch, screenSurface+y*320, 320); _system->unlockScreen(); _system->updateScreen(); @@ -589,11 +601,12 @@ void DrasculaEngine::decodeOffset(byte *BufferOFF, byte *MiVideoOFF, int length) } } -void DrasculaEngine::decodeRLE(byte* srcPtr, byte* dstPtr) { + void DrasculaEngine::decodeRLE(byte* srcPtr, byte* dstPtr, uint16 pitch) { bool stopProcessing = false; byte pixel; uint repeat; - int curByte = 0; + int curByte = 0, curLine = 0; + pitch -= 320; while (!stopProcessing) { pixel = *srcPtr++; @@ -604,17 +617,25 @@ void DrasculaEngine::decodeRLE(byte* srcPtr, byte* dstPtr) { } for (uint j = 0; j < repeat; j++) { *dstPtr++ = pixel; - if (++curByte >= 64000) { - stopProcessing = true; - break; + if (++curByte >= 320) { + curByte = 0; + dstPtr += pitch; + if (++curLine >= 200) { + stopProcessing = true; + break; + } } } } } -void DrasculaEngine::mixVideo(byte *OldScreen, byte *NewScreen) { - for (int x = 0; x < 64000; x++) - OldScreen[x] ^= NewScreen[x]; +void DrasculaEngine::mixVideo(byte *OldScreen, byte *NewScreen, uint16 oldPitch) { + for (int y = 0; y < 200; y++) { + for (int x = 0; x < 320; x++) + OldScreen[x] ^= NewScreen[x]; + OldScreen += oldPitch; + NewScreen += 320; + } } void DrasculaEngine::waitFrameSSN() { |