aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorPaul Gilbert2018-10-19 19:37:03 -0700
committerPaul Gilbert2018-12-08 19:05:59 -0800
commitb9bafba382a9756cbedbb2008086208e24834139 (patch)
tree0d50024fd840bc4543b655d57144519c9f8556fa /engines
parent89102c42cac1bd2367a6322f07286452bab21e11 (diff)
downloadscummvm-rg350-b9bafba382a9756cbedbb2008086208e24834139.tar.gz
scummvm-rg350-b9bafba382a9756cbedbb2008086208e24834139.tar.bz2
scummvm-rg350-b9bafba382a9756cbedbb2008086208e24834139.zip
GLK: Remaining window rearrange code
Diffstat (limited to 'engines')
-rw-r--r--engines/gargoyle/picture.cpp38
-rw-r--r--engines/gargoyle/picture.h53
-rw-r--r--engines/gargoyle/windows.cpp152
-rw-r--r--engines/gargoyle/windows.h48
4 files changed, 280 insertions, 11 deletions
diff --git a/engines/gargoyle/picture.cpp b/engines/gargoyle/picture.cpp
new file mode 100644
index 0000000000..4b0b892322
--- /dev/null
+++ b/engines/gargoyle/picture.cpp
@@ -0,0 +1,38 @@
+/* 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 "gargoyle/picture.h"
+
+namespace Gargoyle {
+
+void Picture::increment() {
+ ++_refCount;
+}
+
+void Picture::decrement() {
+ if (_refCount > 0 && --_refCount == 0) {
+ free();
+ delete this;
+ }
+}
+
+} // End of namespace Gargoyle
diff --git a/engines/gargoyle/picture.h b/engines/gargoyle/picture.h
new file mode 100644
index 0000000000..38f776c6bc
--- /dev/null
+++ b/engines/gargoyle/picture.h
@@ -0,0 +1,53 @@
+/* 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 GARGOYLE_PICTURE_H
+#define GARGOYLE_PICTURE_H
+
+#include "graphics/surface.h"
+
+namespace Gargoyle {
+
+struct Picture : Graphics::Surface {
+ int _refCount;
+ uint32 _id;
+ bool _scaled;
+
+ /**
+ * Constructor
+ */
+ Picture() : Graphics::Surface(), _refCount(0), _id(0), _scaled(0) {}
+
+ /**
+ * Increment reference counter
+ */
+ void increment();
+
+ /**
+ * Decrement reference counter
+ */
+ void decrement();
+};
+
+} // End of namespace Gargoyle
+
+#endif
diff --git a/engines/gargoyle/windows.cpp b/engines/gargoyle/windows.cpp
index 194002b62b..8dc546a61d 100644
--- a/engines/gargoyle/windows.cpp
+++ b/engines/gargoyle/windows.cpp
@@ -541,7 +541,7 @@ void TextBufferWindow::touchScroll() {
_windows->clearSelection();
// TODO
- //winrepaint(win->bbox.left, win->bbox.top, win->bbox.right, win->bbox.bottom);
+ //winrepaint(bbox.left, bbox.top, bbox.right, bbox.bottom);
for (int i = 0; i < scrollmax; i++)
lines[i].dirty = true;
}
@@ -632,10 +632,10 @@ void TextBufferWindow::putCharUni(glui32 ch) {
gli_tts_speak(&ch, 1);
- pw = (win->bbox.x1 - win->bbox.x0 - Windows::_tMarginx * 2 - gli_scroll_width) * GLI_SUBPIX;
+ pw = (bbox.right - bbox.left - Windows::_tMarginx * 2 - gli_scroll_width) * GLI_SUBPIX;
pw = pw - 2 * SLOP - radjw - ladjw;
- color = gli_override_bg_set ? gli_window_color : win->bgcolor;
+ color = gli_override_bg_set ? gli_window_color : bgcolor;
// oops ... overflow
if (numchars + 1 >= TBLINELEN)
@@ -669,7 +669,7 @@ void TextBufferWindow::putCharUni(glui32 ch) {
}
}
- if (gli_conf_dashes && win->attr.style != style_Preformatted)
+ if (gli_conf_dashes && attr.style != style_Preformatted)
{
if (ch == '-')
{
@@ -693,9 +693,9 @@ void TextBufferWindow::putCharUni(glui32 ch) {
dashed = 0;
}
- if (gli_conf_spaces && win->attr.style != style_Preformatted
- && styles[win->attr.style].bg == color
- && !styles[win->attr.style].reverse)
+ if (gli_conf_spaces && attr.style != style_Preformatted
+ && styles[attr.style].bg == color
+ && !styles[attr.style].reverse)
{
// turn (period space space) into (period space)
if (gli_conf_spaces == 1)
@@ -731,7 +731,7 @@ void TextBufferWindow::putCharUni(glui32 ch) {
}
chars[numchars] = ch;
- attrs[numchars] = win->attr;
+ attrs[numchars] = attr;
numchars++;
// kill spaces at the end for line width calculation
@@ -800,8 +800,58 @@ void TextBufferWindow::TextBufferRow::resize(size_t newSize) {
/*--------------------------------------------------------------------------*/
-GraphicsWindow::GraphicsWindow(Windows *windows, uint32 rock) : Window(windows, rock) {
+GraphicsWindow::GraphicsWindow(Windows *windows, uint32 rock) : Window(windows, rock),
+ w(0), h(0), dirty(false), _surface(nullptr) {
_type = wintype_Graphics;
+ Common::copy(&bgcolor[0], &bgcolor[3], bgnd);
+}
+
+void GraphicsWindow::rearrange(const Common::Rect &box) {
+ int newwid, newhgt;
+ int bothwid, bothhgt;
+ int oldw, oldh;
+ Graphics::ManagedSurface *newSurface;
+
+ bbox = box;
+
+ newwid = box.width();
+ newhgt = box.height();
+ oldw = w;
+ oldh = h;
+
+ if (newwid <= 0 || newhgt <= 0) {
+ w = 0;
+ h = 0;
+ delete _surface;
+ _surface = NULL;
+ return;
+ }
+
+ bothwid = w;
+ if (newwid < bothwid)
+ bothwid = newwid;
+ bothhgt = h;
+ if (newhgt < bothhgt)
+ bothhgt = newhgt;
+
+ newSurface = new Graphics::ManagedSurface(newwid, newhgt,
+ Graphics::PixelFormat(3, 8, 8, 8, 0, 16, 8, 0, 0));
+
+ // If the new surface is equal or bigger than the old one, copy it over
+ if (_surface && bothwid && bothhgt)
+ newSurface->blitFrom(*_surface);
+
+ delete _surface;
+ _surface = newSurface;
+ w = newwid;
+ h = newhgt;
+
+ touch();
+}
+
+void GraphicsWindow::touch() {
+ dirty = true;
+// winrepaint(bbox.left, bbox.top, bbox.right, bbox.bottom);
}
/*--------------------------------------------------------------------------*/
@@ -817,6 +867,90 @@ PairWindow::PairWindow(Windows *windows, glui32 method, Window *_key, glui32 _si
_type = wintype_Pair;
}
+void PairWindow::rearrange(const Common::Rect &box) {
+ Common::Rect box1, box2;
+ int min, diff, split, splitwid, max;
+ Window *keyWin;
+ Window *ch1, *ch2;
+
+ bbox = box;
+
+ if (vertical) {
+ min = bbox.left;
+ max = bbox.right;
+ } else {
+ min = bbox.top;
+ max = bbox.bottom;
+ }
+ diff = max - min;
+
+ // We now figure split.
+ if (vertical)
+ splitwid = Windows::_wPaddingx; // want border?
+ else
+ splitwid = Windows::_wPaddingy; // want border?
+
+ switch (division) {
+ case winmethod_Proportional:
+ split = (diff * size) / 100;
+ break;
+
+ case winmethod_Fixed:
+ keyWin = key;
+ split = !keyWin ? 0 : keyWin->getSplit(size, vertical);
+ break;
+
+ default:
+ split = diff / 2;
+ break;
+ }
+
+ if (!backward)
+ split = max - split - splitwid;
+ else
+ split = min + split;
+
+ if (min >= max) {
+ split = min;
+ } else {
+ if (split < min)
+ split = min;
+ else if (split > max - splitwid)
+ split = max - splitwid;
+ }
+
+ if (vertical) {
+ box1.left = bbox.left;
+ box1.right = split;
+ box2.left = split + splitwid;
+ box2.right = bbox.right;
+ box1.top = bbox.top;
+ box1.bottom = bbox.bottom;
+ box2.top = bbox.top;
+ box2.bottom = bbox.bottom;
+ } else {
+ box1.top = bbox.top;
+ box1.bottom = split;
+ box2.top = split + splitwid;
+ box2.bottom = bbox.bottom;
+ box1.left = bbox.left;
+ box1.right = bbox.right;
+ box2.left = bbox.left;
+ box2.right = bbox.right;
+ }
+
+ if (!backward) {
+ ch1 = child1;
+ ch2 = child2;
+ } else {
+ ch1 = child2;
+ ch2 = child1;
+ }
+
+ ch1->rearrange(box1);
+ ch2->rearrange(box2);
+}
+
/*--------------------------------------------------------------------------*/
void Attributes::clear() {
diff --git a/engines/gargoyle/windows.h b/engines/gargoyle/windows.h
index aad4969be2..64adf81450 100644
--- a/engines/gargoyle/windows.h
+++ b/engines/gargoyle/windows.h
@@ -210,6 +210,11 @@ public:
* Rearranges the window
*/
virtual void rearrange(const Common::Rect &box) { bbox = box; }
+
+ /**
+ * Get window split size within parent pair window
+ */
+ virtual glui32 getSplit(glui32 size, bool vertical) const { return 0; }
};
typedef Window *winid_t;
@@ -277,7 +282,15 @@ public:
/**
* Rearranges the window
*/
- virtual void rearrange(const Common::Rect &box);
+ virtual void rearrange(const Common::Rect &box) override;
+
+ /**
+ * Get window split size within parent pair window
+ */
+ virtual glui32 getSplit(glui32 size, bool vertical) const override {
+ return vertical ? size * Windows::_cellW + Windows::_tMarginx * 2 :
+ size * Windows::_cellH + Windows::_tMarginy * 2;
+ }
};
/**
@@ -373,7 +386,14 @@ public:
/**
* Rearranges the window
*/
- virtual void rearrange(const Common::Rect &box);
+ virtual void rearrange(const Common::Rect &box) override;
+
+ /**
+ * Get window split size within parent pair window
+ */
+ virtual glui32 getSplit(glui32 size, bool vertical) const override {
+ return (vertical) ? size * Windows::_cellW : size * Windows::_cellH;
+ }
/**
* Clear the window
@@ -385,11 +405,30 @@ public:
* Graphics window
*/
class GraphicsWindow : public Window {
+private:
+ void touch();
+public:
+ unsigned char bgnd[3];
+ bool dirty;
+ int w, h;
+ Graphics::ManagedSurface *_surface;
public:
/**
* Constructor
*/
GraphicsWindow(Windows *windows, uint32 rock);
+
+ /**
+ * Rearranges the window
+ */
+ virtual void rearrange(const Common::Rect &box) override;
+
+ /**
+ * Get window split size within parent pair window
+ */
+ virtual glui32 getSplit(glui32 size, bool vertical) const override {
+ return size;
+ }
};
/**
@@ -412,6 +451,11 @@ public:
* Constructor
*/
PairWindow(Windows *windows, glui32 method, Window *_key, glui32 _size);
+
+ /**
+ * Rearranges the window
+ */
+ virtual void rearrange(const Common::Rect &box) override;
};
} // End of namespace Gargoyle