Mercurial > sdl-ios-xcode
annotate test/testwin.c @ 1258:b2283b0ded26
Date: Thu, 19 Jan 2006 20:02:29 +0200
From: Vassilis Virvilis <vasvir@iit.demokritos.gr>
Subject: [SDL] Request: Please reconsider adding tag in SDL_Event
Hi,
Patch in question:
--- include/SDL_events.h 20 Aug 2004 18:57:01 -0000 1.11
+++ include/SDL_events.h 19 Jan 2006 17:35:09 -0000
@@ -214,7 +214,7 @@
} SDL_SysWMEvent;
/* General event structure */
-typedef union {
+typedef union SDL_Event {
Uint8 type;
SDL_ActiveEvent active;
SDL_KeyboardEvent key;
Reasoning:
----------
1) Allows forward declaration of the SDL_Event union in C++. Please
note that in plain C it is possible to forward declare it.
2) Forward declaration is good because it allows encapsulation. It hides
the specific implementation and does not necessarily exposes SDL staff
to my appication's namespace
3) It can't harm plain C because tags are living in a different namespace
than typenames
4) It is already done like this in other places in SDL. Check for example
SDL_KeySym, and SDL_.*Event structures.
5) Right now I have to include SDL/event.h from a C++ header file. See 2)
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Fri, 20 Jan 2006 13:07:25 +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 } |