• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
14 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
quit(int rc)15 static void quit(int rc)
16 {
17 	SDL_Quit();
18 	exit(rc);
19 }
20 
DrawPict(SDL_Surface * screen,char * bmpfile,int speedy,int flip,int nofade)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 
main(int argc,char * argv[])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;
251 
252 #ifdef _WIN32_WCE
253 	w = 240;
254 	h = 320;
255 	desired_bpp = 8;
256 	video_flags = SDL_FULLSCREEN;
257 #else
258 	w = 640;
259 	h = 480;
260 	desired_bpp = 0;
261 	video_flags = 0;
262 #endif
263 	if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
264 		fprintf(stderr,
265 			"Couldn't initialize SDL: %s\n", SDL_GetError());
266 		return(1);
267 	}
268 
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");
288 				quit(1);
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");
298 				quit(1);
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");
308 				quit(1);
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");
319 				quit(1);
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());
350 		quit(1);
351 	}
352 	printf("Set%s %dx%dx%d mode\n",
353 			screen->flags & SDL_FULLSCREEN ? " fullscreen" : "",
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);
375 	SDL_Quit();
376 	return(0);
377 }
378