From 6c101f7c1aad4d401e793ada760bba33432773b1 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Fri, 30 Oct 2009 09:26:14 +0000 Subject: SCI/newgui: Reanimate implemented svn-id: r45527 --- engines/sci/gui/gui.cpp | 12 +++++- engines/sci/gui/gui_animate.cpp | 77 ++++++++++++++++++++++++--------------- engines/sci/gui/gui_animate.h | 6 ++- engines/sci/gui/gui_helpers.h | 1 + engines/sci/gui/gui_windowmgr.cpp | 6 +-- engines/sci/gui/gui_windowmgr.h | 4 +- 6 files changed, 67 insertions(+), 39 deletions(-) diff --git a/engines/sci/gui/gui.cpp b/engines/sci/gui/gui.cpp index 3d5a0728ab..b86a1dc065 100644 --- a/engines/sci/gui/gui.cpp +++ b/engines/sci/gui/gui.cpp @@ -59,7 +59,7 @@ SciGui::SciGui(EngineState *state, SciGuiScreen *screen, SciGuiPalette *palette, _transitions = new SciGuiTransitions(this, _screen, _palette, _s->resMan->isVGA()); _animate = new SciGuiAnimate(_s, _gfx, _screen, _palette); _text = new SciGuiText(_s->resMan, _gfx, _screen); - _windowMgr = new SciGuiWindowMgr(_screen, _gfx, _animate, _text); + _windowMgr = new SciGuiWindowMgr(this, _screen, _gfx, _text); _controls = new SciGuiControls(_s->_segMan, _gfx, _text); // _gui32 = new SciGui32(_s, _screen, _palette, _cursor); // for debug purposes } @@ -232,7 +232,7 @@ void SciGui::display(const char *text, int argc, reg_t *argv) { _gfx->BitsGetRect(argv[0], &rect); rect.translate(-_gfx->GetPort()->left, -_gfx->GetPort()->top); _gfx->BitsRestore(argv[0]); - _animate->reAnimate(rect); + graphRedrawBox(rect); // finishing loop argc = 0; break; @@ -452,7 +452,15 @@ void SciGui::graphUpdateBox(Common::Rect rect) { } void SciGui::graphRedrawBox(Common::Rect rect) { + localToGlobal(&rect.left, &rect.top); + localToGlobal(&rect.right, &rect.bottom); + GuiPort *oldPort = _gfx->SetPort((GuiPort *)_windowMgr->_picWind); + globalToLocal(&rect.left, &rect.top); + globalToLocal(&rect.right, &rect.bottom); + _animate->reAnimate(rect); + + _gfx->SetPort(oldPort); } int16 SciGui::picNotValid(int16 newPicNotValid) { diff --git a/engines/sci/gui/gui_animate.cpp b/engines/sci/gui/gui_animate.cpp index ec6e8520c7..a130e44eea 100644 --- a/engines/sci/gui/gui_animate.cpp +++ b/engines/sci/gui/gui_animate.cpp @@ -44,11 +44,17 @@ SciGuiAnimate::SciGuiAnimate(EngineState *state, SciGuiGfx *gfx, SciGuiScreen *s } SciGuiAnimate::~SciGuiAnimate() { + if (_listData) + free(_listData); + if (_lastCastData) + free(_lastCastData); } void SciGuiAnimate::init() { _listData = NULL; - _listSize = 0; + _listCount = 0; + _lastCastData = NULL; + _lastCastCount = 0; _ignoreFastCast = false; // fastCast object is not found in any SCI games prior SCI1 @@ -61,9 +67,7 @@ void SciGuiAnimate::init() { } void SciGuiAnimate::disposeLastCast() { - // FIXME - //if (!_lastCast->first.isNull()) - //_lastCast->DeleteList(); + _lastCastCount = 0; } bool SciGuiAnimate::invoke(List *list, int argc, reg_t *argv) { @@ -126,13 +130,20 @@ void SciGuiAnimate::makeSortedList(List *list) { return; // Adjust list size, if needed - if ((_listData == NULL) || (_listSize < listCount)) { + if ((_listData == NULL) || (_listCount < listCount)) { if (_listData) free(_listData); _listData = (GuiAnimateEntry *)malloc(listCount * sizeof(GuiAnimateEntry)); if (!_listData) - error("Could not allocate memory for _animateList"); - _listSize = listCount; + error("Could not allocate memory for _listData"); + _listCount = listCount; + + if (_lastCastData) + free(_lastCastData); + _lastCastData = (GuiAnimateEntry *)malloc(listCount * sizeof(GuiAnimateEntry)); + if (!_lastCastData) + error("Could not allocate memory for _lastCastData"); + _lastCastCount = 0; } // Fill the list @@ -342,11 +353,14 @@ void SciGuiAnimate::drawCels() { SegManager *segMan = _s->_segMan; reg_t curObject; GuiAnimateEntry *listEntry; + GuiAnimateEntry *lastCastEntry = _lastCastData; uint16 signal; reg_t bitsHandle; GuiAnimateList::iterator listIterator; GuiAnimateList::iterator listEnd = _list.end(); + _lastCastCount = 0; + listIterator = _list.begin(); while (listIterator != listEnd) { listEntry = *listIterator; @@ -366,17 +380,10 @@ void SciGuiAnimate::drawCels() { signal &= 0xFFFF ^ kSignalRemoveView; } listEntry->signal = signal; - -// HEAPHANDLE hNewCast = heapNewPtr(sizeof(sciCast), kDataCast); -// sciCast *pNewCast = (sciCast *)heap2Ptr(hNewCast); -// pNewCast->view = view; -// pNewCast->loop = loop; -// pNewCast->cel = cel; -// pNewCast->z = z; -// pNewCast->pal = pal; -// pNewCast->hSaved = 0; -// pNewCast->rect = *rect; -// _lastCast->AddToEnd(hNewCast); + + // Remember that entry in lastCast + memcpy(lastCastEntry, listEntry, sizeof(GuiAnimateEntry)); + lastCastEntry++; _lastCastCount++; } listIterator++; } @@ -475,16 +482,30 @@ void SciGuiAnimate::restoreAndDelete(int argc, reg_t *argv) { } void SciGuiAnimate::reAnimate(Common::Rect rect) { - // TODO: implement ReAnimate - _gfx->BitsShow(rect); + GuiAnimateEntry *lastCastEntry; + uint16 lastCastCount; + + if (_lastCastCount > 0) { + lastCastEntry = _lastCastData; + lastCastCount = _lastCastCount; + while (lastCastCount > 0) { + lastCastEntry->castHandle = _gfx->BitsSave(lastCastEntry->celRect, SCI_SCREEN_MASK_VISUAL|SCI_SCREEN_MASK_PRIORITY); + _gfx->drawCel(lastCastEntry->viewId, lastCastEntry->loopNo, lastCastEntry->celNo, lastCastEntry->celRect, lastCastEntry->priority, lastCastEntry->paletteNo); + lastCastEntry++; lastCastCount--; + } + _gfx->BitsShow(rect); + // restoring + lastCastCount = _lastCastCount; + while (lastCastCount > 0) { + lastCastEntry--; + _gfx->BitsRestore(lastCastEntry->castHandle); + lastCastCount--; + } + } else { + _gfx->BitsShow(rect); + } /* - _s->_gui->localToGlobal(rect.left, rect.top); - _s->_gui->localToGlobal(rect.right, rect.bottom); - GuiPort *oldPort = _gfx->SetPort((GuiPort *)_picWind); - _s->_gui->globalToLocal(rect.left, rect.top); - _s->_gui->globalToLocal(rect.right, rect.bottom); - if (!_lastCast->isEmpty()) { HEAPHANDLE hnode = _lastCast->getFirst(); sciCast *pCast; @@ -504,10 +525,6 @@ void SciGuiAnimate::reAnimate(Common::Rect rect) { _gfx->BitsShow(pCast->hSaved); hnode = pCast->node.prev; } - } else - _gfx->BitsShow(rect); - - _gfx->SetPort(oldPort); */ } diff --git a/engines/sci/gui/gui_animate.h b/engines/sci/gui/gui_animate.h index b734d5c50e..f3c19448e0 100644 --- a/engines/sci/gui/gui_animate.h +++ b/engines/sci/gui/gui_animate.h @@ -84,10 +84,12 @@ private: SciGuiScreen *_screen; SciGuiPalette *_palette; - uint16 _listSize; + uint16 _listCount; GuiAnimateEntry *_listData; GuiAnimateList _list; - //List *_lastCast; + + uint16 _lastCastCount; + GuiAnimateEntry *_lastCastData; bool _ignoreFastCast; }; diff --git a/engines/sci/gui/gui_helpers.h b/engines/sci/gui/gui_helpers.h index 191b7039a1..6bc91797b8 100644 --- a/engines/sci/gui/gui_helpers.h +++ b/engines/sci/gui/gui_helpers.h @@ -87,6 +87,7 @@ struct GuiAnimateEntry { uint16 signal; Common::Rect celRect; bool showBitsFlag; + GuiMemoryHandle castHandle; }; typedef Common::List GuiAnimateList; diff --git a/engines/sci/gui/gui_windowmgr.cpp b/engines/sci/gui/gui_windowmgr.cpp index de9fe7ac0a..ba0464b57b 100644 --- a/engines/sci/gui/gui_windowmgr.cpp +++ b/engines/sci/gui/gui_windowmgr.cpp @@ -44,8 +44,8 @@ enum { SCI_WINDOWMGR_STYLE_USER = (1 << 7) }; -SciGuiWindowMgr::SciGuiWindowMgr(SciGuiScreen *screen, SciGuiGfx *gfx, SciGuiAnimate *animate, SciGuiText *text) - : _screen(screen), _gfx(gfx), _animate(animate), _text(text) { +SciGuiWindowMgr::SciGuiWindowMgr(SciGui *gui, SciGuiScreen *screen, SciGuiGfx *gfx, SciGuiText *text) + : _gui(gui), _screen(screen), _gfx(gfx), _text(text) { } SciGuiWindowMgr::~SciGuiWindowMgr() { @@ -257,7 +257,7 @@ void SciGuiWindowMgr::DisposeWindow(GuiWindow *pWnd, int16 arg2) { if (arg2) _gfx->BitsShow(pWnd->restoreRect); else - _animate->reAnimate(pWnd->restoreRect); + _gui->graphRedrawBox(pWnd->restoreRect); _windowList.remove(pWnd); _gfx->SetPort(_windowList.back()); _windowsById[pWnd->id] = 0; diff --git a/engines/sci/gui/gui_windowmgr.h b/engines/sci/gui/gui_windowmgr.h index e848a68335..01796b078b 100644 --- a/engines/sci/gui/gui_windowmgr.h +++ b/engines/sci/gui/gui_windowmgr.h @@ -33,7 +33,7 @@ namespace Sci { class SciGuiWindowMgr { public: - SciGuiWindowMgr(SciGuiScreen *screen, SciGuiGfx *gfx, SciGuiAnimate *animate, SciGuiText *text); + SciGuiWindowMgr(SciGui *gui, SciGuiScreen *screen, SciGuiGfx *gfx, SciGuiText *text); ~SciGuiWindowMgr(); void init(Common::String gameName); @@ -54,9 +54,9 @@ public: private: typedef Common::List PortList; + SciGui *_gui; SciGuiScreen *_screen; SciGuiGfx *_gfx; - SciGuiAnimate *_animate; SciGuiText *_text; /** The list of open 'windows' (and ports), in visual order. */ -- cgit v1.2.3