Mercurial > sdl-ios-xcode
annotate test/testwin.c @ 1295:c3e36ac8a94c
Date: Sun, 6 Mar 2005 17:06:20 +0100
From: Per Inge Mathisen
Subject: [SDL] Fullscreen refresh on win32
Windows has a terrible default for fullscreen 3D apps of 60mhz refresh
rate. This can be fixed by the user by going into his driver's
control panel and forcing the refresh rate higher. However, this not a
very user friendly way about it, and in any case SDL contains no code
that could figure out this that condition has afflicted the user.
So the question is, could SDL fix this for the user? It is possible
under Windows to request a higher refresh rate. The danger is of
course that if the user has an old monitor, and you request a too high
refresh rate, the monitor could be damaged. However, I believe there
might be a way around that: Check before switching what refresh rate
the user's desktop runs in, and if our fullscreen dimensions are equal
or less than those of the desktop, use the higher refresh rate of 60
and the desktop rate.
Since most users run their desktops in the same or higher resolution
something sane, this should fix this problem for most users.
Thoughts?
An alternative is to add an SDL_GL_GetAttribute(SDL_GL_REFRESH_RATE)
option so that programs can bitch at their users at their own
convenience.
- Per
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 30 Jan 2006 06:56:10 +0000 |
parents | 51a8702d8ecd |
children | 14717b52abc0 |
rev | line source |
---|---|
0 | 1 |
2 /* Bring up a window and play with it */ | |
3 | |
4 #include <stdlib.h> | |
5 #include <stdio.h> | |
6 #include <string.h> | |
7 | |
8 #define BENCHMARK_SDL | |
9 | |
10 #define NOTICE(X) printf("%s", X); | |
11 | |
12 #include "SDL.h" | |
13 | |
1151
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
14 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */ |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
15 static void quit(int rc) |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
16 { |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
17 SDL_Quit(); |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
18 exit(rc); |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
19 } |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
20 |
0 | 21 void DrawPict(SDL_Surface *screen, char *bmpfile, |
22 int speedy, int flip, int nofade) | |
23 { | |
24 SDL_Surface *picture; | |
25 SDL_Rect dest, update; | |
26 int i, centered; | |
27 int ncolors; | |
28 SDL_Color *colors, *cmap; | |
29 | |
30 /* Load the image into a surface */ | |
31 if ( bmpfile == NULL ) { | |
32 bmpfile = "sample.bmp"; /* Sample image */ | |
33 } | |
34 fprintf(stderr, "Loading picture: %s\n", bmpfile); | |
35 picture = SDL_LoadBMP(bmpfile); | |
36 if ( picture == NULL ) { | |
37 fprintf(stderr, "Couldn't load %s: %s\n", bmpfile, | |
38 SDL_GetError()); | |
39 return; | |
40 } | |
41 | |
42 /* Set the display colors -- on a hicolor display this is a no-op */ | |
43 if ( picture->format->palette ) { | |
44 ncolors = picture->format->palette->ncolors; | |
45 colors = (SDL_Color *)malloc(ncolors*sizeof(SDL_Color)); | |
46 cmap = (SDL_Color *)malloc(ncolors*sizeof(SDL_Color)); | |
47 memcpy(colors, picture->format->palette->colors, | |
48 ncolors*sizeof(SDL_Color)); | |
49 } else { | |
50 int r, g, b; | |
51 | |
52 /* Allocate 256 color palette */ | |
53 ncolors = 256; | |
54 colors = (SDL_Color *)malloc(ncolors*sizeof(SDL_Color)); | |
55 cmap = (SDL_Color *)malloc(ncolors*sizeof(SDL_Color)); | |
56 | |
57 /* Set a 3,3,2 color cube */ | |
58 for ( r=0; r<8; ++r ) { | |
59 for ( g=0; g<8; ++g ) { | |
60 for ( b=0; b<4; ++b ) { | |
61 i = ((r<<5)|(g<<2)|b); | |
62 colors[i].r = r<<5; | |
63 colors[i].g = g<<5; | |
64 colors[i].b = b<<6; | |
65 } | |
66 } | |
67 } | |
68 } | |
69 NOTICE("testwin: setting colors\n"); | |
70 if ( ! SDL_SetColors(screen, colors, 0, ncolors) && | |
71 (screen->format->palette != NULL) ) { | |
72 fprintf(stderr, | |
73 "Warning: Couldn't set all of the colors, but SDL will map the image\n" | |
74 " (colormap fading will suffer - try the -warp option)\n" | |
75 ); | |
76 } | |
77 | |
78 /* Set the screen to black (not really necessary) */ | |
79 if ( SDL_LockSurface(screen) == 0 ) { | |
80 Uint32 black; | |
81 Uint8 *pixels; | |
82 | |
83 black = SDL_MapRGB(screen->format, 0, 0, 0); | |
84 pixels = (Uint8 *)screen->pixels; | |
85 for ( i=0; i<screen->h; ++i ) { | |
86 memset(pixels, black, | |
87 screen->w*screen->format->BytesPerPixel); | |
88 pixels += screen->pitch; | |
89 } | |
90 SDL_UnlockSurface(screen); | |
91 SDL_UpdateRect(screen, 0, 0, 0, 0); | |
92 } | |
93 | |
94 /* Display the picture */ | |
95 if ( speedy ) { | |
96 SDL_Surface *displayfmt; | |
97 | |
98 fprintf(stderr, "Converting picture\n"); | |
99 displayfmt = SDL_DisplayFormat(picture); | |
100 if ( displayfmt == NULL ) { | |
101 fprintf(stderr, | |
102 "Couldn't convert image: %s\n", SDL_GetError()); | |
103 goto done; | |
104 } | |
105 SDL_FreeSurface(picture); | |
106 picture = displayfmt; | |
107 } | |
108 printf("(image surface located in %s memory)\n", | |
109 (picture->flags&SDL_HWSURFACE) ? "video" : "system"); | |
110 centered = (screen->w - picture->w)/2; | |
111 if ( centered < 0 ) { | |
112 centered = 0; | |
113 } | |
114 dest.y = (screen->h - picture->h)/2; | |
115 dest.w = picture->w; | |
116 dest.h = picture->h; | |
117 NOTICE("testwin: moving image\n"); | |
118 for ( i=0; i<=centered; ++i ) { | |
119 dest.x = i; | |
120 update = dest; | |
121 if ( SDL_BlitSurface(picture, NULL, screen, &update) < 0 ) { | |
122 fprintf(stderr, "Blit failed: %s\n", SDL_GetError()); | |
123 break; | |
124 } | |
125 if ( flip ) { | |
126 SDL_Flip(screen); | |
127 } else { | |
128 SDL_UpdateRects(screen, 1, &update); | |
129 } | |
130 } | |
131 | |
132 #ifdef SCREENSHOT | |
133 if ( SDL_SaveBMP(screen, "screen.bmp") < 0 ) | |
134 printf("Couldn't save screen: %s\n", SDL_GetError()); | |
135 #endif | |
136 | |
137 #ifndef BENCHMARK_SDL | |
138 /* Let it sit there for a while */ | |
139 SDL_Delay(5*1000); | |
140 #endif | |
141 /* Fade the colormap */ | |
142 if ( ! nofade ) { | |
143 int maxstep; | |
144 SDL_Color final; | |
145 SDL_Color palcolors[256]; | |
146 struct { | |
147 Sint16 r, g, b; | |
148 } cdist[256]; | |
149 | |
150 NOTICE("testwin: fading out...\n"); | |
151 memcpy(cmap, colors, ncolors*sizeof(SDL_Color)); | |
152 maxstep = 32-1; | |
153 final.r = 0xFF; | |
154 final.g = 0x00; | |
155 final.b = 0x00; | |
156 memcpy(palcolors, colors, ncolors*sizeof(SDL_Color)); | |
157 for ( i=0; i<ncolors; ++i ) { | |
158 cdist[i].r = final.r-palcolors[i].r; | |
159 cdist[i].g = final.g-palcolors[i].g; | |
160 cdist[i].b = final.b-palcolors[i].b; | |
161 } | |
162 for ( i=0; i<=maxstep/2; ++i ) { /* halfway fade */ | |
163 int c; | |
164 for ( c=0; c<ncolors; ++c ) { | |
165 colors[c].r = | |
166 palcolors[c].r+((cdist[c].r*i))/maxstep; | |
167 colors[c].g = | |
168 palcolors[c].g+((cdist[c].g*i))/maxstep; | |
169 colors[c].b = | |
170 palcolors[c].b+((cdist[c].b*i))/maxstep; | |
171 } | |
172 SDL_SetColors(screen, colors, 0, ncolors); | |
173 SDL_Delay(1); | |
174 } | |
175 final.r = 0x00; | |
176 final.g = 0x00; | |
177 final.b = 0x00; | |
178 memcpy(palcolors, colors, ncolors*sizeof(SDL_Color)); | |
179 for ( i=0; i<ncolors; ++i ) { | |
180 cdist[i].r = final.r-palcolors[i].r; | |
181 cdist[i].g = final.g-palcolors[i].g; | |
182 cdist[i].b = final.b-palcolors[i].b; | |
183 } | |
184 maxstep /= 2; | |
185 for ( i=0; i<=maxstep; ++i ) { /* finish fade out */ | |
186 int c; | |
187 for ( c=0; c<ncolors; ++c ) { | |
188 colors[c].r = | |
189 palcolors[c].r+((cdist[c].r*i))/maxstep; | |
190 colors[c].g = | |
191 palcolors[c].g+((cdist[c].g*i))/maxstep; | |
192 colors[c].b = | |
193 palcolors[c].b+((cdist[c].b*i))/maxstep; | |
194 } | |
195 SDL_SetColors(screen, colors, 0, ncolors); | |
196 SDL_Delay(1); | |
197 } | |
198 for ( i=0; i<ncolors; ++i ) { | |
199 colors[i].r = final.r; | |
200 colors[i].g = final.g; | |
201 colors[i].b = final.b; | |
202 } | |
203 SDL_SetColors(screen, colors, 0, ncolors); | |
204 NOTICE("testwin: fading in...\n"); | |
205 memcpy(palcolors, colors, ncolors*sizeof(SDL_Color)); | |
206 for ( i=0; i<ncolors; ++i ) { | |
207 cdist[i].r = cmap[i].r-palcolors[i].r; | |
208 cdist[i].g = cmap[i].g-palcolors[i].g; | |
209 cdist[i].b = cmap[i].b-palcolors[i].b; | |
210 } | |
211 for ( i=0; i<=maxstep; ++i ) { /* 32 step fade in */ | |
212 int c; | |
213 for ( c=0; c<ncolors; ++c ) { | |
214 colors[c].r = | |
215 palcolors[c].r+((cdist[c].r*i))/maxstep; | |
216 colors[c].g = | |
217 palcolors[c].g+((cdist[c].g*i))/maxstep; | |
218 colors[c].b = | |
219 palcolors[c].b+((cdist[c].b*i))/maxstep; | |
220 } | |
221 SDL_SetColors(screen, colors, 0, ncolors); | |
222 SDL_Delay(1); | |
223 } | |
224 NOTICE("testwin: fading over\n"); | |
225 } | |
226 | |
227 done: | |
228 /* Free the picture and return */ | |
229 SDL_FreeSurface(picture); | |
230 free(colors); free(cmap); | |
231 return; | |
232 } | |
233 | |
234 int main(int argc, char *argv[]) | |
235 { | |
236 SDL_Surface *screen; | |
237 /* Options */ | |
238 int speedy, flip, nofade; | |
239 int delay; | |
240 int w, h; | |
241 int desired_bpp; | |
242 Uint32 video_flags; | |
243 #ifdef BENCHMARK_SDL | |
244 Uint32 then, now; | |
245 #endif | |
246 /* Set default options and check command-line */ | |
247 speedy = 0; | |
248 flip = 0; | |
249 nofade = 0; | |
250 delay = 1; | |
1152
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1151
diff
changeset
|
251 |
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1151
diff
changeset
|
252 #ifdef _WIN32_WCE |
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1151
diff
changeset
|
253 w = 640; |
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1151
diff
changeset
|
254 h = 320; |
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1151
diff
changeset
|
255 desired_bpp = 0; |
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1151
diff
changeset
|
256 video_flags = SDL_FULLSCREEN; |
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1151
diff
changeset
|
257 #else |
0 | 258 w = 640; |
259 h = 480; | |
260 desired_bpp = 0; | |
261 video_flags = 0; | |
1152
51a8702d8ecd
Updates to PocketPC (WinCE) support, thanks to Dmitry Yakimov at
Ryan C. Gordon <icculus@icculus.org>
parents:
1151
diff
changeset
|
262 #endif |
1151
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
263 if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) { |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
264 fprintf(stderr, |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
265 "Couldn't initialize SDL: %s\n", SDL_GetError()); |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
266 return(1); |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
267 } |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
268 |
0 | 269 while ( argc > 1 ) { |
270 if ( strcmp(argv[1], "-speedy") == 0 ) { | |
271 speedy = 1; | |
272 argv += 1; | |
273 argc -= 1; | |
274 } else | |
275 if ( strcmp(argv[1], "-nofade") == 0 ) { | |
276 nofade = 1; | |
277 argv += 1; | |
278 argc -= 1; | |
279 } else | |
280 if ( strcmp(argv[1], "-delay") == 0 ) { | |
281 if ( argv[2] ) { | |
282 delay = atoi(argv[2]); | |
283 argv += 2; | |
284 argc -= 2; | |
285 } else { | |
286 fprintf(stderr, | |
287 "The -delay option requires an argument\n"); | |
1151
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
288 quit(1); |
0 | 289 } |
290 } else | |
291 if ( strcmp(argv[1], "-width") == 0 ) { | |
292 if ( argv[2] && ((w = atoi(argv[2])) > 0) ) { | |
293 argv += 2; | |
294 argc -= 2; | |
295 } else { | |
296 fprintf(stderr, | |
297 "The -width option requires an argument\n"); | |
1151
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
298 quit(1); |
0 | 299 } |
300 } else | |
301 if ( strcmp(argv[1], "-height") == 0 ) { | |
302 if ( argv[2] && ((h = atoi(argv[2])) > 0) ) { | |
303 argv += 2; | |
304 argc -= 2; | |
305 } else { | |
306 fprintf(stderr, | |
307 "The -height option requires an argument\n"); | |
1151
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
308 quit(1); |
0 | 309 } |
310 } else | |
311 if ( strcmp(argv[1], "-bpp") == 0 ) { | |
312 if ( argv[2] ) { | |
313 desired_bpp = atoi(argv[2]); | |
314 argv += 2; | |
315 argc -= 2; | |
316 } else { | |
317 fprintf(stderr, | |
318 "The -bpp option requires an argument\n"); | |
1151
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
319 quit(1); |
0 | 320 } |
321 } else | |
322 if ( strcmp(argv[1], "-warp") == 0 ) { | |
323 video_flags |= SDL_HWPALETTE; | |
324 argv += 1; | |
325 argc -= 1; | |
326 } else | |
327 if ( strcmp(argv[1], "-hw") == 0 ) { | |
328 video_flags |= SDL_HWSURFACE; | |
329 argv += 1; | |
330 argc -= 1; | |
331 } else | |
332 if ( strcmp(argv[1], "-flip") == 0 ) { | |
333 video_flags |= SDL_DOUBLEBUF; | |
334 argv += 1; | |
335 argc -= 1; | |
336 } else | |
337 if ( strcmp(argv[1], "-fullscreen") == 0 ) { | |
338 video_flags |= SDL_FULLSCREEN; | |
339 argv += 1; | |
340 argc -= 1; | |
341 } else | |
342 break; | |
343 } | |
344 | |
345 /* Initialize the display */ | |
346 screen = SDL_SetVideoMode(w, h, desired_bpp, video_flags); | |
347 if ( screen == NULL ) { | |
348 fprintf(stderr, "Couldn't set %dx%dx%d video mode: %s\n", | |
349 w, h, desired_bpp, SDL_GetError()); | |
1151
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
350 quit(1); |
0 | 351 } |
228
153f221b7d48
Give more info about the current video mode
Sam Lantinga <slouken@libsdl.org>
parents:
0
diff
changeset
|
352 printf("Set%s %dx%dx%d mode\n", |
153f221b7d48
Give more info about the current video mode
Sam Lantinga <slouken@libsdl.org>
parents:
0
diff
changeset
|
353 screen->flags & SDL_FULLSCREEN ? " fullscreen" : "", |
0 | 354 screen->w, screen->h, screen->format->BitsPerPixel); |
355 printf("(video surface located in %s memory)\n", | |
356 (screen->flags&SDL_HWSURFACE) ? "video" : "system"); | |
357 if ( screen->flags & SDL_DOUBLEBUF ) { | |
358 printf("Double-buffering enabled\n"); | |
359 flip = 1; | |
360 } | |
361 | |
362 /* Set the window manager title bar */ | |
363 SDL_WM_SetCaption("SDL test window", "testwin"); | |
364 | |
365 /* Do all the drawing work */ | |
366 #ifdef BENCHMARK_SDL | |
367 then = SDL_GetTicks(); | |
368 DrawPict(screen, argv[1], speedy, flip, nofade); | |
369 now = SDL_GetTicks(); | |
370 printf("Time: %d milliseconds\n", now-then); | |
371 #else | |
372 DrawPict(screen, argv[1], speedy, flip, nofade); | |
373 #endif | |
374 SDL_Delay(delay*1000); | |
1151
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
228
diff
changeset
|
375 SDL_Quit(); |
0 | 376 return(0); |
377 } |