From eefa151d70c66558d4f40b41a32b1e0df30c1d89 Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Mon, 1 Nov 2010 16:09:33 +0000 Subject: SCI: saving/restoring script created windows now fixes "GfxPorts::kernelSetActive" error based on code by [md5] svn-id: r54012 --- engines/sci/engine/savegame.cpp | 65 +++++++++- engines/sci/engine/savegame.h | 156 +++++++++++----------- engines/sci/graphics/helpers.h | 252 ++++++++++++++++++++---------------- engines/sci/graphics/ports.cpp | 9 -- engines/sci/graphics/ports.h | 278 +++++++++++++++++++++------------------- 5 files changed, 426 insertions(+), 334 deletions(-) (limited to 'engines') diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 0b6caa515b..ffe91534b8 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -40,6 +40,7 @@ #include "sci/engine/selector.h" #include "sci/engine/vm_types.h" #include "sci/engine/script.h" // for SCI_OBJ_EXPORTS and SCI_OBJ_SYNONYMS +#include "sci/graphics/helpers.h" #include "sci/graphics/palette.h" #include "sci/graphics/ports.h" #include "sci/sound/audio.h" @@ -175,9 +176,6 @@ void syncWithSerializer(Common::Serializer &s, Class &obj) { } static void sync_SavegameMetadata(Common::Serializer &s, SavegameMetadata &obj) { - // TODO: It would be a good idea to store a magic number & a header size here, - // so that we can implement backward compatibility if the savegame format changes. - s.syncString(obj.name); s.syncVersion(CURRENT_SAVEGAME_VERSION); obj.version = s.getVersion(); @@ -605,6 +603,61 @@ void GfxPalette::saveLoadWithSerializer(Common::Serializer &s) { } } +void GfxPorts::saveLoadWithSerializer(Common::Serializer &s) { + if (s.isLoading()) + reset(); // remove all script generated windows + + if (s.getVersion() >= 27) { + uint windowCount = 0; + uint id = PORTS_FIRSTSCRIPTWINDOWID; + if (s.isSaving()) { + while (id < _windowsById.size()) { + if (_windowsById[id]) + windowCount++; + id++; + } + } + // Save/Restore window count + s.syncAsUint32LE(windowCount); + + if (s.isSaving()) { + id = PORTS_FIRSTSCRIPTWINDOWID; + while (id < _windowsById.size()) { + if (_windowsById[id]) { + Window *window = (Window *)_windowsById[id]; + window->saveLoadWithSerializer(s); + } + id++; + } + } else { + id = PORTS_FIRSTSCRIPTWINDOWID; + while (windowCount) { + Window *window = new Window(0); + window->saveLoadWithSerializer(s); + + // add enough entries inside _windowsById as needed + while (id <= window->id) { + _windowsById.push_back(0); + id++; + } + _windowsById[window->id] = window; + // _windowList may not be 100% correct using that way of restoring + // saving/restoring ports won't work perfectly anyway, because the contents + // of the window can only get repainted by the scripts and they dont do that + // so we will get empty, transparent windows instead. So perfect window order + // shouldn't really matter + if (window->wndStyle & SCI_WINDOWMGR_STYLE_TOPMOST) + _windowList.push_front(window); + else + _windowList.push_back(window); + + windowCount--; + id++; + } + } + } +} + void SegManager::reconstructStack(EngineState *s) { DataStack *stack = (DataStack *)(_heap[findSegmentByType(SEG_TYPE_STACK)]); s->stack_base = stack->_entries; @@ -711,6 +764,8 @@ bool gamestate_save(EngineState *s, Common::WriteStream *fh, const char* savenam sync_SavegameMetadata(ser, meta); Graphics::saveThumbnail(*fh); s->saveLoadWithSerializer(ser); // FIXME: Error handling? + if (g_sci->_gfxPorts) + g_sci->_gfxPorts->saveLoadWithSerializer(ser); return true; } @@ -761,6 +816,7 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { s->reset(true); s->saveLoadWithSerializer(ser); // FIXME: Error handling? + // Now copy all current state information s->_segMan->reconstructStack(s); @@ -775,8 +831,7 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { g_engine->setTotalPlayTime(meta.playTime * 1000); if (g_sci->_gfxPorts) - g_sci->_gfxPorts->reset(); - + g_sci->_gfxPorts->saveLoadWithSerializer(ser); g_sci->_soundCmd->reconstructPlayList(); // Message state: diff --git a/engines/sci/engine/savegame.h b/engines/sci/engine/savegame.h index 7ab28e126b..2b09f8fa11 100644 --- a/engines/sci/engine/savegame.h +++ b/engines/sci/engine/savegame.h @@ -1,80 +1,80 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * * $URL$ * $Id$ - * - */ - -#ifndef SCI_ENGINE_SAVEGAME_H -#define SCI_ENGINE_SAVEGAME_H - -#include "common/scummsys.h" -#include "common/str.h" - -#include "sci/sci.h" - -namespace Sci { - -struct EngineState; - -enum { - CURRENT_SAVEGAME_VERSION = 26, - MINIMUM_SAVEGAME_VERSION = 14 -}; - -// Savegame metadata -struct SavegameMetadata { - Common::String name; - int version; - Common::String gameVersion; - int saveDate; - int saveTime; - uint32 playTime; - uint16 gameObjectOffset; - uint16 script0Size; -}; - - -/** - * Saves a game state to the hard disk in a portable way. - * @param s The state to save - * @param save The stream to save to - * @param savename The description of the savegame - * @return 0 on success, 1 otherwise - */ -bool gamestate_save(EngineState *s, Common::WriteStream *save, const char *savename, const char *version); - -/** - * Restores a game state from a directory. - * @param s An older state from the same game - * @param dirname The subdirectory to restore from - */ -void gamestate_restore(EngineState *s, Common::SeekableReadStream *save); - -/** - * Read the header from a savegame. - */ -bool get_savegame_metadata(Common::SeekableReadStream* stream, SavegameMetadata* meta); - - -} // End of namespace Sci - -#endif // SCI_ENGINE_SAVEGAME_H + * + */ + +#ifndef SCI_ENGINE_SAVEGAME_H +#define SCI_ENGINE_SAVEGAME_H + +#include "common/scummsys.h" +#include "common/str.h" + +#include "sci/sci.h" + +namespace Sci { + +struct EngineState; + +enum { + CURRENT_SAVEGAME_VERSION = 27, + MINIMUM_SAVEGAME_VERSION = 14 +}; + +// Savegame metadata +struct SavegameMetadata { + Common::String name; + int version; + Common::String gameVersion; + int saveDate; + int saveTime; + uint32 playTime; + uint16 gameObjectOffset; + uint16 script0Size; +}; + + +/** + * Saves a game state to the hard disk in a portable way. + * @param s The state to save + * @param save The stream to save to + * @param savename The description of the savegame + * @return 0 on success, 1 otherwise + */ +bool gamestate_save(EngineState *s, Common::WriteStream *save, const char *savename, const char *version); + +/** + * Restores a game state from a directory. + * @param s An older state from the same game + * @param dirname The subdirectory to restore from + */ +void gamestate_restore(EngineState *s, Common::SeekableReadStream *save); + +/** + * Read the header from a savegame. + */ +bool get_savegame_metadata(Common::SeekableReadStream* stream, SavegameMetadata* meta); + + +} // End of namespace Sci + +#endif // SCI_ENGINE_SAVEGAME_H diff --git a/engines/sci/graphics/helpers.h b/engines/sci/graphics/helpers.h index 4b4cd673b4..549ddf62e6 100644 --- a/engines/sci/graphics/helpers.h +++ b/engines/sci/graphics/helpers.h @@ -1,111 +1,145 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * * $URL$ * $Id$ - * - */ - -#ifndef SCI_GRAPHICS_HELPERS_H -#define SCI_GRAPHICS_HELPERS_H - -#include "common/endian.h" // for READ_LE_UINT16 -#include "common/rect.h" -#include "common/serializer.h" -#include "sci/engine/vm_types.h" - -namespace Sci { - -// Cache limits -#define MAX_CACHED_CURSORS 10 -#define MAX_CACHED_FONTS 20 -#define MAX_CACHED_VIEWS 50 - -#define SCI_SHAKE_DIRECTION_VERTICAL 1 -#define SCI_SHAKE_DIRECTION_HORIZONTAL 2 - -typedef int GuiResourceId; // is a resource-number and -1 means no parameter given - -typedef int16 TextAlignment; - -struct Port { - uint16 id; - int16 top, left; - Common::Rect rect; - int16 curTop, curLeft; - int16 fontHeight; - GuiResourceId fontId; - bool greyedOutput; - int16 penClr, backClr; - int16 penMode; - uint16 counterTillFree; - - Port(uint16 theId) : id(theId), top(0), left(0), - curTop(0), curLeft(0), - fontHeight(0), fontId(0), greyedOutput(false), - penClr(0), backClr(0xFF), penMode(0), counterTillFree(0) { - } -}; - -struct Window : public Port { - Common::Rect dims; // client area of window - Common::Rect restoreRect; // total area of window including borders - uint16 wndStyle; - uint16 saveScreenMask; - reg_t hSaved1; - reg_t hSaved2; - Common::String title; - bool bDrawn; - - Window(uint16 theId) : Port(theId), - wndStyle(0), saveScreenMask(0), - hSaved1(NULL_REG), hSaved2(NULL_REG), - bDrawn(false) { - } -}; - -struct Color { - byte used; - byte r, g, b; -}; - -struct Palette { - byte mapping[256]; - uint32 timestamp; - Color colors[256]; - byte intensity[256]; -}; - -struct PalSchedule { - byte from; - uint32 schedule; -}; - -enum ViewType { - kViewUnknown, - kViewEga, - kViewVga, - kViewVga11, - kViewAmiga -}; - -} // End of namespace Sci - -#endif + * + */ + +#ifndef SCI_GRAPHICS_HELPERS_H +#define SCI_GRAPHICS_HELPERS_H + +#include "common/endian.h" // for READ_LE_UINT16 +#include "common/rect.h" +#include "common/serializer.h" +#include "sci/engine/vm_types.h" + +namespace Sci { + +// Cache limits +#define MAX_CACHED_CURSORS 10 +#define MAX_CACHED_FONTS 20 +#define MAX_CACHED_VIEWS 50 + +#define SCI_SHAKE_DIRECTION_VERTICAL 1 +#define SCI_SHAKE_DIRECTION_HORIZONTAL 2 + +typedef int GuiResourceId; // is a resource-number and -1 means no parameter given + +typedef int16 TextAlignment; + +struct Port { + uint16 id; + int16 top, left; + Common::Rect rect; + int16 curTop, curLeft; + int16 fontHeight; + GuiResourceId fontId; + bool greyedOutput; + int16 penClr, backClr; + int16 penMode; + uint16 counterTillFree; + + Port(uint16 theId) : id(theId), top(0), left(0), + curTop(0), curLeft(0), + fontHeight(0), fontId(0), greyedOutput(false), + penClr(0), backClr(0xFF), penMode(0), counterTillFree(0) { + } +}; + +struct Window : public Port, public Common::Serializable { + Common::Rect dims; // client area of window + Common::Rect restoreRect; // total area of window including borders + uint16 wndStyle; + uint16 saveScreenMask; + reg_t hSaved1; + reg_t hSaved2; + Common::String title; + bool bDrawn; + + Window(uint16 theId) : Port(theId), + wndStyle(0), saveScreenMask(0), + hSaved1(NULL_REG), hSaved2(NULL_REG), + bDrawn(false) { + } + + void syncRect(Common::Serializer &ser, Common::Rect targetRect) { + ser.syncAsSint16LE(targetRect.top); + ser.syncAsSint16LE(targetRect.left); + ser.syncAsSint16LE(targetRect.bottom); + ser.syncAsSint16LE(targetRect.right); + } + + virtual void saveLoadWithSerializer(Common::Serializer &ser) { + ser.syncAsUint16LE(id); + ser.syncAsSint16LE(top); + ser.syncAsSint16LE(left); + syncRect(ser, rect); + ser.syncAsSint16LE(curTop); + ser.syncAsSint16LE(curLeft); + ser.syncAsSint16LE(fontHeight); + ser.syncAsSint32LE(fontId); + ser.syncAsByte(greyedOutput); + ser.syncAsSint16LE(penClr); + ser.syncAsSint16LE(backClr); + ser.syncAsSint16LE(penMode); + ser.syncAsUint16LE(counterTillFree); + syncRect(ser, dims); + syncRect(ser, restoreRect); + ser.syncAsUint16LE(wndStyle); + ser.syncAsUint16LE(saveScreenMask); + if (ser.isLoading()) { + // The hunk table isn't saved, so we just set both pointers to NULL + hSaved1 = NULL_REG; + hSaved2 = NULL_REG; + } + ser.syncString(title); + ser.syncAsByte(bDrawn); + } +}; + +struct Color { + byte used; + byte r, g, b; +}; + +struct Palette { + byte mapping[256]; + uint32 timestamp; + Color colors[256]; + byte intensity[256]; +}; + +struct PalSchedule { + byte from; + uint32 schedule; +}; + +enum ViewType { + kViewUnknown, + kViewEga, + kViewVga, + kViewVga11, + kViewAmiga +}; + +} // End of namespace Sci + +#endif diff --git a/engines/sci/graphics/ports.cpp b/engines/sci/graphics/ports.cpp index e7f319a25c..ef57e4014f 100644 --- a/engines/sci/graphics/ports.cpp +++ b/engines/sci/graphics/ports.cpp @@ -38,15 +38,6 @@ namespace Sci { -// window styles -enum { - SCI_WINDOWMGR_STYLE_TRANSPARENT = (1 << 0), - SCI_WINDOWMGR_STYLE_NOFRAME = (1 << 1), - SCI_WINDOWMGR_STYLE_TITLE = (1 << 2), - SCI_WINDOWMGR_STYLE_TOPMOST = (1 << 3), - SCI_WINDOWMGR_STYLE_USER = (1 << 7) -}; - GfxPorts::GfxPorts(SegManager *segMan, GfxScreen *screen) : _segMan(segMan), _screen(screen) { } diff --git a/engines/sci/graphics/ports.h b/engines/sci/graphics/ports.h index 453cb50986..e4cbaecb54 100644 --- a/engines/sci/graphics/ports.h +++ b/engines/sci/graphics/ports.h @@ -1,136 +1,148 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * * $URL$ * $Id$ - * - */ - -#ifndef SCI_GRAPHICS_PORTS_H -#define SCI_GRAPHICS_PORTS_H - -#include "common/list.h" -#include "common/array.h" - -namespace Sci { - -class SciGui; -class GfxPaint16; -class GfxScreen; -class GfxText16; - -#define PORTS_FIRSTWINDOWID 2 -#define PORTS_FIRSTSCRIPTWINDOWID 3 - -/** - * Ports class, includes all port managment for SCI0->SCI1.1 games. Ports are some sort of windows in SCI - * this class also handles adjusting coordinates to a specific port - */ -class GfxPorts { -public: - GfxPorts(SegManager *segMan, GfxScreen *screen); - ~GfxPorts(); - - void init(bool usesOldGfxFunctions, GfxPaint16 *paint16, GfxText16 *text16); - void reset(); - - void kernelSetActive(uint16 portId); - Common::Rect kernelGetPicWindow(int16 &picTop, int16 &picLeft); - void kernelSetPicWindow(Common::Rect rect, int16 picTop, int16 picLeft, bool initPriorityBandsFlag); - reg_t kernelGetActive(); - reg_t kernelNewWindow(Common::Rect dims, Common::Rect restoreRect, uint16 style, int16 priority, int16 colorPen, int16 colorBack, const char *title); - void kernelDisposeWindow(uint16 windowId, bool reanimate); - - int16 isFrontWindow(Window *wnd); - void beginUpdate(Window *wnd); - void endUpdate(Window *wnd); - Window *addWindow(const Common::Rect &dims, const Common::Rect *restoreRect, const char *title, uint16 style, int16 priority, bool draw); - void drawWindow(Window *wnd); - void removeWindow(Window *pWnd, bool reanimate); - void freeWindow(Window *pWnd); - void updateWindow(Window *wnd); - - Port *getPortById(uint16 id); - - Port *setPort(Port *newPort); - Port *getPort(); - void setOrigin(int16 left, int16 top); - void moveTo(int16 left, int16 top); - void move(int16 left, int16 top); - void openPort(Port *port); - void penColor(int16 color); - void backColor(int16 color); - void penMode(int16 mode); - void textGreyedOutput(bool state); - int16 getPointSize(); - - void offsetRect(Common::Rect &r); - void offsetLine(Common::Point &start, Common::Point &end); - void clipLine(Common::Point &start, Common::Point &end); - - void priorityBandsInit(int16 bandCount, int16 top, int16 bottom); - void priorityBandsInit(byte *data); - void priorityBandsInitSci11(byte *data); - - void kernelInitPriorityBands(); - void kernelGraphAdjustPriority(int top, int bottom); - byte kernelCoordinateToPriority(int16 y); - int16 kernelPriorityToCoordinate(byte priority); - - Port *_wmgrPort; - Window *_picWind; - - Port *_menuPort; - Common::Rect _menuBarRect; - Common::Rect _menuRect; - Common::Rect _menuLine; - Port *_curPort; - -private: - typedef Common::List PortList; - - SegManager *_segMan; - GfxPaint16 *_paint16; - GfxScreen *_screen; - GfxText16 *_text16; - - bool _usesOldGfxFunctions; - - uint16 _styleUser; - - // counts windows that got disposed but are not freed yet - uint16 _freeCounter; - - /** The list of open 'windows' (and ports), in visual order. */ - PortList _windowList; - - /** The list of all open 'windows' (and ports), ordered by their id. */ - Common::Array _windowsById; - - Common::Rect _bounds; - - // Priority Bands related variables - int16 _priorityTop, _priorityBottom, _priorityBandCount; - byte _priorityBands[200]; + * + */ + +#ifndef SCI_GRAPHICS_PORTS_H +#define SCI_GRAPHICS_PORTS_H + +#include "common/serializer.h" +#include "common/list.h" +#include "common/array.h" + +namespace Sci { + +class SciGui; +class GfxPaint16; +class GfxScreen; +class GfxText16; + +#define PORTS_FIRSTWINDOWID 2 +#define PORTS_FIRSTSCRIPTWINDOWID 3 + +// window styles +enum { + SCI_WINDOWMGR_STYLE_TRANSPARENT = (1 << 0), + SCI_WINDOWMGR_STYLE_NOFRAME = (1 << 1), + SCI_WINDOWMGR_STYLE_TITLE = (1 << 2), + SCI_WINDOWMGR_STYLE_TOPMOST = (1 << 3), + SCI_WINDOWMGR_STYLE_USER = (1 << 7) }; - -} // End of namespace Sci - -#endif + +/** + * Ports class, includes all port managment for SCI0->SCI1.1 games. Ports are some sort of windows in SCI + * this class also handles adjusting coordinates to a specific port + */ +class GfxPorts : public Common::Serializable { +public: + GfxPorts(SegManager *segMan, GfxScreen *screen); + ~GfxPorts(); + + void init(bool usesOldGfxFunctions, GfxPaint16 *paint16, GfxText16 *text16); + void reset(); + + void kernelSetActive(uint16 portId); + Common::Rect kernelGetPicWindow(int16 &picTop, int16 &picLeft); + void kernelSetPicWindow(Common::Rect rect, int16 picTop, int16 picLeft, bool initPriorityBandsFlag); + reg_t kernelGetActive(); + reg_t kernelNewWindow(Common::Rect dims, Common::Rect restoreRect, uint16 style, int16 priority, int16 colorPen, int16 colorBack, const char *title); + void kernelDisposeWindow(uint16 windowId, bool reanimate); + + int16 isFrontWindow(Window *wnd); + void beginUpdate(Window *wnd); + void endUpdate(Window *wnd); + Window *addWindow(const Common::Rect &dims, const Common::Rect *restoreRect, const char *title, uint16 style, int16 priority, bool draw); + void drawWindow(Window *wnd); + void removeWindow(Window *pWnd, bool reanimate); + void freeWindow(Window *pWnd); + void updateWindow(Window *wnd); + + Port *getPortById(uint16 id); + + Port *setPort(Port *newPort); + Port *getPort(); + void setOrigin(int16 left, int16 top); + void moveTo(int16 left, int16 top); + void move(int16 left, int16 top); + void openPort(Port *port); + void penColor(int16 color); + void backColor(int16 color); + void penMode(int16 mode); + void textGreyedOutput(bool state); + int16 getPointSize(); + + void offsetRect(Common::Rect &r); + void offsetLine(Common::Point &start, Common::Point &end); + void clipLine(Common::Point &start, Common::Point &end); + + void priorityBandsInit(int16 bandCount, int16 top, int16 bottom); + void priorityBandsInit(byte *data); + void priorityBandsInitSci11(byte *data); + + void kernelInitPriorityBands(); + void kernelGraphAdjustPriority(int top, int bottom); + byte kernelCoordinateToPriority(int16 y); + int16 kernelPriorityToCoordinate(byte priority); + + Port *_wmgrPort; + Window *_picWind; + + Port *_menuPort; + Common::Rect _menuBarRect; + Common::Rect _menuRect; + Common::Rect _menuLine; + Port *_curPort; + + virtual void saveLoadWithSerializer(Common::Serializer &ser); + +private: + typedef Common::List PortList; + + SegManager *_segMan; + GfxPaint16 *_paint16; + GfxScreen *_screen; + GfxText16 *_text16; + + bool _usesOldGfxFunctions; + + uint16 _styleUser; + + // counts windows that got disposed but are not freed yet + uint16 _freeCounter; + + /** The list of open 'windows' (and ports), in visual order. */ + PortList _windowList; + + /** The list of all open 'windows' (and ports), ordered by their id. */ + Common::Array _windowsById; + + Common::Rect _bounds; + + // Priority Bands related variables + int16 _priorityTop, _priorityBottom, _priorityBandCount; + byte _priorityBands[200]; +}; + +} // End of namespace Sci + +#endif -- cgit v1.2.3