1 |
dpavlin |
1 |
/* |
2 |
|
|
* HT Editor |
3 |
|
|
* display.h |
4 |
|
|
* |
5 |
|
|
* Copyright (C) 2003,2004 Stefan Weyergraf |
6 |
|
|
* |
7 |
|
|
* This program is free software; you can redistribute it and/or modify |
8 |
|
|
* it under the terms of the GNU General Public License version 2 as |
9 |
|
|
* published by the Free Software Foundation. |
10 |
|
|
* |
11 |
|
|
* This program is distributed in the hope that it will be useful, |
12 |
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 |
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 |
|
|
* GNU General Public License for more details. |
15 |
|
|
* |
16 |
|
|
* You should have received a copy of the GNU General Public License |
17 |
|
|
* along with this program; if not, write to the Free Software |
18 |
|
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
19 |
|
|
*/ |
20 |
|
|
|
21 |
|
|
#ifndef __SYSTEM_DISPLAY_H__ |
22 |
|
|
#define __SYSTEM_DISPLAY_H__ |
23 |
|
|
|
24 |
|
|
#include "tools/data.h" |
25 |
|
|
#include "tools/stream.h" |
26 |
|
|
#include "types.h" |
27 |
|
|
#include "keyboard.h" |
28 |
|
|
|
29 |
|
|
/* codepages */ |
30 |
|
|
|
31 |
|
|
#define CP_DEVICE 0 |
32 |
|
|
#define CP_GRAPHICAL 1 |
33 |
|
|
#define CP_WINDOWS 0x100 |
34 |
|
|
|
35 |
|
|
/* "graphical" chars (ie. lines, corners and patterns like in ASCII) */ |
36 |
|
|
|
37 |
|
|
#define GC_TRANSPARENT '0' // transparent |
38 |
|
|
|
39 |
|
|
extern byte * gFrameBuffer; |
40 |
|
|
extern int gDamageAreaFirstAddr, gDamageAreaLastAddr; |
41 |
|
|
|
42 |
|
|
inline void damageFrameBuffer(int addr) |
43 |
|
|
{ |
44 |
|
|
if (addr < gDamageAreaFirstAddr) { |
45 |
|
|
gDamageAreaFirstAddr = addr; |
46 |
|
|
} |
47 |
|
|
|
48 |
|
|
if (addr > gDamageAreaLastAddr) { |
49 |
|
|
gDamageAreaLastAddr = addr; |
50 |
|
|
} |
51 |
|
|
} |
52 |
|
|
|
53 |
|
|
inline void damageFrameBufferAll() |
54 |
|
|
{ |
55 |
|
|
gDamageAreaFirstAddr = 0; |
56 |
|
|
gDamageAreaLastAddr = 0xffffff0; |
57 |
|
|
} |
58 |
|
|
|
59 |
|
|
inline void healFrameBuffer() |
60 |
|
|
{ |
61 |
|
|
gDamageAreaFirstAddr = 0xffffff0; |
62 |
|
|
gDamageAreaLastAddr = 0; |
63 |
|
|
} |
64 |
|
|
|
65 |
|
|
/* virtual colors */ |
66 |
|
|
|
67 |
|
|
typedef int vc; |
68 |
|
|
|
69 |
|
|
#define VC_BLACK 0 |
70 |
|
|
#define VC_BLUE 1 |
71 |
|
|
#define VC_GREEN 2 |
72 |
|
|
#define VC_CYAN 3 |
73 |
|
|
#define VC_RED 4 |
74 |
|
|
#define VC_MAGENTA 5 |
75 |
|
|
#define VC_YELLOW 6 |
76 |
|
|
#define VC_WHITE 7 |
77 |
|
|
#define VC_TRANSPARENT 8 |
78 |
|
|
|
79 |
|
|
#define VC_LIGHT(vc) ((vc) | 0x80) |
80 |
|
|
|
81 |
|
|
#define VC_GET_LIGHT(vc) ((vc) & 0x80) |
82 |
|
|
#define VC_GET_BASECOLOR(vc) ((vc) & 0x7f) |
83 |
|
|
|
84 |
|
|
/* virtual color pairs (fg/bg) */ |
85 |
|
|
|
86 |
|
|
typedef int vcp; |
87 |
|
|
|
88 |
|
|
#define VCP(vc_fg, vc_bg) (vcp)((vc_bg) | ((vc_fg)<<8)) |
89 |
|
|
#define VCP_BACKGROUND(v) ((v) & 0xff) |
90 |
|
|
#define VCP_FOREGROUND(v) ((v>>8) & 0xff) |
91 |
|
|
|
92 |
|
|
struct BufferedChar { |
93 |
|
|
uint rawchar; |
94 |
|
|
vcp color; |
95 |
|
|
}; |
96 |
|
|
|
97 |
|
|
class DisplayCharacteristics: public Object { |
98 |
|
|
public: |
99 |
|
|
int width, height; |
100 |
|
|
int bytesPerPixel; // may only be 1, 2 or 4 |
101 |
|
|
int scanLineLength; |
102 |
|
|
int vsyncFrequency; |
103 |
|
|
|
104 |
|
|
int redShift; |
105 |
|
|
int redSize; |
106 |
|
|
int greenShift; |
107 |
|
|
int greenSize; |
108 |
|
|
int blueShift; |
109 |
|
|
int blueSize; |
110 |
|
|
|
111 |
|
|
inline DisplayCharacteristics & operator =(const DisplayCharacteristics &chr) |
112 |
|
|
{ |
113 |
|
|
width = chr.width; |
114 |
|
|
height = chr.height; |
115 |
|
|
bytesPerPixel = chr.bytesPerPixel; |
116 |
|
|
scanLineLength = chr.scanLineLength; |
117 |
|
|
vsyncFrequency = chr.vsyncFrequency; |
118 |
|
|
|
119 |
|
|
redShift = chr.redShift; |
120 |
|
|
redSize = chr.redSize; |
121 |
|
|
greenShift = chr.greenShift; |
122 |
|
|
greenSize = chr.greenSize; |
123 |
|
|
blueShift = chr.blueShift; |
124 |
|
|
blueSize = chr.blueSize; |
125 |
|
|
return *this; |
126 |
|
|
} |
127 |
|
|
|
128 |
|
|
#define COMPARE(a) do { \ |
129 |
|
|
if (a < ((DisplayCharacteristics *)obj)->a) return -1; \ |
130 |
|
|
if (a > ((DisplayCharacteristics *)obj)->a) return 1; \ |
131 |
|
|
} while (0); |
132 |
|
|
|
133 |
|
|
virtual int compareTo(const Object *obj) const |
134 |
|
|
{ |
135 |
|
|
COMPARE(width); |
136 |
|
|
COMPARE(height); |
137 |
|
|
COMPARE(bytesPerPixel); |
138 |
|
|
COMPARE(scanLineLength); |
139 |
|
|
COMPARE(vsyncFrequency); |
140 |
|
|
COMPARE(redShift); |
141 |
|
|
COMPARE(redSize); |
142 |
|
|
COMPARE(greenShift); |
143 |
|
|
COMPARE(greenSize); |
144 |
|
|
COMPARE(blueShift); |
145 |
|
|
COMPARE(blueSize); |
146 |
|
|
return 0; |
147 |
|
|
} |
148 |
|
|
#undef COMPARE |
149 |
|
|
|
150 |
|
|
}; |
151 |
|
|
|
152 |
|
|
void dumpDisplayChar(const DisplayCharacteristics &chr); |
153 |
|
|
|
154 |
|
|
typedef uint32 RGB; |
155 |
|
|
typedef uint32 RGBA; |
156 |
|
|
|
157 |
|
|
#define RGBA_R(rgba) (rgba & 0xff) |
158 |
|
|
#define RGBA_G(rgba) ((rgba>>8) & 0xff) |
159 |
|
|
#define RGBA_B(rgba) ((rgba>>16) & 0xff) |
160 |
|
|
#define RGBA_A(rgba) ((rgba>>24) & 0xff) |
161 |
|
|
#define MK_RGBA(r, g, b, a) ((r) | ((g)<<8) | ((b)<<16) | ((a)<<24)) |
162 |
|
|
#define RGBA_SETA(rgba, a) (((rgba) & 0xffffff) | (a<<24)); |
163 |
|
|
|
164 |
|
|
#define RGB_R(rgb) (rgb & 0xff) |
165 |
|
|
#define RGB_G(rgb) ((rgb>>8) & 0xff) |
166 |
|
|
#define RGB_B(rgb) ((rgb>>16) & 0xff) |
167 |
|
|
#define MK_RGB(r, g, b) ((r) | ((g)<<8) | ((b)<<16)) |
168 |
|
|
|
169 |
|
|
#define KEYB_LED_NUM 1 |
170 |
|
|
#define KEYB_LED_CAPS 2 |
171 |
|
|
#define KEYB_LED_SCROLL 3 |
172 |
|
|
|
173 |
|
|
class SystemDisplay: public Object |
174 |
|
|
{ |
175 |
|
|
protected: |
176 |
|
|
Object *vt; |
177 |
|
|
Object *mFont; |
178 |
|
|
int mVTWidth; |
179 |
|
|
int mVTHeight; |
180 |
|
|
int mVTDX; |
181 |
|
|
int mVTDY; |
182 |
|
|
bool mExposed; |
183 |
|
|
RGB palette[256]; // only used in indexed modes |
184 |
|
|
|
185 |
|
|
/* hw cursor */ |
186 |
|
|
int mHWCursorX, mHWCursorY; |
187 |
|
|
int mHWCursorVisible; |
188 |
|
|
byte * mHWCursorData; |
189 |
|
|
|
190 |
|
|
public: // until we know better |
191 |
|
|
/* menu */ |
192 |
|
|
int mMenuX, mMenuHeight; |
193 |
|
|
Array * mMenu; |
194 |
|
|
|
195 |
|
|
bool mMouseGrabbed; |
196 |
|
|
int mRedraw_ms; |
197 |
|
|
int mCurMouseX, mCurMouseY; |
198 |
|
|
int mResetMouseX, mResetMouseY; |
199 |
|
|
int mHomeMouseX, mHomeMouseY; |
200 |
|
|
bool mFullscreen; |
201 |
|
|
bool mFullscreenChanged; |
202 |
|
|
|
203 |
|
|
static inline void convertBaseColor(uint &b, uint fromBits, uint toBits) |
204 |
|
|
{ |
205 |
|
|
if (toBits > fromBits) { |
206 |
|
|
b <<= toBits - fromBits; |
207 |
|
|
} else { |
208 |
|
|
b >>= fromBits - toBits; |
209 |
|
|
} |
210 |
|
|
} |
211 |
|
|
|
212 |
|
|
void mixRGB(); |
213 |
|
|
public: |
214 |
|
|
DisplayCharacteristics mClientChar; |
215 |
|
|
BufferedChar *buf; |
216 |
|
|
|
217 |
|
|
SystemDisplay(const DisplayCharacteristics &aClientChr, int redraw_ms); |
218 |
|
|
virtual ~SystemDisplay(); |
219 |
|
|
|
220 |
|
|
virtual void displayShow() = 0; |
221 |
|
|
|
222 |
|
|
/* |
223 |
|
|
* Note: this function might do different things when in / not in fullscreen |
224 |
|
|
* mode. |
225 |
|
|
*/ |
226 |
|
|
virtual void convertCharacteristicsToHost(DisplayCharacteristics &aHostChar, const DisplayCharacteristics &aClientChar) = 0; |
227 |
|
|
|
228 |
|
|
virtual bool changeResolution(const DisplayCharacteristics &aChar) = 0; |
229 |
|
|
bool setFullscreenMode(bool fullscreen); |
230 |
|
|
virtual void getHostCharacteristics(Container &modes) = 0; |
231 |
|
|
|
232 |
|
|
/* VT */ |
233 |
|
|
bool openVT(int width, int height, int dx, int dy, File &font); |
234 |
|
|
void closeVT(); |
235 |
|
|
void print(const char *s); |
236 |
|
|
void printf(const char *s, ...); |
237 |
|
|
virtual void drawChar(int x, int y, vcp color, byte chr); |
238 |
|
|
virtual void fillVT(int x, int y, int w, int h, vcp color, byte chr); |
239 |
|
|
virtual void fillAllVT(vcp color, byte chr); |
240 |
|
|
void setAnsiColor(vcp color); |
241 |
|
|
|
242 |
|
|
/* ui */ |
243 |
|
|
void insertMenuButton(Stream &str, void (*callback)(void *), void *p); |
244 |
|
|
virtual void updateTitle() = 0; |
245 |
|
|
virtual void finishMenu() = 0; |
246 |
|
|
void drawMenu(); |
247 |
|
|
void clickMenu(int x, int y); |
248 |
|
|
void composeKeyDialog(); |
249 |
|
|
void drawCircleFilled(int x, int y, int w, int h, int cx, int cy, int radius, RGBA fg, RGBA bg); |
250 |
|
|
void drawBox(int x, int y, int w, int h, RGBA fg, RGBA bg); |
251 |
|
|
void setHWCursor(int x, int y, bool visible, byte *data); |
252 |
|
|
void setColor(int idx, RGB color); |
253 |
|
|
RGB getColor(int idx); |
254 |
|
|
void fillRGB(int x, int y, int w, int h, RGB rgb); |
255 |
|
|
void fillRGBA(int x, int y, int w, int h, RGBA rgba); |
256 |
|
|
void mixRGB(byte *pixel, RGB rgb); |
257 |
|
|
void mixRGBA(byte *pixel, RGBA rgba); |
258 |
|
|
void outText(int x, int y, RGBA fg, RGBA bg, const char *text); |
259 |
|
|
void putPixelRGB(int x, int y, RGB rgb); |
260 |
|
|
void putPixelRGBA(int x, int y, RGBA rgba); |
261 |
|
|
|
262 |
|
|
inline void setExposed(bool exposed) |
263 |
|
|
{ |
264 |
|
|
mExposed = exposed; |
265 |
|
|
} |
266 |
|
|
|
267 |
|
|
inline bool isExposed() |
268 |
|
|
{ |
269 |
|
|
return mExposed; |
270 |
|
|
} |
271 |
|
|
|
272 |
|
|
inline bool isMouseGrabbed() |
273 |
|
|
{ |
274 |
|
|
return mMouseGrabbed; |
275 |
|
|
} |
276 |
|
|
|
277 |
|
|
virtual void setMouseGrab(bool mouseGrab); |
278 |
|
|
}; |
279 |
|
|
|
280 |
|
|
extern SystemDisplay *gDisplay; |
281 |
|
|
|
282 |
|
|
// should be declared elsewhere |
283 |
|
|
void initUI(const char *title, const DisplayCharacteristics &aCharacteristics, int redraw_ms, const KeyboardCharacteristics &keyCharacteristics, bool fullscreen); |
284 |
|
|
void doneUI(); |
285 |
|
|
|
286 |
|
|
#endif /* __SYSTEM_DISPLAY_H__ */ |