diff options
author | Martin Kiewitz | 2010-11-01 16:09:33 +0000 |
---|---|---|
committer | Martin Kiewitz | 2010-11-01 16:09:33 +0000 |
commit | eefa151d70c66558d4f40b41a32b1e0df30c1d89 (patch) | |
tree | 7d1ebf14a1ffe06affe34e37218d855a501b1934 /engines/sci/graphics | |
parent | 9a350f43980d82ec001c077b28c035350478fe8e (diff) | |
download | scummvm-rg350-eefa151d70c66558d4f40b41a32b1e0df30c1d89.tar.gz scummvm-rg350-eefa151d70c66558d4f40b41a32b1e0df30c1d89.tar.bz2 scummvm-rg350-eefa151d70c66558d4f40b41a32b1e0df30c1d89.zip |
SCI: saving/restoring script created windows now
fixes "GfxPorts::kernelSetActive" error
based on code by [md5]
svn-id: r54012
Diffstat (limited to 'engines/sci/graphics')
-rw-r--r-- | engines/sci/graphics/helpers.h | 252 | ||||
-rw-r--r-- | engines/sci/graphics/ports.cpp | 9 | ||||
-rw-r--r-- | engines/sci/graphics/ports.h | 278 |
3 files changed, 288 insertions, 251 deletions
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
|