From d4ce60336166f2a18632e4bb3fe54d5bdff59651 Mon Sep 17 00:00:00 2001 From: Bastien Bouclet Date: Tue, 14 Dec 2010 19:11:16 +0000 Subject: MOHAWK: Rework Myst GFX updates - Initial card state is drawn to the back buffer - Script driven updates are drawn to the front buffer Allows opcode 28 (copy back buffer to screen) and opcodes 29/33 (copy image to screen / back buffer) to work properly. Fixes among others the generator room lights, and the matchbox. svn-id: r54907 --- engines/mohawk/console.cpp | 2 +- engines/mohawk/graphics.cpp | 104 ++++++++++++---------- engines/mohawk/graphics.h | 7 +- engines/mohawk/myst.cpp | 5 +- engines/mohawk/myst_areas.cpp | 74 ++++------------ engines/mohawk/myst_areas.h | 3 +- engines/mohawk/myst_scripts.cpp | 146 ++++++++++++++++--------------- engines/mohawk/myst_scripts.h | 5 +- engines/mohawk/myst_stacks/credits.cpp | 2 +- engines/mohawk/myst_stacks/intro.cpp | 9 +- engines/mohawk/myst_stacks/myst.cpp | 20 +++-- engines/mohawk/myst_stacks/preview.cpp | 4 +- engines/mohawk/myst_stacks/selenitic.cpp | 6 +- 13 files changed, 189 insertions(+), 198 deletions(-) (limited to 'engines/mohawk') diff --git a/engines/mohawk/console.cpp b/engines/mohawk/console.cpp index 8594b1c4f6..edf7247e22 100644 --- a/engines/mohawk/console.cpp +++ b/engines/mohawk/console.cpp @@ -174,7 +174,7 @@ bool MystConsole::Cmd_DrawImage(int argc, const char **argv) { rect = Common::Rect((uint16)atoi(argv[2]), (uint16)atoi(argv[3]), (uint16)atoi(argv[4]), (uint16)atoi(argv[5])); _vm->_gfx->copyImageToScreen((uint16)atoi(argv[1]), rect); - _vm->_gfx->updateScreen(); + _vm->_system->updateScreen(); return false; } diff --git a/engines/mohawk/graphics.cpp b/engines/mohawk/graphics.cpp index 64968723bd..46f2d3c0d7 100644 --- a/engines/mohawk/graphics.cpp +++ b/engines/mohawk/graphics.cpp @@ -235,8 +235,8 @@ MystGraphics::MystGraphics(MohawkEngine_Myst* vm) : GraphicsManager(), _vm(vm) { _pictureFile.entries = NULL; // Initialize our buffer - _mainScreen = new Graphics::Surface(); - _mainScreen->create(_vm->_system->getWidth(), _vm->_system->getHeight(), _pixelFormat.bytesPerPixel); + _backBuffer = new Graphics::Surface(); + _backBuffer->create(_vm->_system->getWidth(), _vm->_system->getHeight(), _pixelFormat.bytesPerPixel); } MystGraphics::~MystGraphics() { @@ -245,8 +245,8 @@ MystGraphics::~MystGraphics() { delete _pictDecoder; delete[] _pictureFile.entries; - _mainScreen->free(); - delete _mainScreen; + _backBuffer->free(); + delete _backBuffer; } static const char* picFileNames[] = { @@ -371,36 +371,50 @@ void MystGraphics::copyImageSectionToScreen(uint16 image, Common::Rect src, Comm // Convert from bitmap coordinates to surface coordinates uint16 top = surface->h - src.top - height; - for (uint16 i = 0; i < height; i++) - memcpy(_mainScreen->getBasePtr(dest.left, i + dest.top), surface->getBasePtr(src.left, top + i), width * surface->bytesPerPixel); + _vm->_system->copyRectToScreen((byte *)surface->getBasePtr(src.left, top), surface->pitch, dest.left, dest.top, width, height); +} + +void MystGraphics::copyImageSectionToBackBuffer(uint16 image, Common::Rect src, Common::Rect dest) { + // Clip the destination rect to the screen + if (dest.right > _vm->_system->getWidth() || dest.bottom > _vm->_system->getHeight()) + dest.debugPrint(4, "Clipping destination rect to the screen:"); + + dest.right = CLIP(dest.right, 0, _vm->_system->getWidth()); + dest.bottom = CLIP(dest.bottom, 0, _vm->_system->getHeight()); + + Graphics::Surface *surface = findImage(image)->getSurface(); + + debug(3, "Image Blit:"); + debug(3, "src.x: %d", src.left); + debug(3, "src.y: %d", src.top); + debug(3, "dest.x: %d", dest.left); + debug(3, "dest.y: %d", dest.top); + debug(3, "width: %d", src.width()); + debug(3, "height: %d", src.height()); + + uint16 width = MIN(surface->w, dest.width()); + uint16 height = MIN(surface->h, dest.height()); + + // Convert from bitmap coordinates to surface coordinates + uint16 top = surface->h - src.top - height; - // Add to the list of dirty rects - _dirtyRects.push_back(dest); + for (uint16 i = 0; i < height; i++) + memcpy(_backBuffer->getBasePtr(dest.left, i + dest.top), surface->getBasePtr(src.left, top + i), width * surface->bytesPerPixel); } void MystGraphics::copyImageToScreen(uint16 image, Common::Rect dest) { copyImageSectionToScreen(image, Common::Rect(0, 0, 544, 333), dest); } -void MystGraphics::updateScreen() { - // Only update the screen if there have been changes since last frame - if (!_dirtyRects.empty()) { - - // Copy any modified area - for (uint i = 0; i < _dirtyRects.size(); i++) { - Common::Rect &r = _dirtyRects[i]; - _vm->_system->copyRectToScreen((byte *)_mainScreen->getBasePtr(r.left, r.top), _mainScreen->pitch, r.left, r.top, r.width(), r.height()); - } +void MystGraphics::copyImageToBackBuffer(uint16 image, Common::Rect dest) { + copyImageSectionToBackBuffer(image, Common::Rect(0, 0, 544, 333), dest); +} - _vm->_system->updateScreen(); - _dirtyRects.clear(); - } +void MystGraphics::copyBackBufferToScreen(const Common::Rect &r) { + _vm->_system->copyRectToScreen((byte *)_backBuffer->getBasePtr(r.left, r.top), _backBuffer->pitch, r.left, r.top, r.width(), r.height()); } void MystGraphics::runTransition(uint16 type, Common::Rect rect, uint16 steps, uint16 delay) { - // Bypass dirty rects for animated updates - _dirtyRects.clear(); - switch (type) { case 0: { debugC(kDebugScript, "Left to Right"); @@ -413,15 +427,15 @@ void MystGraphics::runTransition(uint16 type, Common::Rect rect, uint16 steps, u _vm->_system->delayMillis(delay); - _dirtyRects.push_back(area); - updateScreen(); + copyBackBufferToScreen(area); + _vm->_system->updateScreen(); } if (area.right < rect.right) { area.left = area.right; area.right = rect.right; - _dirtyRects.push_back(area); - updateScreen(); + copyBackBufferToScreen(area); + _vm->_system->updateScreen(); } } break; @@ -436,15 +450,15 @@ void MystGraphics::runTransition(uint16 type, Common::Rect rect, uint16 steps, u _vm->_system->delayMillis(delay); - _dirtyRects.push_back(area); - updateScreen(); + copyBackBufferToScreen(area); + _vm->_system->updateScreen(); } if (area.left > rect.left) { area.right = area.left; area.left = rect.left; - _dirtyRects.push_back(area); - updateScreen(); + copyBackBufferToScreen(area); + _vm->_system->updateScreen(); } } break; @@ -459,15 +473,15 @@ void MystGraphics::runTransition(uint16 type, Common::Rect rect, uint16 steps, u _vm->_system->delayMillis(delay); - _dirtyRects.push_back(area); - updateScreen(); + copyBackBufferToScreen(area); + _vm->_system->updateScreen(); } if (area.bottom < rect.bottom) { area.top = area.bottom; area.bottom = rect.bottom; - _dirtyRects.push_back(area); - updateScreen(); + copyBackBufferToScreen(area); + _vm->_system->updateScreen(); } } break; @@ -482,15 +496,15 @@ void MystGraphics::runTransition(uint16 type, Common::Rect rect, uint16 steps, u _vm->_system->delayMillis(delay); - _dirtyRects.push_back(area); - updateScreen(); + copyBackBufferToScreen(area); + _vm->_system->updateScreen(); } if (area.top > rect.top) { area.bottom = area.top; area.top = rect.top; - _dirtyRects.push_back(area); - updateScreen(); + copyBackBufferToScreen(area); + _vm->_system->updateScreen(); } } break; @@ -498,8 +512,8 @@ void MystGraphics::runTransition(uint16 type, Common::Rect rect, uint16 steps, u warning("Unknown Update Direction"); //TODO: Replace minimal implementation - _dirtyRects.push_back(rect); - updateScreen(); + copyBackBufferToScreen(rect); + _vm->_system->updateScreen(); break; } } @@ -510,15 +524,15 @@ void MystGraphics::drawRect(Common::Rect rect, RectState state) { return; if (state == kRectEnabled) - _mainScreen->frameRect(rect, _pixelFormat.RGBToColor(0, 255, 0)); + _backBuffer->frameRect(rect, _pixelFormat.RGBToColor(0, 255, 0)); else if (state == kRectUnreachable) - _mainScreen->frameRect(rect, _pixelFormat.RGBToColor(0, 0, 255)); + _backBuffer->frameRect(rect, _pixelFormat.RGBToColor(0, 0, 255)); else - _mainScreen->frameRect(rect, _pixelFormat.RGBToColor(255, 0, 0)); + _backBuffer->frameRect(rect, _pixelFormat.RGBToColor(255, 0, 0)); } void MystGraphics::drawLine(const Common::Point &p1, const Common::Point &p2, uint32 color) { - _mainScreen->drawLine(p1.x, p1.y, p2.x, p2.y, color); + _backBuffer->drawLine(p1.x, p1.y, p2.x, p2.y, color); } RivenGraphics::RivenGraphics(MohawkEngine_Riven* vm) : GraphicsManager(), _vm(vm) { diff --git a/engines/mohawk/graphics.h b/engines/mohawk/graphics.h index f027f98d9f..873873ccda 100644 --- a/engines/mohawk/graphics.h +++ b/engines/mohawk/graphics.h @@ -111,8 +111,10 @@ public: void loadExternalPictureFile(uint16 stack); void copyImageSectionToScreen(uint16 image, Common::Rect src, Common::Rect dest); + void copyImageSectionToBackBuffer(uint16 image, Common::Rect src, Common::Rect dest); void copyImageToScreen(uint16 image, Common::Rect dest); - void updateScreen(); + void copyImageToBackBuffer(uint16 image, Common::Rect dest); + void copyBackBufferToScreen(const Common::Rect &r); void runTransition(uint16 type, Common::Rect rect, uint16 steps, uint16 delay); void drawRect(Common::Rect rect, RectState state); void drawLine(const Common::Point &p1, const Common::Point &p2, uint32 color); @@ -141,8 +143,7 @@ private: Common::File picFile; } _pictureFile; - Graphics::Surface *_mainScreen; - Common::Array _dirtyRects; + Graphics::Surface *_backBuffer; Graphics::PixelFormat _pixelFormat; }; diff --git a/engines/mohawk/myst.cpp b/engines/mohawk/myst.cpp index 0e791aadc6..7cafaf69a3 100644 --- a/engines/mohawk/myst.cpp +++ b/engines/mohawk/myst.cpp @@ -472,7 +472,7 @@ uint16 MohawkEngine_Myst::getCardBackgroundId() { } void MohawkEngine_Myst::drawCardBackground() { - _gfx->copyImageToScreen(getCardBackgroundId(), Common::Rect(0, 0, 544, 333)); + _gfx->copyImageToBackBuffer(getCardBackgroundId(), Common::Rect(0, 0, 544, 333)); } void MohawkEngine_Myst::changeToCard(uint16 card, bool updateScreen) { @@ -568,7 +568,8 @@ void MohawkEngine_Myst::changeToCard(uint16 card, bool updateScreen) { // Make sure the screen is updated if (updateScreen) { - _gfx->updateScreen(); + _gfx->copyBackBufferToScreen(Common::Rect(544, 333)); + _system->updateScreen(); } } diff --git a/engines/mohawk/myst_areas.cpp b/engines/mohawk/myst_areas.cpp index afb3bc7b14..030b5954bf 100644 --- a/engines/mohawk/myst_areas.cpp +++ b/engines/mohawk/myst_areas.cpp @@ -386,35 +386,18 @@ void MystResourceType8::drawDataToScreen() { } if (drawSubImage) { - uint16 imageToDraw = 0; - - if (_subImages[subImageId].wdib == 0xFFFF) { - // TODO: Think the reason for problematic screen updates in some rects is that they - // are these -1 cases. - // They need to be redrawn i.e. if the Myst marker switches are changed, but I don't think - // the rects are valid. This does not matter in the original engine as the screen update redraws - // the VIEW images, followed by the RLST resource images, and -1 for the WDIB is interpreted as - // "Do Not Draw Image" i.e so the VIEW image is shown through.. We need to fix screen update - // to do this same behaviour. - if (_vm->_view.conditionalImageCount == 0) - imageToDraw = _vm->_view.mainImage; - else { - for (uint16 i = 0; i < _vm->_view.conditionalImageCount; i++) - if (_vm->_scriptParser->getVar(_vm->_view.conditionalImages[i].var) < _vm->_view.conditionalImages[i].numStates) - imageToDraw = _vm->_view.conditionalImages[i].values[_vm->_scriptParser->getVar(_vm->_view.conditionalImages[i].var)]; - } - } else - imageToDraw = _subImages[subImageId].wdib; + uint16 imageToDraw = _subImages[subImageId].wdib; - _vm->_gfx->copyImageSectionToScreen(imageToDraw, _subImages[subImageId].rect, _rect); + // This special case means redraw background + if (imageToDraw == 0xFFFF) { + imageToDraw = _vm->getCardBackgroundId(); + } + + _vm->_gfx->copyImageSectionToBackBuffer(imageToDraw, _subImages[subImageId].rect, _rect); } } void MystResourceType8::drawConditionalDataToScreen(uint16 state, bool update) { - // Need to call overidden Type 7 function to ensure - // switch section is processed correctly. - MystResourceType7::drawDataToScreen(); - bool drawSubImage = false; int16 subImageId = 0; @@ -432,31 +415,20 @@ void MystResourceType8::drawConditionalDataToScreen(uint16 state, bool update) { if (drawSubImage) { - uint16 imageToDraw = 0; - - if (_subImages[subImageId].wdib == 0xFFFF) { - // TODO: Think the reason for problematic screen updates in some rects is that they - // are these -1 cases. - // They need to be redrawn i.e. if the Myst marker switches are changed, but I don't think - // the rects are valid. This does not matter in the original engine as the screen update redraws - // the VIEW images, followed by the RLST resource images, and -1 for the WDIB is interpreted as - // "Do Not Draw Image" i.e so the VIEW image is shown through.. We need to fix screen update - // to do this same behaviour. - if (_vm->_view.conditionalImageCount == 0) - imageToDraw = _vm->_view.mainImage; - else { - for (uint16 i = 0; i < _vm->_view.conditionalImageCount; i++) - if (_vm->_scriptParser->getVar(_vm->_view.conditionalImages[i].var) < _vm->_view.conditionalImages[i].numStates) - imageToDraw = _vm->_view.conditionalImages[i].values[_vm->_scriptParser->getVar(_vm->_view.conditionalImages[i].var)]; - } - } else - imageToDraw = _subImages[subImageId].wdib; + uint16 imageToDraw = _subImages[subImageId].wdib; - _vm->_gfx->copyImageSectionToScreen(imageToDraw, _subImages[subImageId].rect, _rect); + // This special case means redraw background + if (imageToDraw == 0xFFFF) { + imageToDraw = _vm->getCardBackgroundId(); + } // Draw to screen - if (update) - _vm->_gfx->updateScreen(); + if (update) { + _vm->_gfx->copyImageSectionToScreen(imageToDraw, _subImages[subImageId].rect, _rect); + _vm->_system->updateScreen(); + } else { + _vm->_gfx->copyImageSectionToBackBuffer(imageToDraw, _subImages[subImageId].rect, _rect); + } } } @@ -521,14 +493,6 @@ void MystResourceType10::restoreBackground() { _vm->_gfx->copyImageSectionToScreen(_vm->getCardBackgroundId(), src, dest); } -void MystResourceType10::drawDataToScreen() -{ - // Restore background - restoreBackground(); - - MystResourceType8::drawDataToScreen(); -} - void MystResourceType10::handleMouseDown(const Common::Point &mouse) { // Tell the engine we are dragging a resource _vm->_dragResource = this; @@ -775,7 +739,7 @@ MystResourceType12::~MystResourceType12() { void MystResourceType12::drawFrame(uint16 frame) { _currentFrame = _firstFrame + frame; _vm->_gfx->copyImageToScreen(_currentFrame, _frameRect); - _vm->_gfx->updateScreen(); + _vm->_system->updateScreen(); } MystResourceType13::MystResourceType13(MohawkEngine_Myst *vm, Common::SeekableReadStream *rlstStream, MystResource *parent) : MystResource(vm, rlstStream, parent) { diff --git a/engines/mohawk/myst_areas.h b/engines/mohawk/myst_areas.h index 81fbb0e216..c65c91ba55 100644 --- a/engines/mohawk/myst_areas.h +++ b/engines/mohawk/myst_areas.h @@ -203,17 +203,16 @@ public: MystResourceType10(MohawkEngine_Myst *vm, Common::SeekableReadStream *rlstStream, MystResource *parent); virtual ~MystResourceType10(); - void drawDataToScreen(); void handleMouseDown(const Common::Point &mousee); void handleMouseUp(const Common::Point &mouse); void handleMouseDrag(const Common::Point &mouse); void setStep(uint16 step); void setPosition(uint16 pos); + void restoreBackground(); protected: Common::Rect boundingBox(); void updatePosition(const Common::Point &mouse); - void restoreBackground(); uint16 _dragSound; uint16 _sliderWidth; diff --git a/engines/mohawk/myst_scripts.cpp b/engines/mohawk/myst_scripts.cpp index 5f27b3704c..de9d67e8ff 100644 --- a/engines/mohawk/myst_scripts.cpp +++ b/engines/mohawk/myst_scripts.cpp @@ -126,12 +126,12 @@ void MystScriptParser::setupCommonOpcodes() { // Opcode 25 is unused; original calls replaceSound OPCODE(26, o_stopSoundBackground); OPCODE(27, o_playSoundBlocking); - OPCODE(28, o_restoreDefaultRect); - OPCODE(29, o_blitRect); + OPCODE(28, o_copyBackBufferToScreen); + OPCODE(29, o_copyImageToBackBuffer); OPCODE(30, o_changeSound); OPCODE(31, o_soundPlaySwitch); OPCODE(32, o_soundResumeBackground); - OPCODE(33, o_blitRect); + OPCODE(33, o_copyImageToScreen); OPCODE(34, o_changeCard); OPCODE(35, o_drawImageChangeCard); OPCODE(36, o_changeMainCursor); @@ -360,10 +360,10 @@ void MystScriptParser::o_takePage(uint16 op, uint16 var, uint16 argc, uint16 *ar void MystScriptParser::o_redrawCard(uint16 op, uint16 var, uint16 argc, uint16 *argv) { debugC(kDebugScript, "Opcode %d: Redraw card", op); - // TODO: Is redrawing the background correct ? _vm->drawCardBackground(); _vm->drawResourceImages(); - _vm->_gfx->updateScreen(); + _vm->_gfx->copyBackBufferToScreen(Common::Rect(544, 333)); + _vm->_system->updateScreen(); } void MystScriptParser::o_goToDest(uint16 op, uint16 var, uint16 argc, uint16 *argv) { @@ -406,7 +406,7 @@ void MystScriptParser::o_drawAreaState(uint16 op, uint16 var, uint16 argc, uint1 } void MystScriptParser::o_redrawAreaForVar(uint16 op, uint16 var, uint16 argc, uint16 *argv) { - debugC(kDebugScript, "Opcode %d: dropPage", op); + debugC(kDebugScript, "Opcode %d: redraw area", op); debugC(kDebugScript, "\tvar: %d", var); _vm->redrawArea(var); @@ -577,81 +577,56 @@ void MystScriptParser::o_playSoundBlocking(uint16 op, uint16 var, uint16 argc, u _vm->_sound->playSoundBlocking(soundId); } -void MystScriptParser::o_restoreDefaultRect(uint16 op, uint16 var, uint16 argc, uint16 *argv) { - varUnusedCheck(op, var); +void MystScriptParser::o_copyBackBufferToScreen(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + debugC(kDebugScript, "Opcode %d: Copy back buffer to screen", op); Common::Rect rect; + if (argv[0] == 0xFFFF) { + // Used in Stoneship Card 2111 (Compass Rose) + // Used in Mechanical Card 6267 (Code Lock) + rect = _invokingResource->getRect(); + } else { + // Used in ... TODO: Fill in. + rect = Common::Rect(argv[0], argv[1], argv[2], argv[3]); + } - if (argc == 1 || argc == 4) { - debugC(kDebugScript, "Opcode %d: Restore VIEW Default Image in Region", op); - - if (argc == 1) { - // Used in Stoneship Card 2111 (Compass Rose) - // Used in Mechanical Card 6267 (Code Lock) - if (argv[0] == 0xFFFF) { - rect = _invokingResource->getRect(); - } else - unknown(op, var, argc, argv); - } else if (argc == 4) { - // Used in ... TODO: Fill in. - rect = Common::Rect(argv[0], argv[1], argv[2], argv[3]); - } else - warning("Opcode %d: argc Error", op); - - debugC(kDebugScript, "\trect.left: %d", rect.left); - debugC(kDebugScript, "\trect.top: %d", rect.top); - debugC(kDebugScript, "\trect.right: %d", rect.right); - debugC(kDebugScript, "\trect.bottom: %d", rect.bottom); - - Common::Rect src; - src.left = rect.left; - src.top = 333 - rect.bottom; - src.right = rect.right; - src.bottom = 333 - rect.top; + debugC(kDebugScript, "\trect.left: %d", rect.left); + debugC(kDebugScript, "\trect.top: %d", rect.top); + debugC(kDebugScript, "\trect.right: %d", rect.right); + debugC(kDebugScript, "\trect.bottom: %d", rect.bottom); - _vm->_gfx->copyImageSectionToScreen(_vm->getCardBackgroundId(), src, rect); - } else - unknown(op, var, argc, argv); + _vm->_gfx->copyBackBufferToScreen(rect); + _vm->_system->updateScreen(); } -void MystScriptParser::o_blitRect(uint16 op, uint16 var, uint16 argc, uint16 *argv) { - varUnusedCheck(op, var); - - // TODO: Opcode 29 called on Mechanical Card 6178 causes a engine - // abort this is because imageId is 7158 (not valid), but the - // script resource gives this as 7178 (valid)... - // FIXME: opcode 33 also hides the cursor when drawing if it is in the way +void MystScriptParser::o_copyImageToBackBuffer(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + uint16 imageId = argv[0]; - if (argc == 7) { - uint16 imageId = argv[0]; + Common::Rect srcRect = Common::Rect(argv[1], argv[2], argv[3], argv[4]); - Common::Rect srcRect = Common::Rect(argv[1], argv[2], argv[3], argv[4]); + Common::Rect dstRect = Common::Rect(argv[5], argv[6], 544, 333); - Common::Rect dstRect = Common::Rect(argv[5], argv[6], 544, 333); + if (dstRect.left == -1 || dstRect.top == -1) { + // Interpreted as full screen + dstRect.left = 0; + dstRect.top = 0; + } - if (dstRect.left == -1 || dstRect.top == -1) { - // Interpreted as full screen - dstRect.left = 0; - dstRect.top = 0; - } + dstRect.right = dstRect.left + srcRect.width(); + dstRect.bottom = dstRect.top + srcRect.height(); - dstRect.right = dstRect.left + srcRect.width(); - dstRect.bottom = dstRect.top + srcRect.height(); + debugC(kDebugScript, "Opcode %d: Copy image to back buffer", op); + debugC(kDebugScript, "\timageId: %d", imageId); + debugC(kDebugScript, "\tsrcRect.left: %d", srcRect.left); + debugC(kDebugScript, "\tsrcRect.top: %d", srcRect.top); + debugC(kDebugScript, "\tsrcRect.right: %d", srcRect.right); + debugC(kDebugScript, "\tsrcRect.bottom: %d", srcRect.bottom); + debugC(kDebugScript, "\tdstRect.left: %d", dstRect.left); + debugC(kDebugScript, "\tdstRect.top: %d", dstRect.top); + debugC(kDebugScript, "\tdstRect.right: %d", dstRect.right); + debugC(kDebugScript, "\tdstRect.bottom: %d", dstRect.bottom); - debugC(kDebugScript, "Opcode %d: Blit Image", op); - debugC(kDebugScript, "\timageId: %d", imageId); - debugC(kDebugScript, "\tsrcRect.left: %d", srcRect.left); - debugC(kDebugScript, "\tsrcRect.top: %d", srcRect.top); - debugC(kDebugScript, "\tsrcRect.right: %d", srcRect.right); - debugC(kDebugScript, "\tsrcRect.bottom: %d", srcRect.bottom); - debugC(kDebugScript, "\tdstRect.left: %d", dstRect.left); - debugC(kDebugScript, "\tdstRect.top: %d", dstRect.top); - debugC(kDebugScript, "\tdstRect.right: %d", dstRect.right); - debugC(kDebugScript, "\tdstRect.bottom: %d", dstRect.bottom); - - _vm->_gfx->copyImageSectionToScreen(imageId, srcRect, dstRect); - } else - unknown(op, var, argc, argv); + _vm->_gfx->copyImageSectionToBackBuffer(imageId, srcRect, dstRect); } // TODO: Implement common engine function for read and processing of sound blocks @@ -760,6 +735,37 @@ void MystScriptParser::o_soundResumeBackground(uint16 op, uint16 var, uint16 arg //_vm->_sound->resumeBackground(); } +void MystScriptParser::o_copyImageToScreen(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + uint16 imageId = argv[0]; + + Common::Rect srcRect = Common::Rect(argv[1], argv[2], argv[3], argv[4]); + + Common::Rect dstRect = Common::Rect(argv[5], argv[6], 544, 333); + + if (dstRect.left == -1 || dstRect.top == -1) { + // Interpreted as full screen + dstRect.left = 0; + dstRect.top = 0; + } + + dstRect.right = dstRect.left + srcRect.width(); + dstRect.bottom = dstRect.top + srcRect.height(); + + debugC(kDebugScript, "Opcode %d: Copy image to screen", op); + debugC(kDebugScript, "\timageId: %d", imageId); + debugC(kDebugScript, "\tsrcRect.left: %d", srcRect.left); + debugC(kDebugScript, "\tsrcRect.top: %d", srcRect.top); + debugC(kDebugScript, "\tsrcRect.right: %d", srcRect.right); + debugC(kDebugScript, "\tsrcRect.bottom: %d", srcRect.bottom); + debugC(kDebugScript, "\tdstRect.left: %d", dstRect.left); + debugC(kDebugScript, "\tdstRect.top: %d", dstRect.top); + debugC(kDebugScript, "\tdstRect.right: %d", dstRect.right); + debugC(kDebugScript, "\tdstRect.bottom: %d", dstRect.bottom); + + _vm->_gfx->copyImageSectionToScreen(imageId, srcRect, dstRect); + _vm->_system->updateScreen(); +} + void MystScriptParser::o_changeCard(uint16 op, uint16 var, uint16 argc, uint16 *argv) { debugC(kDebugScript, "Opcode %d: Change Card", op); @@ -789,7 +795,7 @@ void MystScriptParser::o_drawImageChangeCard(uint16 op, uint16 var, uint16 argc, debugC(kDebugScript, "\tdelay: %d", delay); _vm->_gfx->copyImageToScreen(imageId, Common::Rect(0, 0, 544, 333)); - _vm->_gfx->updateScreen(); + _vm->_system->updateScreen(); _vm->_system->delayMillis(delay * 100); _vm->changeToCard(cardId, true); } else diff --git a/engines/mohawk/myst_scripts.h b/engines/mohawk/myst_scripts.h index 92f4a765f0..ecf82ea6ce 100644 --- a/engines/mohawk/myst_scripts.h +++ b/engines/mohawk/myst_scripts.h @@ -101,10 +101,11 @@ public: DECLARE_OPCODE(o_playSound); DECLARE_OPCODE(o_stopSoundBackground); DECLARE_OPCODE(o_playSoundBlocking); - DECLARE_OPCODE(o_restoreDefaultRect); - DECLARE_OPCODE(o_blitRect); + DECLARE_OPCODE(o_copyBackBufferToScreen); + DECLARE_OPCODE(o_copyImageToBackBuffer); DECLARE_OPCODE(o_changeSound); DECLARE_OPCODE(o_soundPlaySwitch); + DECLARE_OPCODE(o_copyImageToScreen); DECLARE_OPCODE(o_soundResumeBackground); DECLARE_OPCODE(o_changeCard); DECLARE_OPCODE(o_drawImageChangeCard); diff --git a/engines/mohawk/myst_stacks/credits.cpp b/engines/mohawk/myst_stacks/credits.cpp index 152740139a..7bd652079b 100644 --- a/engines/mohawk/myst_stacks/credits.cpp +++ b/engines/mohawk/myst_stacks/credits.cpp @@ -75,7 +75,7 @@ void MystScriptParser_Credits::runPersistentScripts() { // Note: The modulus by 6 is because the 6th image is the one at imageBaseId _vm->_gfx->copyImageToScreen(_baseImageId + curImageIndex % 6, Common::Rect(0, 0, 544, 333)); - _vm->_gfx->updateScreen(); + _vm->_system->updateScreen(); _vm->_varStore->setVar(_creditsVar, curImageIndex + 1); _lastCardTime = _vm->_system->getMillis(); diff --git a/engines/mohawk/myst_stacks/intro.cpp b/engines/mohawk/myst_stacks/intro.cpp index 0741c22e1f..b2f5d927cb 100644 --- a/engines/mohawk/myst_stacks/intro.cpp +++ b/engines/mohawk/myst_stacks/intro.cpp @@ -173,13 +173,16 @@ void MystScriptParser_Intro::o_playIntroMovies(uint16 op, uint16 var, uint16 arg void MystScriptParser_Intro::opcode_201(uint16 op, uint16 var, uint16 argc, uint16 *argv) { varUnusedCheck(op, var); - _vm->_gfx->updateScreen(); + _vm->_gfx->copyBackBufferToScreen(Common::Rect(544, 333)); + _vm->_system->updateScreen(); _vm->_system->delayMillis(4 * 1000); - _vm->_gfx->copyImageToScreen(4, Common::Rect(0, 0, 544, 333)); + _vm->_gfx->copyImageToBackBuffer(4, Common::Rect(544, 333)); + _vm->_gfx->copyBackBufferToScreen(Common::Rect(544, 333)); + _vm->_system->updateScreen(); MystResourceType6 *resource = static_cast(_invokingResource); resource->playMovie(); - // TODO: Complete + // TODO: Complete / Fix } void MystScriptParser_Intro::opcode_300(uint16 op, uint16 var, uint16 argc, uint16 *argv) { diff --git a/engines/mohawk/myst_stacks/myst.cpp b/engines/mohawk/myst_stacks/myst.cpp index 89793c7bdf..2fc763ade9 100644 --- a/engines/mohawk/myst_stacks/myst.cpp +++ b/engines/mohawk/myst_stacks/myst.cpp @@ -579,7 +579,7 @@ void MystScriptParser_Myst::o_libraryBookPageTurnLeft(uint16 op, uint16 var, uin else _vm->_sound->playSound(_libraryBookSound2); - _vm->_gfx->updateScreen(); + _vm->_system->updateScreen(); } } @@ -597,7 +597,7 @@ void MystScriptParser_Myst::o_libraryBookPageTurnRight(uint16 op, uint16 var, ui else _vm->_sound->playSound(_libraryBookSound2); - _vm->_gfx->updateScreen(); + _vm->_system->updateScreen(); } } @@ -615,7 +615,7 @@ void MystScriptParser_Myst::o_fireplaceToggleButton(uint16 op, uint16 var, uint1 // Unset button for (uint i = 4795; i >= 4779; i--) { _vm->_gfx->copyImageToScreen(i, _invokingResource->getRect()); - _vm->_gfx->updateScreen(); + _vm->_system->updateScreen(); _vm->_system->delayMillis(1); } _fireplaceLines[var - 17] &= ~bitmask; @@ -623,7 +623,7 @@ void MystScriptParser_Myst::o_fireplaceToggleButton(uint16 op, uint16 var, uint1 // Set button for (uint i = 4779; i <= 4795; i++) { _vm->_gfx->copyImageToScreen(i, _invokingResource->getRect()); - _vm->_gfx->updateScreen(); + _vm->_system->updateScreen(); _vm->_system->delayMillis(1); } _fireplaceLines[var - 17] |= bitmask; @@ -1698,7 +1698,7 @@ void MystScriptParser_Myst::libraryCombinationBookTurnLeft() { else _vm->_sound->playSound(_libraryBookSound2); - _vm->_gfx->updateScreen(); + _vm->_system->updateScreen(); } } @@ -1724,7 +1724,7 @@ void MystScriptParser_Myst::libraryCombinationBookTurnRight() { else _vm->_sound->playSound(_libraryBookSound2); - _vm->_gfx->updateScreen(); + _vm->_system->updateScreen(); } } @@ -1879,7 +1879,8 @@ void MystScriptParser_Myst::towerRotationMap_run() { towerRotationDrawBuildings(); // Draw to screen - _vm->_gfx->updateScreen(); + _vm->_gfx->copyBackBufferToScreen(Common::Rect(106, 42, 459, 273)); + _vm->_system->updateScreen(); } uint32 time = _vm->_system->getMillis(); @@ -1998,7 +1999,7 @@ void MystScriptParser_Myst::towerRotationMapDrawLine(const Common::Point ¢er src.bottom = 333 - rect.top; // Redraw background - _vm->_gfx->copyImageSectionToScreen(_vm->getCardBackgroundId(), src, rect); + _vm->_gfx->copyImageSectionToBackBuffer(_vm->getCardBackgroundId(), src, rect); // Draw buildings towerRotationDrawBuildings(); @@ -2011,7 +2012,8 @@ void MystScriptParser_Myst::towerRotationMapDrawLine(const Common::Point ¢er // Draw line _vm->_gfx->drawLine(center, end, color); - _vm->_gfx->updateScreen(); + _vm->_gfx->copyBackBufferToScreen(rect); + _vm->_system->updateScreen(); } void MystScriptParser_Myst::towerRotationMapRotate() { diff --git a/engines/mohawk/myst_stacks/preview.cpp b/engines/mohawk/myst_stacks/preview.cpp index 169411cc00..64d0898000 100644 --- a/engines/mohawk/myst_stacks/preview.cpp +++ b/engines/mohawk/myst_stacks/preview.cpp @@ -115,12 +115,12 @@ void MystScriptParser_Preview::opcode_298(uint16 op, uint16 var, uint16 argc, ui // TODO: Flash Library Red // TODO: Move to run process based delay to prevent // blocking... - _vm->_gfx->updateScreen(); + _vm->_system->updateScreen(); _vm->_system->delayMillis(20 * 1000); for (uint16 imageId = 3001; imageId <= 3012; imageId++) { _vm->_gfx->copyImageToScreen(imageId, Common::Rect(0, 0, 544, 333)); - _vm->_gfx->updateScreen(); + _vm->_system->updateScreen(); _vm->_system->delayMillis(5 * 1000); } } diff --git a/engines/mohawk/myst_stacks/selenitic.cpp b/engines/mohawk/myst_stacks/selenitic.cpp index 183c92745d..161c90b6f5 100644 --- a/engines/mohawk/myst_stacks/selenitic.cpp +++ b/engines/mohawk/myst_stacks/selenitic.cpp @@ -872,12 +872,12 @@ void MystScriptParser_Selenitic::o_soundLockEndMove(uint16 op, uint16 var, uint1 *value = stepped; slider->setStep(stepped); - slider->drawDataToScreen(); - _vm->_gfx->updateScreen(); + slider->restoreBackground(); + slider->drawConditionalDataToScreen(1); uint16 soundId = slider->getList3(0); if (soundId) - _vm->_sound->playSoundBlocking(soundId); + _vm->_sound->playSound(soundId); _vm->_sound->stopSound(); _vm->_sound->resumeBackground(); -- cgit v1.2.3