1 |
cebix |
1.1 |
/* |
2 |
|
|
* Display.h - C64 graphics display, emulator window handling |
3 |
|
|
* |
4 |
cebix |
1.3 |
* Frodo (C) 1994-1997,2002-2004 Christian Bauer |
5 |
cebix |
1.1 |
* |
6 |
|
|
* This program is free software; you can redistribute it and/or modify |
7 |
|
|
* it under the terms of the GNU General Public License as published by |
8 |
|
|
* the Free Software Foundation; either version 2 of the License, or |
9 |
|
|
* (at your option) any later version. |
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
19 |
|
|
*/ |
20 |
|
|
|
21 |
|
|
#ifndef _DISPLAY_H |
22 |
|
|
#define _DISPLAY_H |
23 |
|
|
|
24 |
|
|
#ifdef __BEOS__ |
25 |
|
|
#include <InterfaceKit.h> |
26 |
|
|
#endif |
27 |
|
|
|
28 |
|
|
#ifdef AMIGA |
29 |
|
|
#include <graphics/rastport.h> |
30 |
|
|
#endif |
31 |
|
|
|
32 |
|
|
#ifdef HAVE_SDL |
33 |
|
|
struct SDL_Surface; |
34 |
|
|
#endif |
35 |
|
|
|
36 |
|
|
#ifdef WIN32 |
37 |
|
|
#include <ddraw.h> |
38 |
|
|
#endif |
39 |
|
|
|
40 |
|
|
#ifdef __riscos__ |
41 |
|
|
#include "ROlib.h" |
42 |
|
|
#endif |
43 |
|
|
|
44 |
|
|
|
45 |
|
|
// Display dimensions |
46 |
|
|
#if defined(SMALL_DISPLAY) |
47 |
|
|
const int DISPLAY_X = 0x168; |
48 |
|
|
const int DISPLAY_Y = 0x110; |
49 |
|
|
#else |
50 |
|
|
const int DISPLAY_X = 0x180; |
51 |
|
|
const int DISPLAY_Y = 0x110; |
52 |
|
|
#endif |
53 |
|
|
|
54 |
|
|
|
55 |
|
|
class C64Window; |
56 |
|
|
class C64Screen; |
57 |
|
|
class C64; |
58 |
|
|
class Prefs; |
59 |
|
|
|
60 |
|
|
// Class for C64 graphics display |
61 |
|
|
class C64Display { |
62 |
|
|
public: |
63 |
|
|
C64Display(C64 *the_c64); |
64 |
|
|
~C64Display(); |
65 |
|
|
|
66 |
|
|
void Update(void); |
67 |
|
|
void UpdateLEDs(int l0, int l1, int l2, int l3); |
68 |
|
|
void Speedometer(int speed); |
69 |
|
|
uint8 *BitmapBase(void); |
70 |
|
|
int BitmapXMod(void); |
71 |
|
|
#ifdef __riscos__ |
72 |
|
|
void PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick, uint8 *joystick2); |
73 |
|
|
#else |
74 |
|
|
void PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick); |
75 |
|
|
#endif |
76 |
|
|
bool NumLock(void); |
77 |
|
|
void InitColors(uint8 *colors); |
78 |
|
|
void NewPrefs(Prefs *prefs); |
79 |
|
|
|
80 |
|
|
C64 *TheC64; |
81 |
|
|
|
82 |
|
|
#ifdef __BEOS__ |
83 |
|
|
void Pause(void); |
84 |
|
|
void Resume(void); |
85 |
|
|
#endif |
86 |
|
|
|
87 |
|
|
#ifdef __riscos__ |
88 |
|
|
void ModeChange(void); |
89 |
|
|
unsigned int *GetColourTable(void); // returns pointer to mode_cols |
90 |
|
|
bool CheckForUnpause(bool CheckLastState); |
91 |
|
|
|
92 |
|
|
ROScreen *screen; |
93 |
|
|
Joy_Keys JoystickKeys[2]; // it's easier making the joystick keys public |
94 |
|
|
#endif |
95 |
|
|
|
96 |
|
|
#ifdef __unix |
97 |
|
|
bool quit_requested; |
98 |
|
|
#endif |
99 |
|
|
|
100 |
|
|
private: |
101 |
|
|
int led_state[4]; |
102 |
|
|
int old_led_state[4]; |
103 |
|
|
|
104 |
|
|
#ifdef __BEOS__ |
105 |
|
|
C64Window *the_window; // One of these is NULL |
106 |
|
|
C64Screen *the_screen; |
107 |
|
|
bool using_screen; // Flag: Using the_screen |
108 |
|
|
key_info old_key_info; |
109 |
|
|
int draw_bitmap; // Number of bitmap for the VIC to draw into |
110 |
|
|
#endif |
111 |
|
|
|
112 |
|
|
#ifdef AMIGA |
113 |
|
|
void draw_led_bar(void); // Draw LED bar at the bottom of the window |
114 |
|
|
void draw_led(int num, int state); // Draw one LED |
115 |
|
|
|
116 |
|
|
struct Window *the_window; // Pointer to C64 display window |
117 |
|
|
struct Screen *the_screen; // The window's screen |
118 |
|
|
struct RastPort *the_rp; // The window's RastPort |
119 |
|
|
struct VisualInfo *the_visual_info; |
120 |
|
|
struct Menu *the_menus; |
121 |
|
|
struct TextFont *led_font; |
122 |
|
|
struct TextFont *speedo_font; |
123 |
|
|
struct RastPort temp_rp; // For WritePixelArray8() |
124 |
|
|
struct BitMap *temp_bm; |
125 |
|
|
uint8 *chunky_buf; // Chunky buffer for drawing into |
126 |
|
|
LONG pens[16]; // Pens for C64 colors |
127 |
|
|
int xo, yo; // Window X/Y border size |
128 |
|
|
struct FileRequester *open_req, *save_req; // File requesters for load/save snapshot |
129 |
|
|
#endif |
130 |
|
|
|
131 |
|
|
#ifdef HAVE_SDL |
132 |
|
|
char speedometer_string[16]; // Speedometer text |
133 |
|
|
void draw_string(SDL_Surface *s, int x, int y, const char *str, uint8 front_color, uint8 back_color); |
134 |
|
|
#endif |
135 |
|
|
|
136 |
|
|
#ifdef __unix |
137 |
|
|
void draw_led(int num, int state); // Draw one LED |
138 |
|
|
static void pulse_handler(...); // LED error blinking |
139 |
|
|
#endif |
140 |
|
|
|
141 |
|
|
#ifdef WIN32 |
142 |
|
|
public: |
143 |
|
|
long ShowRequester(const char *str, const char *button1, const char *button2 = NULL); |
144 |
|
|
void WaitUntilActive(); |
145 |
|
|
void NewPrefs(); |
146 |
|
|
void Pause(); |
147 |
|
|
void Resume(); |
148 |
|
|
void Quit(); |
149 |
|
|
|
150 |
|
|
struct DisplayMode { |
151 |
|
|
int x; |
152 |
|
|
int y; |
153 |
|
|
int depth; |
154 |
|
|
BOOL modex; |
155 |
|
|
}; |
156 |
|
|
int GetNumDisplayModes() const; |
157 |
|
|
const DisplayMode *GetDisplayModes() const; |
158 |
|
|
|
159 |
|
|
private: |
160 |
|
|
// Window members. |
161 |
|
|
void ResetKeyboardState(); |
162 |
|
|
BOOL MakeWindow(); |
163 |
|
|
static LRESULT CALLBACK StaticWindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); |
164 |
|
|
long WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); |
165 |
|
|
static int VirtKey2C64(int virtkey, DWORD keydata); |
166 |
|
|
BOOL CalcViewPort(); |
167 |
|
|
BOOL SetupWindow(); |
168 |
|
|
BOOL SetupWindowMode(BOOL full_screen); |
169 |
|
|
BOOL RestoreWindow(); |
170 |
|
|
BOOL ResizeWindow(int side, RECT *pRect); |
171 |
|
|
void WindowTitle(); |
172 |
|
|
void CreateObjects(); |
173 |
|
|
void DeleteObjects(); |
174 |
|
|
|
175 |
|
|
// DirectDraw management members. |
176 |
|
|
BOOL StartDirectDraw(); |
177 |
|
|
BOOL ResumeDirectDraw(); |
178 |
|
|
BOOL ResetDirectDraw(); |
179 |
|
|
BOOL StopDirectDraw(); |
180 |
|
|
static HRESULT CALLBACK EnumModesCallback(LPDDSURFACEDESC pDDSD, LPVOID lpContext); |
181 |
|
|
HRESULT EnumModesCallback(LPDDSURFACEDESC pDDSD); |
182 |
|
|
static int CompareModes(const void *e1, const void *e2); |
183 |
|
|
BOOL Fail(const char *message); |
184 |
|
|
|
185 |
|
|
// DirectDraw worker members. |
186 |
|
|
BOOL SetPalettes(); |
187 |
|
|
BOOL BuildColorTable(); |
188 |
|
|
BOOL CopySurface(RECT &rcWork); |
189 |
|
|
BOOL FlipSurfaces(); |
190 |
|
|
BOOL EraseSurfaces(); |
191 |
|
|
BOOL RestoreSurfaces(); |
192 |
|
|
|
193 |
|
|
void draw_led_bar(void); // Draw LED bar on the window |
194 |
|
|
void draw_leds(BOOL force = false); // Draw LEDs if force or changed |
195 |
|
|
void led_rect(int n, RECT &rc, RECT &led); // Compute LED rectangle |
196 |
|
|
void InsertNextDisk(); // should be a common func |
197 |
|
|
BOOL FileNameDialog(char *prefs_path, BOOL save = false); |
198 |
|
|
void OfferSave(); // Offer chance to save changes |
199 |
|
|
|
200 |
|
|
UBYTE *chunky_buf; // Chunky buffer for drawing |
201 |
|
|
BOOL active; // is application active? |
202 |
|
|
BOOL paused; // is application paused? |
203 |
|
|
BOOL waiting; // is application waiting? |
204 |
|
|
DWORD windowed_style; // style of windowed window |
205 |
|
|
DWORD fullscreen_style; // style of fullscreen window |
206 |
|
|
char failure_message[128]; // what when wrong |
207 |
|
|
int speed_index; // look ma, no hands |
208 |
|
|
BOOL show_leds; // cached prefs option |
209 |
|
|
BOOL full_screen; // cached prefs option |
210 |
|
|
BOOL in_constructor; // if we are being contructed |
211 |
|
|
BOOL in_destructor; // if we are being destroyed |
212 |
|
|
|
213 |
|
|
LPDIRECTDRAW pDD; // DirectDraw object |
214 |
|
|
LPDIRECTDRAWSURFACE pPrimary; // DirectDraw primary surface |
215 |
|
|
LPDIRECTDRAWSURFACE pBack; // DirectDraw back surface |
216 |
|
|
LPDIRECTDRAWSURFACE pWork; // DirectDraw working surface |
217 |
|
|
LPDIRECTDRAWCLIPPER pClipper; // DirectDraw clipper |
218 |
|
|
LPDIRECTDRAWPALETTE pPalette; // DirectDraw palette |
219 |
|
|
|
220 |
|
|
DWORD colors[256]; // our palette colors |
221 |
|
|
int colors_depth; // depth of the colors table |
222 |
|
|
#endif |
223 |
|
|
|
224 |
|
|
#ifdef __riscos__ |
225 |
|
|
unsigned int mode_cols[256]; // Colours in the current mode corresponding to C64's |
226 |
|
|
uint8 *bitmap; |
227 |
|
|
uint32 lastkeys[8]; // bitfield describing keys pressed last time. |
228 |
|
|
#endif |
229 |
|
|
}; |
230 |
|
|
|
231 |
|
|
|
232 |
|
|
// Exported functions |
233 |
|
|
extern long ShowRequester(char *str, char *button1, char *button2 = NULL); |
234 |
|
|
|
235 |
|
|
|
236 |
|
|
#endif |