symbian-qemu-0.9.1-12/libsdl-trunk/test/testwin.c
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     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 }