aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/graphics/ports.h
blob: 818f92f44f9151b0ca223920176190ae3c4d1d46 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/* 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;

/**
 * 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 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 *newWindow(const Common::Rect &dims, const Common::Rect *restoreRect, const char *title, uint16 style, int16 priority, bool draw);
	void drawWindow(Window *wnd);
	void disposeWindow(Window *pWnd, bool reanimate);
	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 priorityBandsInit(int16 bandCount, int16 top, int16 bottom);
	void priorityBandsInit(byte *data);
	void priorityBandsRemember(byte *data);
	void priorityBandsRecall();

	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;

	/** 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];

	byte priorityBandsMemory[14];
	bool priorityBandsMemoryActive;
};

} // End of namespace Sci

#endif