Skip to content

Latest commit

 

History

History
404 lines (349 loc) · 10.5 KB

SDL_ph_modes.c

File metadata and controls

404 lines (349 loc) · 10.5 KB
 
Apr 26, 2001
Apr 26, 2001
1
2
/*
SDL - Simple DirectMedia Layer
Jan 4, 2004
Jan 4, 2004
3
Copyright (C) 1997-2004 Sam Lantinga
Apr 26, 2001
Apr 26, 2001
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Sam Lantinga
Dec 14, 2001
Dec 14, 2001
20
slouken@libsdl.org
Apr 26, 2001
Apr 26, 2001
21
22
23
24
25
26
27
*/
#ifdef SAVE_RCSID
static char rcsid =
"@(#) $Id$";
#endif
Aug 4, 2003
Aug 4, 2003
28
#include "SDL_error.h"
Apr 26, 2001
Apr 26, 2001
29
30
31
32
33
#include "SDL_ph_modes_c.h"
static unsigned long key1, key2;
static PgVideoModeInfo_t mode_info;
static PgVideoModes_t mode_list;
Jan 18, 2002
Jan 18, 2002
34
Jan 20, 2003
Jan 20, 2003
35
/* The current list of available video modes */
Jan 18, 2002
Jan 18, 2002
36
37
SDL_Rect SDL_modelist[PH_MAX_VIDEOMODES];
SDL_Rect* SDL_modearray[PH_MAX_VIDEOMODES];
Apr 26, 2001
Apr 26, 2001
38
39
40
static int compare_modes_by_res(const void* mode1, const void* mode2)
{
Nov 12, 2004
Nov 12, 2004
41
42
43
44
PgVideoModeInfo_t mode1_info;
PgVideoModeInfo_t mode2_info;
if (PgGetVideoModeInfo(*(unsigned short*)mode1, &mode1_info) < 0)
Jan 20, 2003
Jan 20, 2003
45
46
47
{
return 0;
}
Apr 26, 2001
Apr 26, 2001
48
Nov 12, 2004
Nov 12, 2004
49
if (PgGetVideoModeInfo(*(unsigned short*)mode2, &mode2_info) < 0)
Jan 20, 2003
Jan 20, 2003
50
51
52
{
return 0;
}
Apr 26, 2001
Apr 26, 2001
53
Nov 12, 2004
Nov 12, 2004
54
if (mode1_info.width == mode2_info.width)
Aug 4, 2003
Aug 4, 2003
55
{
Nov 12, 2004
Nov 12, 2004
56
return mode2_info.height - mode1_info.height;
Aug 4, 2003
Aug 4, 2003
57
}
Jan 20, 2003
Jan 20, 2003
58
else
Aug 4, 2003
Aug 4, 2003
59
{
Nov 12, 2004
Nov 12, 2004
60
return mode2_info.width - mode1_info.width;
Aug 4, 2003
Aug 4, 2003
61
}
Apr 26, 2001
Apr 26, 2001
62
63
}
Jan 18, 2002
Jan 18, 2002
64
SDL_Rect **ph_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags)
Apr 26, 2001
Apr 26, 2001
65
{
Mar 11, 2002
Mar 11, 2002
66
67
68
int i = 0;
int j = 0;
SDL_Rect Amodelist[PH_MAX_VIDEOMODES];
Apr 26, 2001
Apr 26, 2001
69
Mar 11, 2002
Mar 11, 2002
70
71
72
73
for (i=0; i<PH_MAX_VIDEOMODES; i++)
{
SDL_modearray[i]=&SDL_modelist[i];
}
Apr 26, 2001
Apr 26, 2001
74
Feb 14, 2004
Feb 14, 2004
75
if (PgGetVideoModeList(&mode_list) < 0)
Mar 11, 2002
Mar 11, 2002
76
{
Aug 4, 2003
Aug 4, 2003
77
SDL_SetError("ph_ListModes(): PgGetVideoModeList() function failed !\n");
Mar 11, 2002
Mar 11, 2002
78
79
return NULL;
}
Apr 26, 2001
Apr 26, 2001
80
Mar 11, 2002
Mar 11, 2002
81
mode_info.bits_per_pixel = 0;
Jan 18, 2002
Jan 18, 2002
82
Mar 11, 2002
Mar 11, 2002
83
84
85
86
for (i=0; i < mode_list.num_modes; i++)
{
if (PgGetVideoModeInfo(mode_list.modes[i], &mode_info) < 0)
{
Aug 4, 2003
Aug 4, 2003
87
SDL_SetError("ph_ListModes(): PgGetVideoModeInfo() function failed on mode: 0x%X.\n", mode_list.modes[i]);
Mar 11, 2002
Mar 11, 2002
88
89
90
91
92
93
94
95
96
97
98
return NULL;
}
if(mode_info.bits_per_pixel == format->BitsPerPixel)
{
Amodelist[j].w = mode_info.width;
Amodelist[j].h = mode_info.height;
Amodelist[j].x = 0;
Amodelist[j].y = 0;
j++;
}
}
Apr 26, 2001
Apr 26, 2001
99
Mar 11, 2002
Mar 11, 2002
100
/* reorder biggest for smallest, assume width dominates */
Apr 26, 2001
Apr 26, 2001
101
Mar 11, 2002
Mar 11, 2002
102
103
for(i=0; i<j; i++)
{
Feb 14, 2004
Feb 14, 2004
104
105
106
107
SDL_modelist[i].w = Amodelist[j - i - 1].w;
SDL_modelist[i].h = Amodelist[j - i - 1].h;
SDL_modelist[i].x = Amodelist[j - i - 1].x;
SDL_modelist[i].y = Amodelist[j - i - 1].y;
Mar 11, 2002
Mar 11, 2002
108
109
}
SDL_modearray[j]=NULL;
Jan 18, 2002
Jan 18, 2002
110
Mar 11, 2002
Mar 11, 2002
111
return SDL_modearray;
Apr 26, 2001
Apr 26, 2001
112
113
114
115
}
void ph_FreeVideoModes(_THIS)
{
Jan 18, 2002
Jan 18, 2002
116
return;
Apr 26, 2001
Apr 26, 2001
117
118
119
}
/* return the mode associated with width, height and bpp */
Mar 11, 2002
Mar 11, 2002
120
/* if there is no mode then zero is returned */
Aug 4, 2003
Aug 4, 2003
121
int ph_GetVideoMode(int width, int height, int bpp)
Apr 26, 2001
Apr 26, 2001
122
{
Mar 11, 2002
Mar 11, 2002
123
int i;
Feb 14, 2004
Feb 14, 2004
124
125
int modestage=0;
int closestmode=0;
Apr 26, 2001
Apr 26, 2001
126
Mar 11, 2002
Mar 11, 2002
127
128
129
130
if (PgGetVideoModeList(&mode_list) < 0)
{
return -1;
}
Apr 26, 2001
Apr 26, 2001
131
Feb 14, 2004
Feb 14, 2004
132
133
134
135
136
137
/* special case for the double-sized 320x200 mode */
if ((width==640) && (height==400))
{
modestage=1;
}
Mar 11, 2002
Mar 11, 2002
138
/* search list for exact match */
Feb 14, 2004
Feb 14, 2004
139
for (i=0; i<mode_list.num_modes; i++)
Mar 11, 2002
Mar 11, 2002
140
141
142
143
144
{
if (PgGetVideoModeInfo(mode_list.modes[i], &mode_info) < 0)
{
return 0;
}
Apr 26, 2001
Apr 26, 2001
145
Feb 14, 2004
Feb 14, 2004
146
if ((mode_info.width == width) && (mode_info.height == height) &&
Mar 11, 2002
Mar 11, 2002
147
148
149
150
(mode_info.bits_per_pixel == bpp))
{
return mode_list.modes[i];
}
Feb 14, 2004
Feb 14, 2004
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
else
{
if ((modestage) && (mode_info.width == width) && (mode_info.height == height+80) &&
(mode_info.bits_per_pixel == bpp))
{
modestage=2;
closestmode=mode_list.modes[i];
}
}
}
/* if we are here, then no 640x400xbpp mode found and we'll emulate it via 640x480xbpp mode */
if (modestage==2)
{
return closestmode;
Mar 11, 2002
Mar 11, 2002
166
}
Apr 26, 2001
Apr 26, 2001
167
Mar 11, 2002
Mar 11, 2002
168
return (i == mode_list.num_modes) ? 0 : mode_list.modes[i];
Apr 26, 2001
Apr 26, 2001
169
170
}
Feb 14, 2004
Feb 14, 2004
171
/* return the mode associated with width, height and bpp */
Apr 26, 2001
Apr 26, 2001
172
/* if requested bpp is not found the mode with closest bpp is returned */
Aug 4, 2003
Aug 4, 2003
173
int get_mode_any_format(int width, int height, int bpp)
Apr 26, 2001
Apr 26, 2001
174
175
176
{
int i, closest, delta, min_delta;
Aug 4, 2003
Aug 4, 2003
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
if (PgGetVideoModeList(&mode_list) < 0)
{
return -1;
}
qsort(mode_list.modes, mode_list.num_modes, sizeof(unsigned short), compare_modes_by_res);
for(i=0;i<mode_list.num_modes;i++)
{
if (PgGetVideoModeInfo(mode_list.modes[i], &mode_info) < 0)
{
return 0;
}
if ((mode_info.width == width) && (mode_info.height == height))
{
Apr 26, 2001
Apr 26, 2001
192
break;
Aug 4, 2003
Aug 4, 2003
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
}
}
if (i<mode_list.num_modes)
{
/* get closest bpp */
closest = i++;
if (mode_info.bits_per_pixel == bpp)
{
return mode_list.modes[closest];
}
min_delta = abs(mode_info.bits_per_pixel - bpp);
while(1)
{
if (PgGetVideoModeInfo(mode_list.modes[i], &mode_info) < 0)
{
return 0;
}
if ((mode_info.width != width) || (mode_info.height != height))
{
break;
}
else
{
if (mode_info.bits_per_pixel == bpp)
{
closest = i;
break;
}
else
{
delta = abs(mode_info.bits_per_pixel - bpp);
if (delta < min_delta)
{
closest = i;
min_delta = delta;
}
i++;
}
}
}
return mode_list.modes[closest];
}
Mar 11, 2002
Mar 11, 2002
240
return 0;
Apr 26, 2001
Apr 26, 2001
241
242
243
244
}
int ph_ToggleFullScreen(_THIS, int on)
{
Aug 4, 2003
Aug 4, 2003
245
return -1;
Apr 26, 2001
Apr 26, 2001
246
247
}
Jul 18, 2004
Jul 18, 2004
248
int ph_EnterFullScreen(_THIS, SDL_Surface* screen, int fmode)
Apr 26, 2001
Apr 26, 2001
249
{
Aug 4, 2003
Aug 4, 2003
250
251
PgDisplaySettings_t settings;
int mode;
Feb 14, 2004
Feb 14, 2004
252
253
char* refreshrate;
int refreshratenum;
Aug 4, 2003
Aug 4, 2003
254
Mar 11, 2002
Mar 11, 2002
255
256
if (!currently_fullscreen)
{
Aug 4, 2003
Aug 4, 2003
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
/* Get the video mode and set it */
if (screen->flags & SDL_ANYFORMAT)
{
if ((mode = get_mode_any_format(screen->w, screen->h, screen->format->BitsPerPixel)) == 0)
{
SDL_SetError("ph_EnterFullScreen(): can't find appropriate video mode !\n");
return 0;
}
}
else
{
if ((mode = ph_GetVideoMode(screen->w, screen->h, screen->format->BitsPerPixel)) == 0)
{
SDL_SetError("ph_EnterFullScreen(): can't find appropriate video mode !\n");
return 0;
}
Feb 14, 2004
Feb 14, 2004
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
if (PgGetVideoModeInfo(mode, &mode_info) < 0)
{
SDL_SetError("ph_EnterFullScreen(): can't get video mode capabilities !\n");
return 0;
}
if (mode_info.height != screen->h)
{
if ((mode_info.height==480) && (screen->h==400))
{
videomode_emulatemode=1;
}
}
else
{
videomode_emulatemode=0;
}
Aug 4, 2003
Aug 4, 2003
289
290
291
292
293
294
295
296
297
298
299
300
}
/* save old video mode caps */
PgGetVideoMode(&settings);
old_video_mode=settings.mode;
old_refresh_rate=settings.refresh;
/* setup new video mode */
settings.mode = mode;
settings.refresh = 0;
settings.flags = 0;
Feb 14, 2004
Feb 14, 2004
301
302
303
304
305
306
307
308
309
refreshrate=getenv("SDL_PHOTON_FULLSCREEN_REFRESH");
if (refreshrate!=NULL)
{
if (sscanf(refreshrate, "%d", &refreshratenum)==1)
{
settings.refresh = refreshratenum;
}
}
Aug 4, 2003
Aug 4, 2003
310
311
312
313
314
315
if (PgSetVideoMode(&settings) < 0)
{
SDL_SetError("ph_EnterFullScreen(): PgSetVideoMode() call failed !\n");
return 0;
}
Mar 23, 2002
Mar 23, 2002
316
if (this->screen)
Mar 11, 2002
Mar 11, 2002
317
{
Mar 23, 2002
Mar 23, 2002
318
319
if ((this->screen->flags & SDL_OPENGL)==SDL_OPENGL)
{
Mar 11, 2002
Mar 11, 2002
320
#ifdef HAVE_OPENGL
Jul 18, 2004
Jul 18, 2004
321
322
323
324
#if (_NTO_VERSION < 630)
return 0;
#endif /* 6.3.0 */
#else
Mar 23, 2002
Mar 23, 2002
325
return 0;
Jul 18, 2004
Jul 18, 2004
326
#endif /* HAVE_OPENGL */
Mar 23, 2002
Mar 23, 2002
327
}
Mar 11, 2002
Mar 11, 2002
328
}
Mar 23, 2002
Mar 23, 2002
329
Jul 18, 2004
Jul 18, 2004
330
if (fmode==0)
Mar 11, 2002
Mar 11, 2002
331
{
Jul 18, 2004
Jul 18, 2004
332
if (OCImage.direct_context==NULL)
Aug 4, 2003
Aug 4, 2003
333
{
Jul 18, 2004
Jul 18, 2004
334
335
336
337
338
339
340
OCImage.direct_context=(PdDirectContext_t*)PdCreateDirectContext();
if (!OCImage.direct_context)
{
SDL_SetError("ph_EnterFullScreen(): Can't create direct context !\n");
ph_LeaveFullScreen(this);
return 0;
}
Aug 4, 2003
Aug 4, 2003
341
}
Jul 18, 2004
Jul 18, 2004
342
OCImage.oldDC=PdDirectStart(OCImage.direct_context);
Mar 23, 2002
Mar 23, 2002
343
}
Apr 26, 2001
Apr 26, 2001
344
Mar 23, 2002
Mar 23, 2002
345
currently_fullscreen = 1;
Mar 11, 2002
Mar 11, 2002
346
}
Aug 23, 2003
Aug 23, 2003
347
PgFlush();
Apr 26, 2001
Apr 26, 2001
348
Mar 11, 2002
Mar 11, 2002
349
return 1;
Apr 26, 2001
Apr 26, 2001
350
351
}
Mar 23, 2002
Mar 23, 2002
352
int ph_LeaveFullScreen(_THIS)
Apr 26, 2001
Apr 26, 2001
353
{
Aug 23, 2003
Aug 23, 2003
354
PgDisplaySettings_t oldmode_settings;
Apr 26, 2001
Apr 26, 2001
355
Mar 11, 2002
Mar 11, 2002
356
357
if (currently_fullscreen)
{
Aug 4, 2003
Aug 4, 2003
358
if ((this->screen) && ((this->screen->flags & SDL_OPENGL)==SDL_OPENGL))
Mar 11, 2002
Mar 11, 2002
359
360
{
#ifdef HAVE_OPENGL
Jul 18, 2004
Jul 18, 2004
361
362
363
364
365
#if (_NTO_VERSION < 630)
return 0;
#endif /* 6.3.0 */
#else
return 0;
Mar 11, 2002
Mar 11, 2002
366
367
#endif /* HAVE_OPENGL */
}
Jul 18, 2004
Jul 18, 2004
368
369
/* release routines starts here */
Mar 11, 2002
Mar 11, 2002
370
{
Aug 4, 2003
Aug 4, 2003
371
372
373
374
375
376
377
378
379
380
381
if (OCImage.direct_context)
{
PdDirectStop(OCImage.direct_context);
PdReleaseDirectContext(OCImage.direct_context);
OCImage.direct_context=NULL;
}
if (OCImage.oldDC)
{
PhDCSetCurrent(OCImage.oldDC);
OCImage.oldDC=NULL;
}
Jan 20, 2003
Jan 20, 2003
382
Mar 23, 2002
Mar 23, 2002
383
currently_fullscreen=0;
Apr 26, 2001
Apr 26, 2001
384
Mar 11, 2002
Mar 11, 2002
385
386
387
/* Restore old video mode */
if (old_video_mode != -1)
{
Aug 23, 2003
Aug 23, 2003
388
389
390
oldmode_settings.mode = (unsigned short) old_video_mode;
oldmode_settings.refresh = (unsigned short) old_refresh_rate;
oldmode_settings.flags = 0;
Mar 23, 2002
Mar 23, 2002
391
Aug 23, 2003
Aug 23, 2003
392
if (PgSetVideoMode(&oldmode_settings) < 0)
Mar 11, 2002
Mar 11, 2002
393
{
Aug 4, 2003
Aug 4, 2003
394
SDL_SetError("Ph_LeaveFullScreen(): PgSetVideoMode() function failed !\n");
Jan 20, 2003
Jan 20, 2003
395
return 0;
Mar 11, 2002
Mar 11, 2002
396
397
398
399
}
}
old_video_mode=-1;
Mar 23, 2002
Mar 23, 2002
400
old_refresh_rate=-1;
Mar 11, 2002
Mar 11, 2002
401
402
403
}
}
return 1;
Apr 26, 2001
Apr 26, 2001
404
}