aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/xeen/module.mk1
-rw-r--r--engines/xeen/screen.cpp179
-rw-r--r--engines/xeen/screen.h75
-rw-r--r--engines/xeen/window.cpp204
-rw-r--r--engines/xeen/window.h101
5 files changed, 312 insertions, 248 deletions
diff --git a/engines/xeen/module.mk b/engines/xeen/module.mk
index 553169aef0..a0e76a3045 100644
--- a/engines/xeen/module.mk
+++ b/engines/xeen/module.mk
@@ -44,6 +44,7 @@ MODULE_OBJS := \
spells.o \
sprites.o \
town.o \
+ window.o \
xeen.o \
xsurface.o
diff --git a/engines/xeen/screen.cpp b/engines/xeen/screen.cpp
index 85c4df5590..bcf7f0d722 100644
--- a/engines/xeen/screen.cpp
+++ b/engines/xeen/screen.cpp
@@ -25,188 +25,11 @@
#include "graphics/surface.h"
#include "xeen/screen.h"
#include "xeen/resources.h"
+#include "xeen/window.h"
#include "xeen/xeen.h"
namespace Xeen {
-XeenEngine *Window::_vm;
-
-void Window::init(XeenEngine *vm) {
- _vm = vm;
-}
-
-Window::Window() : XSurface(), _enabled(false),
- _a(0), _border(0), _xLo(0), _xHi(0), _ycL(0), _ycH(0) {
-}
-
-Window::Window(const Window &src) : XSurface(), _enabled(src._enabled),
- _a(src._a), _border(src._border), _xLo(src._xLo), _ycL(src._ycL),
- _xHi(src._xHi), _ycH(src._ycH) {
-
- setBounds(src._bounds);
- create(*_vm->_screen, Common::Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
-}
-
-Window::Window(const Common::Rect &bounds, int a, int border,
- int xLo, int ycL, int xHi, int ycH): XSurface(),
- _enabled(false), _a(a), _border(border),
- _xLo(xLo), _ycL(ycL), _xHi(xHi), _ycH(ycH) {
- setBounds(bounds);
- create(*_vm->_screen, Common::Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
-}
-
-void Window::setBounds(const Common::Rect &r) {
- _bounds = r;
- _innerBounds = r;
- _innerBounds.grow(-_border);
-}
-
-void Window::open() {
- if (!_enabled) {
- _enabled = true;
- _vm->_screen->_windowStack.push_back(this);
- open2();
- }
-
- if (_vm->_mode == MODE_9) {
- warning("TODO: copyFileToMemory");
- }
-}
-
-void Window::open2() {
- Screen &screen = *_vm->_screen;
-
- // Save a copy of the area under the window
- _savedArea.create(_bounds.width(), _bounds.height());
- _savedArea.copyRectToSurface(screen, 0, 0, _bounds);
-
- // Mark the area as dirty and fill it with a default background
- addDirtyRect(_bounds);
- frame();
- fill();
-
- screen._writePos.x = _bounds.right - 8;
- screen.writeSymbol(19);
-
- screen._writePos.x = _innerBounds.left;
- screen._writePos.y = _innerBounds.top;
- screen._fontJustify = JUSTIFY_NONE;
- screen._fontReduced = false;
-}
-
-void Window::frame() {
- Screen &screen = *_vm->_screen;
- int xCount = (_bounds.width() - 9) / FONT_WIDTH;
- int yCount = (_bounds.height() - 9) / FONT_HEIGHT;
-
- // Write the top line
- screen._writePos = Common::Point(_bounds.left, _bounds.top);
- screen.writeSymbol(0);
-
- if (xCount > 0) {
- int symbolId = 1;
- for (int i = 0; i < xCount; ++i) {
- screen.writeSymbol(symbolId);
- if (++symbolId == 5)
- symbolId = 1;
- }
- }
-
- screen._writePos.x = _bounds.right - FONT_WIDTH;
- screen.writeSymbol(5);
-
- // Write the vertical edges
- if (yCount > 0) {
- int symbolId = 6;
- for (int i = 0; i < yCount; ++i) {
- screen._writePos.y += 8;
-
- screen._writePos.x = _bounds.left;
- screen.writeSymbol(symbolId);
-
- screen._writePos.x = _bounds.right - FONT_WIDTH;
- screen.writeSymbol(symbolId + 4);
-
- if (++symbolId == 10)
- symbolId = 6;
- }
- }
-
- // Write the bottom line
- screen._writePos = Common::Point(_bounds.left, _bounds.bottom - FONT_HEIGHT);
- screen.writeSymbol(14);
-
- if (xCount > 0) {
- int symbolId = 15;
- for (int i = 0; i < xCount; ++i) {
- screen.writeSymbol(symbolId);
- if (++symbolId == 19)
- symbolId = 15;
- }
- }
-
- screen._writePos.x = _bounds.right - FONT_WIDTH;
- screen.writeSymbol(19);
-}
-
-void Window::close() {
- Screen &screen = *_vm->_screen;
-
- if (_enabled) {
- // Update the window
- update();
-
- // Restore the saved original content
- screen.copyRectToSurface(_savedArea, _bounds.left, _bounds.top,
- Common::Rect(0, 0, _bounds.width(), _bounds.height()));
- addDirtyRect(_bounds);
-
- // Remove the window from the stack and flag it as now disabled
- for (uint i = 0; i < _vm->_screen->_windowStack.size(); ++i) {
- if (_vm->_screen->_windowStack[i] == this)
- _vm->_screen->_windowStack.remove_at(i);
- }
-
- _enabled = false;
- }
-
- if (_vm->_mode == MODE_9) {
- warning("TODO: copyFileToMemory");
- }
-}
-
-void Window::update() {
- // Since all window drawing is done on the screen surface anyway,
- // there's nothing that needs to be updated here
-}
-
-void Window::addDirtyRect(const Common::Rect &r) {
- _vm->_screen->addDirtyRect(r);
-}
-
-void Window::fill() {
- fillRect(_innerBounds, _vm->_screen->_bgColor);
-}
-
-const char *Window::writeString(const Common::String &s) {
- return _vm->_screen->writeString(s, _innerBounds);
-}
-
-void Window::drawList(DrawStruct *items, int count) {
- for (int i = 0; i < count; ++i, ++items) {
- if (items->_frame == -1 || items->_scale == -1 || items->_sprites == nullptr)
- continue;
-
- Common::Point pt(items->_x, items->_y);
- pt.x += _innerBounds.left;
- pt.y += _innerBounds.top;
-
- items->_sprites->draw(*this, items->_frame, pt, items->_flags, items->_scale);
- }
-}
-
-/*------------------------------------------------------------------------*/
-
Screen::Screen(XeenEngine *vm) : _vm(vm) {
Window::init(vm);
_fadeIn = false;
diff --git a/engines/xeen/screen.h b/engines/xeen/screen.h
index 338a231ce6..032c2654dc 100644
--- a/engines/xeen/screen.h
+++ b/engines/xeen/screen.h
@@ -23,14 +23,14 @@
#ifndef XEEN_SCREEN_H
#define XEEN_SCREEN_H
-#include "common/scummsys.h"
-#include "common/system.h"
-#include "common/array.h"
-#include "common/keyboard.h"
+//#include "common/scummsys.h"
+//#include "common/system.h"
+// #include "common/array.h"
+//#include "common/keyboard.h"
#include "common/rect.h"
#include "xeen/font.h"
#include "xeen/sprites.h"
-#include "xeen/xsurface.h"
+#include "xeen/window.h"
namespace Xeen {
@@ -41,71 +41,6 @@ namespace Xeen {
#define GAME_WINDOW 28
class XeenEngine;
-class Screen;
-
-struct DrawStruct {
- SpriteResource *_sprites;
- int _frame;
- int _x;
- int _y;
- int _scale;
- int _flags;
-
- DrawStruct(int frame, int x, int y, int scale = 0, int flags = 0) :
- _sprites(nullptr), _frame(frame), _x(x), _y(y), _scale(scale), _flags(flags) {}
- DrawStruct(): _sprites(nullptr), _frame(0), _x(0), _y(0), _scale(0), _flags(0) {}
-};
-
-class Window: public XSurface {
-private:
- static XeenEngine *_vm;
- Common::Rect _bounds;
- Common::Rect _innerBounds;
- XSurface _savedArea;
- int _a;
- int _border;
- int _xLo, _xHi;
- int _ycL, _ycH;
-
- void open2();
-public:
- bool _enabled;
-public:
- static void init(XeenEngine *vm);
-public:
- Window();
- Window(const Window &src);
- Window(const Common::Rect &bounds, int a, int border,
- int xLo, int ycL, int xHi, int ycH);
-
- virtual void addDirtyRect(const Common::Rect &r);
-
- void setBounds(const Common::Rect &r);
-
- const Common::Rect &getBounds() { return _bounds; }
-
- void open();
-
- void close();
-
- /**
- * Update the window
- */
- void update();
-
- void frame();
-
- /**
- * Fill the content area of a window with the current background color
- */
- void fill();
-
- const char *writeString(const Common::String &s);
-
- void drawList(DrawStruct *items, int count);
-
- int getString(Common::String &line, uint maxLen, int maxWidth);
-};
class Screen: public FontSurface {
private:
diff --git a/engines/xeen/window.cpp b/engines/xeen/window.cpp
new file mode 100644
index 0000000000..3bb929fc88
--- /dev/null
+++ b/engines/xeen/window.cpp
@@ -0,0 +1,204 @@
+/* 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.
+ *
+ */
+
+#include "xeen/window.h"
+#include "xeen/xeen.h"
+
+namespace Xeen {
+
+XeenEngine *Window::_vm;
+
+void Window::init(XeenEngine *vm) {
+ _vm = vm;
+}
+
+Window::Window() : XSurface(), _enabled(false),
+ _a(0), _border(0), _xLo(0), _xHi(0), _ycL(0), _ycH(0) {
+}
+
+Window::Window(const Window &src) : XSurface(), _enabled(src._enabled),
+ _a(src._a), _border(src._border), _xLo(src._xLo), _ycL(src._ycL),
+ _xHi(src._xHi), _ycH(src._ycH) {
+
+ setBounds(src._bounds);
+ create(*_vm->_screen, Common::Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+}
+
+Window::Window(const Common::Rect &bounds, int a, int border,
+ int xLo, int ycL, int xHi, int ycH): XSurface(),
+ _enabled(false), _a(a), _border(border),
+ _xLo(xLo), _ycL(ycL), _xHi(xHi), _ycH(ycH) {
+ setBounds(bounds);
+ create(*_vm->_screen, Common::Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
+}
+
+void Window::setBounds(const Common::Rect &r) {
+ _bounds = r;
+ _innerBounds = r;
+ _innerBounds.grow(-_border);
+}
+
+void Window::open() {
+ if (!_enabled) {
+ _enabled = true;
+ _vm->_screen->_windowStack.push_back(this);
+ open2();
+ }
+
+ if (_vm->_mode == MODE_9) {
+ warning("TODO: copyFileToMemory");
+ }
+}
+
+void Window::open2() {
+ Screen &screen = *_vm->_screen;
+
+ // Save a copy of the area under the window
+ _savedArea.create(_bounds.width(), _bounds.height());
+ _savedArea.copyRectToSurface(screen, 0, 0, _bounds);
+
+ // Mark the area as dirty and fill it with a default background
+ addDirtyRect(_bounds);
+ frame();
+ fill();
+
+ screen._writePos.x = _bounds.right - 8;
+ screen.writeSymbol(19);
+
+ screen._writePos.x = _innerBounds.left;
+ screen._writePos.y = _innerBounds.top;
+ screen._fontJustify = JUSTIFY_NONE;
+ screen._fontReduced = false;
+}
+
+void Window::frame() {
+ Screen &screen = *_vm->_screen;
+ int xCount = (_bounds.width() - 9) / FONT_WIDTH;
+ int yCount = (_bounds.height() - 9) / FONT_HEIGHT;
+
+ // Write the top line
+ screen._writePos = Common::Point(_bounds.left, _bounds.top);
+ screen.writeSymbol(0);
+
+ if (xCount > 0) {
+ int symbolId = 1;
+ for (int i = 0; i < xCount; ++i) {
+ screen.writeSymbol(symbolId);
+ if (++symbolId == 5)
+ symbolId = 1;
+ }
+ }
+
+ screen._writePos.x = _bounds.right - FONT_WIDTH;
+ screen.writeSymbol(5);
+
+ // Write the vertical edges
+ if (yCount > 0) {
+ int symbolId = 6;
+ for (int i = 0; i < yCount; ++i) {
+ screen._writePos.y += 8;
+
+ screen._writePos.x = _bounds.left;
+ screen.writeSymbol(symbolId);
+
+ screen._writePos.x = _bounds.right - FONT_WIDTH;
+ screen.writeSymbol(symbolId + 4);
+
+ if (++symbolId == 10)
+ symbolId = 6;
+ }
+ }
+
+ // Write the bottom line
+ screen._writePos = Common::Point(_bounds.left, _bounds.bottom - FONT_HEIGHT);
+ screen.writeSymbol(14);
+
+ if (xCount > 0) {
+ int symbolId = 15;
+ for (int i = 0; i < xCount; ++i) {
+ screen.writeSymbol(symbolId);
+ if (++symbolId == 19)
+ symbolId = 15;
+ }
+ }
+
+ screen._writePos.x = _bounds.right - FONT_WIDTH;
+ screen.writeSymbol(19);
+}
+
+void Window::close() {
+ Screen &screen = *_vm->_screen;
+
+ if (_enabled) {
+ // Update the window
+ update();
+
+ // Restore the saved original content
+ screen.copyRectToSurface(_savedArea, _bounds.left, _bounds.top,
+ Common::Rect(0, 0, _bounds.width(), _bounds.height()));
+ addDirtyRect(_bounds);
+
+ // Remove the window from the stack and flag it as now disabled
+ for (uint i = 0; i < _vm->_screen->_windowStack.size(); ++i) {
+ if (_vm->_screen->_windowStack[i] == this)
+ _vm->_screen->_windowStack.remove_at(i);
+ }
+
+ _enabled = false;
+ }
+
+ if (_vm->_mode == MODE_9) {
+ warning("TODO: copyFileToMemory");
+ }
+}
+
+void Window::update() {
+ // Since all window drawing is done on the screen surface anyway,
+ // there's nothing that needs to be updated here
+}
+
+void Window::addDirtyRect(const Common::Rect &r) {
+ _vm->_screen->addDirtyRect(r);
+}
+
+void Window::fill() {
+ fillRect(_innerBounds, _vm->_screen->_bgColor);
+}
+
+const char *Window::writeString(const Common::String &s) {
+ return _vm->_screen->writeString(s, _innerBounds);
+}
+
+void Window::drawList(DrawStruct *items, int count) {
+ for (int i = 0; i < count; ++i, ++items) {
+ if (items->_frame == -1 || items->_scale == -1 || items->_sprites == nullptr)
+ continue;
+
+ Common::Point pt(items->_x, items->_y);
+ pt.x += _innerBounds.left;
+ pt.y += _innerBounds.top;
+
+ items->_sprites->draw(*this, items->_frame, pt, items->_flags, items->_scale);
+ }
+}
+
+} // End of namespace Xeen
diff --git a/engines/xeen/window.h b/engines/xeen/window.h
new file mode 100644
index 0000000000..72bbf30afa
--- /dev/null
+++ b/engines/xeen/window.h
@@ -0,0 +1,101 @@
+/* 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.
+ *
+ */
+
+#ifndef XEEN_WINDOW_H
+#define XEEN_WINDOW_H
+
+#include "common/rect.h"
+#include "common/str.h"
+#include "xeen/sprites.h"
+#include "xeen/xsurface.h"
+
+namespace Xeen {
+
+class XeenEngine;
+
+struct DrawStruct {
+ SpriteResource *_sprites;
+ int _frame;
+ int _x;
+ int _y;
+ int _scale;
+ int _flags;
+
+ DrawStruct(int frame, int x, int y, int scale = 0, int flags = 0) :
+ _sprites(nullptr), _frame(frame), _x(x), _y(y), _scale(scale), _flags(flags) {}
+ DrawStruct(): _sprites(nullptr), _frame(0), _x(0), _y(0), _scale(0), _flags(0) {}
+};
+
+class Window: public XSurface {
+private:
+ static XeenEngine *_vm;
+ Common::Rect _bounds;
+ Common::Rect _innerBounds;
+ XSurface _savedArea;
+ int _a;
+ int _border;
+ int _xLo, _xHi;
+ int _ycL, _ycH;
+
+ void open2();
+public:
+ bool _enabled;
+public:
+ static void init(XeenEngine *vm);
+public:
+ Window();
+ Window(const Window &src);
+ Window(const Common::Rect &bounds, int a, int border,
+ int xLo, int ycL, int xHi, int ycH);
+
+ virtual void addDirtyRect(const Common::Rect &r);
+
+ void setBounds(const Common::Rect &r);
+
+ const Common::Rect &getBounds() { return _bounds; }
+
+ void open();
+
+ void close();
+
+ /**
+ * Update the window
+ */
+ void update();
+
+ void frame();
+
+ /**
+ * Fill the content area of a window with the current background color
+ */
+ void fill();
+
+ const char *writeString(const Common::String &s);
+
+ void drawList(DrawStruct *items, int count);
+
+ int getString(Common::String &line, uint maxLen, int maxWidth);
+};
+
+} // End of namespace Xeen
+
+#endif /* XEEN_WINDOW_H */