[Scummvm-cvs-logs] SF.net SVN: scummvm:[54012] scummvm/trunk/engines/sci

m_kiewitz at users.sourceforge.net m_kiewitz at users.sourceforge.net
Mon Nov 1 17:09:33 CET 2010


Revision: 54012
          http://scummvm.svn.sourceforge.net/scummvm/?rev=54012&view=rev
Author:   m_kiewitz
Date:     2010-11-01 16:09:33 +0000 (Mon, 01 Nov 2010)

Log Message:
-----------
SCI: saving/restoring script created windows now

fixes "GfxPorts::kernelSetActive" error
based on code by [md5]

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/savegame.cpp
    scummvm/trunk/engines/sci/engine/savegame.h
    scummvm/trunk/engines/sci/graphics/helpers.h
    scummvm/trunk/engines/sci/graphics/ports.cpp
    scummvm/trunk/engines/sci/graphics/ports.h

Modified: scummvm/trunk/engines/sci/engine/savegame.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/savegame.cpp	2010-11-01 16:04:47 UTC (rev 54011)
+++ scummvm/trunk/engines/sci/engine/savegame.cpp	2010-11-01 16:09:33 UTC (rev 54012)
@@ -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 @@
 }
 
 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 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 @@
 	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 @@
 	s->reset(true);
 	s->saveLoadWithSerializer(ser);	// FIXME: Error handling?
 
+
 	// Now copy all current state information
 
 	s->_segMan->reconstructStack(s);
@@ -775,8 +831,7 @@
 	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:

Modified: scummvm/trunk/engines/sci/engine/savegame.h
===================================================================
--- scummvm/trunk/engines/sci/engine/savegame.h	2010-11-01 16:04:47 UTC (rev 54011)
+++ scummvm/trunk/engines/sci/engine/savegame.h	2010-11-01 16:09:33 UTC (rev 54012)
@@ -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

Modified: scummvm/trunk/engines/sci/graphics/helpers.h
===================================================================
--- scummvm/trunk/engines/sci/graphics/helpers.h	2010-11-01 16:04:47 UTC (rev 54011)
+++ scummvm/trunk/engines/sci/graphics/helpers.h	2010-11-01 16:09:33 UTC (rev 54012)
@@ -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

Modified: scummvm/trunk/engines/sci/graphics/ports.cpp
===================================================================
--- scummvm/trunk/engines/sci/graphics/ports.cpp	2010-11-01 16:04:47 UTC (rev 54011)
+++ scummvm/trunk/engines/sci/graphics/ports.cpp	2010-11-01 16:09:33 UTC (rev 54012)
@@ -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) {
 }

Modified: scummvm/trunk/engines/sci/graphics/ports.h
===================================================================
--- scummvm/trunk/engines/sci/graphics/ports.h	2010-11-01 16:04:47 UTC (rev 54011)
+++ scummvm/trunk/engines/sci/graphics/ports.h	2010-11-01 16:09:33 UTC (rev 54012)
@@ -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


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list