Home | History | Annotate | Download | only in test
      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. */
     15 static void quit(int rc)
     16 {
     17 	SDL_Quit();
     18 	exit(rc);
     19 }
     20 
     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;
    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