diff options
Diffstat (limited to 'engines/gargoyle')
-rw-r--r-- | engines/gargoyle/windows.cpp | 139 | ||||
-rw-r--r-- | engines/gargoyle/windows.h | 107 |
2 files changed, 212 insertions, 34 deletions
diff --git a/engines/gargoyle/windows.cpp b/engines/gargoyle/windows.cpp index ad03ab860a..25af90b277 100644 --- a/engines/gargoyle/windows.cpp +++ b/engines/gargoyle/windows.cpp @@ -28,8 +28,47 @@ namespace Gargoyle { #define MAGIC_WINDOW_NUM (9876) +bool Windows::_confLockCols; +bool Windows::_confLockRows; +int Windows::_wMarginx; +int Windows::_wMarginy; +int Windows::_wPaddingx; +int Windows::_wPaddingy; +int Windows::_wBorderx; +int Windows::_wBordery; +int Windows::_tMarginx; +int Windows::_tMarginy; +int Windows::_wMarginXsave; +int Windows::_wMarginYsave; +int Windows::_cols; +int Windows::_rows; +int Windows::_imageW; +int Windows::_imageH; +int Windows::_cellW; +int Windows::_cellH; +int Windows::_baseLine; +int Windows::_leading; + Windows::Windows(Graphics::Screen *screen) : _screen(screen), _forceRedraw(true), _moreFocus(false), _windowList(nullptr), _rootWin(nullptr), _focusWin(nullptr) { + _confLockCols = false; + _confLockRows = false; + _wMarginx = 15; + _wMarginy = 15; + _wPaddingx = 0; + _wPaddingy = 0; + _wBorderx = 1; + _wBordery = 1; + _tMarginx = 7; + _tMarginy = 7; + _wMarginXsave = 15; + _wMarginYsave = 15; + _cols = 60; + _rows = 25; + _imageW = _imageH = 0; + _cellW = _cellH = 0; + _baseLine = 15; + _leading = 20; } Window *Windows::windowOpen(Window *splitwin, glui32 method, glui32 size, @@ -154,35 +193,32 @@ PairWindow *Windows::newPairWindow(glui32 method, Window *key, glui32 size) { } void Windows::rearrange() { - // TODO - /* if (_rootWin) { - rect_t box; + Common::Rect box; - if (gli_conf_lockcols) { - int desired_width = gli_wmarginx_save * 2 + gli_cellw * gli_cols; - if (desired_width > gli_image_w) - gli_wmarginx = gli_wmarginx_save; + if (_confLockCols) { + int desired_width = _wMarginXsave * 2 + _cellW * _cols; + if (desired_width > _imageW) + _wMarginx = _wMarginXsave; else - gli_wmarginx = (gli_image_w - gli_cellw * gli_cols) / 2; + _wMarginx = (_imageW - _cellW * _cols) / 2; } - if (gli_conf_lockrows) - { - int desired_height = gli_wmarginy_save * 2 + gli_cellh * gli_rows; - if (desired_height > gli_image_h) - gli_wmarginy = gli_wmarginy_save; + if (_confLockRows) { + int desired_height = _wMarginYsave * 2 + _cellH * _rows; + if (desired_height > _imageH) + _wMarginy = _wMarginYsave; else - gli_wmarginy = (gli_image_h - gli_cellh * gli_rows) / 2; + _wMarginy = (_imageH - _cellH * _rows) / 2; } - box.x0 = gli_wmarginx; - box.y0 = gli_wmarginy; - box.x1 = gli_image_w - gli_wmarginx; - box.y1 = gli_image_h - gli_wmarginy; - gli_window_rearrange(_rootWin, &box); + box.left = _wMarginx; + box.top = _wMarginy; + box.right = _imageW - _wMarginx; + box.bottom = _imageH - _wMarginy; + + _rootWin->rearrange(box); } - */ } /*--------------------------------------------------------------------------*/ @@ -215,6 +251,50 @@ BlankWindow::BlankWindow(uint32 rock) : Window(rock) { TextGridWindow::TextGridWindow(uint32 rock) : Window(rock) { _type = wintype_TextGrid; + width = height = 0; + curx = cury = 0; + inbuf = nullptr; + inorgx = inorgy = 0; + inmax = 0; + incurs = inlen = 0; + inarrayrock.num = 0; + line_terminators = nullptr; +} + +void TextGridWindow::rearrange(const Common::Rect &box) { + Window::rearrange(box); + int newwid, newhgt; + + newwid = box.width() / Windows::_cellW; + newhgt = box.height() / Windows::_cellH; + + if (newwid == width && newhgt == height) + return; + + lines.resize(newhgt); + for (int y = 0; y < newhgt; ++y) { + lines[y].resize(newwid); + touch(y); + } + + attr.clear(); + width = newwid; + height = newhgt; +} + +void TextGridWindow::touch(int line) { +// int y = bbox.top + line * Windows::_leading; + lines[line].dirty = true; + // TODO +// winrepaint(bbox.left, y, bbox.right, y + Windows::_leading); +} + +void TextGridWindow::TextGridRow::resize(size_t newSize) { + chars.clear(); + attr.clear(); + chars.resize(newSize); + attr.resize(newSize); + Common::fill(&chars[0], &chars[0] + newSize, ' '); } /*--------------------------------------------------------------------------*/ @@ -241,4 +321,23 @@ PairWindow::PairWindow(glui32 method, Window *_key, glui32 _size) : Window(0), _type = wintype_Pair; } +/*--------------------------------------------------------------------------*/ + +WindowStyle::WindowStyle() : font(0), reverse(0) { + Common::fill(&bg[0], &bg[3], 0); + Common::fill(&fg[0], &fg[3], 0); +} + +/*--------------------------------------------------------------------------*/ + +void Attributes::clear() { + fgset = 0; + bgset = 0; + fgcolor = 0; + bgcolor = 0; + reverse = false; + hyper = 0; + style = 0; +} + } // End of namespace Gargoyle diff --git a/engines/gargoyle/windows.h b/engines/gargoyle/windows.h index 91cbc91a53..45907a86e3 100644 --- a/engines/gargoyle/windows.h +++ b/engines/gargoyle/windows.h @@ -23,6 +23,7 @@ #ifndef GARGOYLE_WINDOWS_H #define GARGOYLE_WINDOWS_H +#include "common/array.h" #include "common/list.h" #include "common/rect.h" #include "common/stream.h" @@ -58,6 +59,24 @@ private: */ void rearrange(); public: + static bool _confLockCols, _confLockRows; + static int _wMarginx; + static int _wMarginy; + static int _wPaddingx; + static int _wPaddingy; + static int _wBorderx; + static int _wBordery; + static int _tMarginx; + static int _tMarginy; + static int _wMarginXsave; + static int _wMarginYsave; + static int _cols; + static int _rows; + static int _imageW, _imageH; + static int _cellW, _cellH; + static int _baseLine; + static int _leading; +public: /** * Constructor */ @@ -76,9 +95,21 @@ public: }; /** + * Window styles + */ +struct WindowStyle { + int font; + byte bg[3]; + byte fg[3]; + int reverse; + + WindowStyle(); +}; + +/** * Window attributes */ -struct attr_t { +struct Attributes { unsigned fgset : 1; unsigned bgset : 1; unsigned reverse : 1; @@ -87,20 +118,18 @@ struct attr_t { unsigned fgcolor : 24; unsigned bgcolor : 24; unsigned hyper : 32; -}; -struct WindowPair { - Window *owner; - Window *child1, *child2; + /** + * Constructor + */ + Attributes() { + clear(); + } - // split info... - glui32 dir; ///< winmethod_Left, Right, Above, or Below - int vertical, backward; ///< flags - glui32 division; ///< winmethod_Fixed or winmethod_Proportional - Window *key; ///< NULL or a leaf-descendant (not a Pair) - int keydamage; ///< used as scratch space in window closing - glui32 size; ///< size value - glui32 wborder; ///< winMethod_Border, NoBorder + /** + * Clear + */ + void clear(); }; /** @@ -133,7 +162,7 @@ public: glui32 *line_terminators; glui32 termct; - attr_t attr; + Attributes attr; byte bgcolor[3]; byte fgcolor[3]; @@ -149,6 +178,11 @@ public: * Destructor */ virtual ~Window() {} + + /** + * Rearranges the window + */ + virtual void rearrange(const Common::Rect &box) { bbox = box; } }; typedef Window *winid_t; @@ -167,11 +201,56 @@ public: * Text Grid window */ class TextGridWindow : public Window { + /** + * Structure for a row within the grid window + */ + struct TextGridRow { + Common::Array<uint32> chars; + Common::Array<Attributes> attr; + bool dirty; + + /** + * Constructor + */ + TextGridRow() : dirty(false) {} + + /** + * Resize the row + */ + void resize(size_t newSize); + }; + typedef Common::Array<TextGridRow> TextGridRows; +private: + /** + * Mark a given text row as modified + */ + void touch(int line); +public: + int width, height; + TextGridRows lines; + + int curx, cury; ///< the window cursor position + + ///< for line input + void *inbuf; ///< unsigned char* for latin1, glui32* for unicode + int inorgx, inorgy; + int inmax; + int incurs, inlen; + Attributes origattr; + gidispatch_rock_t inarrayrock; + glui32 *line_terminators; + + WindowStyle styles[style_NUMSTYLES]; ///< style hints and settings public: /** * Constructor */ TextGridWindow(uint32 rock); + + /** + * Rearranges the window + */ + virtual void rearrange(const Common::Rect &box); }; /** |