diff options
| author | Paul Gilbert | 2018-10-19 19:37:03 -0700 | 
|---|---|---|
| committer | Paul Gilbert | 2018-12-08 19:05:59 -0800 | 
| commit | b9bafba382a9756cbedbb2008086208e24834139 (patch) | |
| tree | 0d50024fd840bc4543b655d57144519c9f8556fa | |
| parent | 89102c42cac1bd2367a6322f07286452bab21e11 (diff) | |
| download | scummvm-rg350-b9bafba382a9756cbedbb2008086208e24834139.tar.gz scummvm-rg350-b9bafba382a9756cbedbb2008086208e24834139.tar.bz2 scummvm-rg350-b9bafba382a9756cbedbb2008086208e24834139.zip | |
GLK: Remaining window rearrange code
| -rw-r--r-- | engines/gargoyle/picture.cpp | 38 | ||||
| -rw-r--r-- | engines/gargoyle/picture.h | 53 | ||||
| -rw-r--r-- | engines/gargoyle/windows.cpp | 152 | ||||
| -rw-r--r-- | engines/gargoyle/windows.h | 48 | 
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 | 
