diff options
-rw-r--r-- | engines/sci/gui/gui.cpp | 23 | ||||
-rw-r--r-- | engines/sci/gui/gui_palette.cpp | 2 | ||||
-rw-r--r-- | engines/sci/gui/gui_transitions.cpp | 62 | ||||
-rw-r--r-- | engines/sci/gui/gui_transitions.h | 9 |
4 files changed, 81 insertions, 15 deletions
diff --git a/engines/sci/gui/gui.cpp b/engines/sci/gui/gui.cpp index f5cbf6b9ff..f31da098cb 100644 --- a/engines/sci/gui/gui.cpp +++ b/engines/sci/gui/gui.cpp @@ -254,7 +254,7 @@ void SciGui::display(const char *text, int argc, reg_t *argv) { if (bgcolor != -1) _gfx->FillRect(rect, SCI_SCREEN_MASK_VISUAL, bgcolor, 0, 0); _gfx->TextBox(text, 0, rect, align, -1); - if (!_screen->_picNotValid && bRedraw) + if (_screen->_picNotValid == 0 && bRedraw) _gfx->BitsShow(rect); // restoring port and cursor pos GuiPort *currport = _gfx->GetPort(); @@ -304,9 +304,9 @@ void SciGui::drawPicture(GuiResourceId pictureId, int16 animationNr, bool mirror GuiPort *oldPort = _gfx->SetPort((GuiPort *)_windowMgr->_picWind); if (_windowMgr->isFrontWindow(_windowMgr->_picWind)) { + _screen->_picNotValid = 1; _gfx->drawPicture(pictureId, animationNr, mirroredFlag, addToFlag, EGApaletteNo); _transitions->setup(animationNr); - _screen->_picNotValid = 1; } else { _windowMgr->BeginUpdate(_windowMgr->_picWind); _gfx->drawPicture(pictureId, animationNr, mirroredFlag, addToFlag, EGApaletteNo); @@ -332,7 +332,7 @@ void SciGui::drawControlButton(Common::Rect rect, reg_t obj, const char *text, i rect.grow(1); if (style & 8) // selected _gfx->FrameRect(rect); - if (!_screen->_picNotValid) { + if (_screen->_picNotValid == 0) { rect.grow(1); _gfx->BitsShow(rect); } @@ -352,7 +352,7 @@ void SciGui::drawControlText(Common::Rect rect, reg_t obj, const char *text, int _gfx->FrameRect(rect); } rect.grow(1); - if (!_screen->_picNotValid) + if (_screen->_picNotValid == 0) _gfx->BitsShow(rect); } else { _gfx->InvertRect(rect); @@ -377,7 +377,7 @@ void SciGui::drawControlTextEdit(Common::Rect rect, reg_t obj, const char *text, _gfx->SetFont(oldFontId); rect.grow(1); } - if (!_screen->_picNotValid) + if (_screen->_picNotValid == 0) _gfx->BitsShow(rect); } @@ -387,7 +387,7 @@ void SciGui::drawControlIcon(Common::Rect rect, reg_t obj, GuiResourceId viewId, if (style & 0x20) { _gfx->FrameRect(rect); } - if (!_screen->_picNotValid) + if (_screen->_picNotValid == 0) _gfx->BitsShow(rect); } else { _gfx->InvertRect(rect); @@ -402,7 +402,7 @@ void SciGui::drawControlList(Common::Rect rect, reg_t obj, int16 maxChars, int16 if (isAlias && (style & 8)) { _gfx->FrameRect(rect); } - if (!_screen->_picNotValid) + if (_screen->_picNotValid == 0) _gfx->BitsShow(rect); } } @@ -505,10 +505,13 @@ uint16 SciGui::onControl(byte screenMask, Common::Rect rect) { } void SciGui::animateShowPic() { - GuiPort *oldPort = _gfx->SetPort((GuiPort *)_windowMgr->_picWind); + GuiPort *picPort = _windowMgr->_picWind; + Common::Rect picRect = picPort->rect; - _transitions->doit(_gfx->GetPort()->rect); - _gfx->SetPort(oldPort); + // Adjust picRect to become relative to screen + picRect.top += picPort->top; picRect.bottom += picPort->top; + picRect.left += picPort->left; picRect.right += picPort->left; + _transitions->doit(picRect); } void SciGui::animate(reg_t listReference, bool cycle, int argc, reg_t *argv) { diff --git a/engines/sci/gui/gui_palette.cpp b/engines/sci/gui/gui_palette.cpp index 32c29f16ea..2e2ae650ae 100644 --- a/engines/sci/gui/gui_palette.cpp +++ b/engines/sci/gui/gui_palette.cpp @@ -191,7 +191,7 @@ void SciGuiPalette::set(GuiPalette *sciPal, int16 flag) { if (flag == 2 || sciPal->timestamp != systime) { merge(sciPal, &_sysPalette, flag); sciPal->timestamp = _sysPalette.timestamp; - if (!_screen->_picNotValid && systime != _sysPalette.timestamp) + if (_screen->_picNotValid == 0 && systime != _sysPalette.timestamp) setOnScreen(); } } diff --git a/engines/sci/gui/gui_transitions.cpp b/engines/sci/gui/gui_transitions.cpp index 9983982415..7ee269f9fa 100644 --- a/engines/sci/gui/gui_transitions.cpp +++ b/engines/sci/gui/gui_transitions.cpp @@ -30,6 +30,7 @@ #include "sci/sci.h" #include "sci/engine/state.h" #include "sci/tools.h" +#include "sci/gui/gui.h" #include "sci/gui/gui_screen.h" #include "sci/gui/gui_palette.h" #include "sci/gui/gui_transitions.h" @@ -52,11 +53,64 @@ void SciGuiTransitions::setup(int16 number) { } void SciGuiTransitions::doit(Common::Rect picRect) { - // TODO: Implement animations - warning("SciGuiTransitions: animation %d not implemented", _number); - _palette->setOnScreen(); - _screen->copyToScreen(); + _picRect = picRect; + + switch (_number) { + case SCI_TRANSITIONS_FADEPALETTE: + fadeOut(); + setNewScreen(); + fadeIn(); + break; + + default: + warning("SciGuiTransitions: %d not implemented", _number); + setNewPalette(); + setNewScreen(); + } _screen->_picNotValid = 0; } +void SciGuiTransitions::setNewPalette() { + _palette->setOnScreen(); +} + +void SciGuiTransitions::setNewScreen() { + _screen->copyRectToScreen(_picRect); + g_system->updateScreen(); +} + +void SciGuiTransitions::fadeOut() { + byte oldPalette[4 * 256], workPalette[4 * 256]; + int16 stepNr, colorNr; + + g_system->grabPalette(oldPalette, 0, 256); + + for (stepNr = 100; stepNr >= 0; stepNr -= 5) { + for (colorNr = 0; colorNr < 256; colorNr++){ + workPalette[colorNr * 4 + 0] = oldPalette[colorNr * 4] * stepNr / 100; + workPalette[colorNr * 4 + 1] = oldPalette[colorNr * 4 + 1] * stepNr / 100; + workPalette[colorNr * 4 + 2] = oldPalette[colorNr * 4 + 2] * stepNr / 100; + } + g_system->setPalette(workPalette, 0, 256); + _gui->wait(1); + } +} + +void SciGuiTransitions::fadeIn() { + byte workPalette[4 * 256]; + GuiPalette *newPalette = &_palette->_sysPalette; + int16 stepNr, colorNr; + + for (stepNr = 0; stepNr <= 100; stepNr += 5) { + for (colorNr = 0; colorNr < 256; colorNr++){ + workPalette[colorNr * 4 + 0] = newPalette->colors[colorNr].r * stepNr / 100; + workPalette[colorNr * 4 + 1] = newPalette->colors[colorNr].g * stepNr / 100; + workPalette[colorNr * 4 + 2] = newPalette->colors[colorNr].b * stepNr / 100; + workPalette[colorNr * 4 + 3] = 100; + } + g_system->setPalette(workPalette, 0, 256); + _gui->wait(1); + } +} + } // End of namespace Sci diff --git a/engines/sci/gui/gui_transitions.h b/engines/sci/gui/gui_transitions.h index b2b9d183ea..10090ada3c 100644 --- a/engines/sci/gui/gui_transitions.h +++ b/engines/sci/gui/gui_transitions.h @@ -30,6 +30,10 @@ namespace Sci { +enum { + SCI_TRANSITIONS_FADEPALETTE = 10 +}; + class SciGuiScreen; class SciGuiTransitions { public: @@ -41,12 +45,17 @@ public: private: void init(void); + void SciGuiTransitions::setNewPalette(); + void SciGuiTransitions::setNewScreen(); + void SciGuiTransitions::fadeOut(); + void SciGuiTransitions::fadeIn(); SciGui *_gui; SciGuiScreen *_screen; SciGuiPalette *_palette; int16 _number; + Common::Rect _picRect; }; } // End of namespace Sci |