From 9577a45cdd70ca7b9e471434478f9eba8e60374e Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Thu, 7 Jan 2010 15:50:58 +0000 Subject: SCI: fixed save/restorebits within screen class for displayscreen case, fixes kq6 menu bar svn-id: r47125 --- engines/sci/graphics/gfx.cpp | 10 ++++++++-- engines/sci/graphics/screen.cpp | 28 ++++++++++++++-------------- engines/sci/graphics/screen.h | 4 ++-- 3 files changed, 24 insertions(+), 18 deletions(-) (limited to 'engines/sci/graphics') diff --git a/engines/sci/graphics/gfx.cpp b/engines/sci/graphics/gfx.cpp index a6aed9ec5c..5f4e6a5b02 100644 --- a/engines/sci/graphics/gfx.cpp +++ b/engines/sci/graphics/gfx.cpp @@ -277,6 +277,12 @@ reg_t Gfx::BitsSave(const Common::Rect &rect, byte screenMask) { OffsetRect(workerRect); + if (screenMask == SCI_SCREEN_MASK_DISPLAY) { + // Adjust rect to upscaled hires + workerRect.top *= 2; workerRect.bottom *= 2; workerRect.bottom++; + workerRect.left *= 2; workerRect.right *= 2; workerRect.right++; + } + // now actually ask _screen how much space it will need for saving size = _screen->bitsGetDataSize(workerRect, screenMask); @@ -383,8 +389,8 @@ void Gfx::drawHiresCelAndShow(GuiResourceId viewId, int16 loopNo, int16 celNo, u // adjust curPort to upscaled hires clipRect = celRect; curPortRect = _curPort->rect; - curPortRect.top *= 2; curPortRect.bottom *= 2; - curPortRect.left *= 2; curPortRect.right *= 2; + curPortRect.top *= 2; curPortRect.bottom *= 2; curPortRect.bottom++; + curPortRect.left *= 2; curPortRect.right *= 2; curPortRect.right++; clipRect.clip(curPortRect); if (clipRect.isEmpty()) // nothing to draw return; diff --git a/engines/sci/graphics/screen.cpp b/engines/sci/graphics/screen.cpp index 6260645f53..a3131dec02 100644 --- a/engines/sci/graphics/screen.cpp +++ b/engines/sci/graphics/screen.cpp @@ -280,31 +280,31 @@ void Screen::bitsSave(Common::Rect rect, byte mask, byte *memoryPtr) { memcpy(memoryPtr, (void *)&mask, sizeof(mask)); memoryPtr += sizeof(mask); if (mask & SCI_SCREEN_MASK_VISUAL) { - bitsSaveScreen(rect, _visualScreen, memoryPtr); + bitsSaveScreen(rect, _visualScreen, _width, memoryPtr); bitsSaveDisplayScreen(rect, memoryPtr); } if (mask & SCI_SCREEN_MASK_PRIORITY) { - bitsSaveScreen(rect, _priorityScreen, memoryPtr); + bitsSaveScreen(rect, _priorityScreen, _width, memoryPtr); } if (mask & SCI_SCREEN_MASK_CONTROL) { - bitsSaveScreen(rect, _controlScreen, memoryPtr); + bitsSaveScreen(rect, _controlScreen, _width, memoryPtr); } if (mask & SCI_SCREEN_MASK_DISPLAY) { if (!_upscaledHires) error("bitsSave() called w/o being in upscaled hires mode"); - bitsSaveScreen(rect, _displayScreen, memoryPtr); + bitsSaveScreen(rect, _displayScreen, _displayWidth, memoryPtr); } } -void Screen::bitsSaveScreen(Common::Rect rect, byte *screen, byte *&memoryPtr) { +void Screen::bitsSaveScreen(Common::Rect rect, byte *screen, uint16 screenWidth, byte *&memoryPtr) { int width = rect.width(); int y; - screen += (rect.top * _width) + rect.left; + screen += (rect.top * screenWidth) + rect.left; for (y = rect.top; y < rect.bottom; y++) { memcpy(memoryPtr, (void*)screen, width); memoryPtr += width; - screen += _width; + screen += screenWidth; } } @@ -339,31 +339,31 @@ void Screen::bitsRestore(byte *memoryPtr) { memcpy((void *)&mask, memoryPtr, sizeof(mask)); memoryPtr += sizeof(mask); if (mask & SCI_SCREEN_MASK_VISUAL) { - bitsRestoreScreen(rect, memoryPtr, _visualScreen); + bitsRestoreScreen(rect, memoryPtr, _visualScreen, _width); bitsRestoreDisplayScreen(rect, memoryPtr); } if (mask & SCI_SCREEN_MASK_PRIORITY) { - bitsRestoreScreen(rect, memoryPtr, _priorityScreen); + bitsRestoreScreen(rect, memoryPtr, _priorityScreen, _width); } if (mask & SCI_SCREEN_MASK_CONTROL) { - bitsRestoreScreen(rect, memoryPtr, _controlScreen); + bitsRestoreScreen(rect, memoryPtr, _controlScreen, _width); } if (mask & SCI_SCREEN_MASK_DISPLAY) { if (!_upscaledHires) error("bitsRestore() called w/o being in upscaled hires mode"); - bitsRestoreScreen(rect, memoryPtr, _displayScreen); + bitsRestoreScreen(rect, memoryPtr, _displayScreen, _displayWidth); } } -void Screen::bitsRestoreScreen(Common::Rect rect, byte *&memoryPtr, byte *screen) { +void Screen::bitsRestoreScreen(Common::Rect rect, byte *&memoryPtr, byte *screen, uint16 screenWidth) { int width = rect.width(); int y; - screen += (rect.top * _width) + rect.left; + screen += (rect.top * screenWidth) + rect.left; for (y = rect.top; y < rect.bottom; y++) { memcpy((void*) screen, memoryPtr, width); memoryPtr += width; - screen += _width; + screen += screenWidth; } } diff --git a/engines/sci/graphics/screen.h b/engines/sci/graphics/screen.h index 881025cec0..fcf8b2b002 100644 --- a/engines/sci/graphics/screen.h +++ b/engines/sci/graphics/screen.h @@ -106,9 +106,9 @@ private: byte _colorWhite; byte _colorDefaultVectorData; - void bitsRestoreScreen(Common::Rect rect, byte *&memoryPtr, byte *screen); + void bitsRestoreScreen(Common::Rect rect, byte *&memoryPtr, byte *screen, uint16 screenWidth); void bitsRestoreDisplayScreen(Common::Rect rect, byte *&memoryPtr); - void bitsSaveScreen(Common::Rect rect, byte *screen, byte *&memoryPtr); + void bitsSaveScreen(Common::Rect rect, byte *screen, uint16 screenWidth, byte *&memoryPtr); void bitsSaveDisplayScreen(Common::Rect rect, byte *&memoryPtr); bool _unditherState; -- cgit v1.2.3