aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/sci/engine/savegame.cpp65
-rw-r--r--engines/sci/engine/savegame.h156
-rw-r--r--engines/sci/graphics/helpers.h252
-rw-r--r--engines/sci/graphics/ports.cpp9
-rw-r--r--engines/sci/graphics/ports.h278
5 files changed, 426 insertions, 334 deletions
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<Port *> 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<Port *> _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<Port *> 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<Port *> _windowsById;
+
+ Common::Rect _bounds;
+
+ // Priority Bands related variables
+ int16 _priorityTop, _priorityBottom, _priorityBandCount;
+ byte _priorityBands[200];
+};
+
+} // End of namespace Sci
+
+#endif