symbian-qemu-0.9.1-12/libsdl-trunk/test/graywin.c
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 
       
     2 /* Simple program:  Fill a colormap with gray and stripe it down the screen */
       
     3 
       
     4 #include <stdio.h>
       
     5 #include <stdlib.h>
       
     6 #include <string.h>
       
     7 #include <time.h>
       
     8 
       
     9 #include "SDL.h"
       
    10 
       
    11 #ifdef TEST_VGA16 /* Define this if you want to test VGA 16-color video modes */
       
    12 #define NUM_COLORS	16
       
    13 #else
       
    14 #define NUM_COLORS	256
       
    15 #endif
       
    16 
       
    17 /* Draw a randomly sized and colored box centered about (X,Y) */
       
    18 void DrawBox(SDL_Surface *screen, int X, int Y, int width, int height)
       
    19 {
       
    20 	static unsigned int seeded = 0;
       
    21 	SDL_Rect area;
       
    22 	Uint32 color;
       
    23         Uint32 randc;
       
    24 
       
    25 	/* Seed the random number generator */
       
    26 	if ( seeded == 0 ) {
       
    27 		srand(time(NULL));
       
    28 		seeded = 1;
       
    29 	}
       
    30 
       
    31 	/* Get the bounds of the rectangle */
       
    32 	area.w = (rand()%width);
       
    33 	area.h = (rand()%height);
       
    34 	area.x = X-(area.w/2);
       
    35 	area.y = Y-(area.h/2);
       
    36         randc = (rand()%NUM_COLORS);
       
    37 
       
    38         if (screen->format->BytesPerPixel==1)
       
    39         {
       
    40             color = randc;
       
    41         }
       
    42         else
       
    43         {
       
    44             color = SDL_MapRGB(screen->format, randc, randc, randc);
       
    45         }
       
    46 
       
    47 	/* Do it! */
       
    48 	SDL_FillRect(screen, &area, color);
       
    49 	if ( screen->flags & SDL_DOUBLEBUF ) {
       
    50 		SDL_Flip(screen);
       
    51 	} else {
       
    52 		SDL_UpdateRects(screen, 1, &area);
       
    53 	}
       
    54 }
       
    55 
       
    56 void DrawBackground(SDL_Surface *screen)
       
    57 {
       
    58 	int i, j, k;
       
    59 	Uint8  *buffer;
       
    60 	Uint16 *buffer16;
       
    61         Uint16 color;
       
    62         Uint8  gradient;
       
    63 
       
    64 	/* Set the surface pixels and refresh! */
       
    65 	/* Use two loops in case the surface is double-buffered (both sides) */
       
    66 
       
    67 	for ( j=0; j<2; ++j ) {
       
    68 		if ( SDL_LockSurface(screen) < 0 ) {
       
    69 			fprintf(stderr, "Couldn't lock display surface: %s\n",
       
    70 								SDL_GetError());
       
    71 			return;
       
    72 		}
       
    73 		buffer = (Uint8 *)screen->pixels;
       
    74 
       
    75 		if (screen->format->BytesPerPixel!=2) {
       
    76 			for ( i=0; i<screen->h; ++i ) {
       
    77 				memset(buffer,(i*(NUM_COLORS-1))/screen->h, screen->w * screen->format->BytesPerPixel);
       
    78 				buffer += screen->pitch;
       
    79 			}
       
    80 		}
       
    81                 else
       
    82                 {
       
    83 			for ( i=0; i<screen->h; ++i ) {
       
    84 				gradient=((i*(NUM_COLORS-1))/screen->h);
       
    85                                 color = SDL_MapRGB(screen->format, gradient, gradient, gradient);
       
    86                                 buffer16=(Uint16*)buffer;
       
    87                                 for (k=0; k<screen->w; k++)
       
    88                                 {
       
    89                                    *(buffer16+k)=color;
       
    90                                 }
       
    91 				buffer += screen->pitch;
       
    92 			}
       
    93                 }
       
    94 
       
    95 		SDL_UnlockSurface(screen);
       
    96 		if ( screen->flags & SDL_DOUBLEBUF ) {
       
    97 			SDL_Flip(screen);
       
    98 		} else {
       
    99 			SDL_UpdateRect(screen, 0, 0, 0, 0);
       
   100                         break;
       
   101 		}
       
   102 	}
       
   103 }
       
   104 
       
   105 SDL_Surface *CreateScreen(Uint16 w, Uint16 h, Uint8 bpp, Uint32 flags)
       
   106 {
       
   107 	SDL_Surface *screen;
       
   108 	int i;
       
   109 	SDL_Color palette[NUM_COLORS];
       
   110 
       
   111 	/* Set the video mode */
       
   112 	screen = SDL_SetVideoMode(w, h, bpp, flags);
       
   113 	if ( screen == NULL ) {
       
   114 		fprintf(stderr, "Couldn't set display mode: %s\n",
       
   115 							SDL_GetError());
       
   116 		return(NULL);
       
   117 	}
       
   118 	fprintf(stderr, "Screen is in %s mode\n",
       
   119 		(screen->flags & SDL_FULLSCREEN) ? "fullscreen" : "windowed");
       
   120 
       
   121 	if (bpp==8) {
       
   122 		/* Set a gray colormap, reverse order from white to black */
       
   123 		for ( i=0; i<NUM_COLORS; ++i ) {
       
   124 			palette[i].r = (NUM_COLORS-1)-i * (256 / NUM_COLORS);
       
   125 			palette[i].g = (NUM_COLORS-1)-i * (256 / NUM_COLORS);
       
   126 			palette[i].b = (NUM_COLORS-1)-i * (256 / NUM_COLORS);
       
   127 		}
       
   128 		SDL_SetColors(screen, palette, 0, NUM_COLORS);
       
   129 	}
       
   130 
       
   131 	return(screen);
       
   132 }
       
   133 
       
   134 int main(int argc, char *argv[])
       
   135 {
       
   136 	SDL_Surface *screen;
       
   137 	Uint32 videoflags;
       
   138 	int    done;
       
   139 	SDL_Event event;
       
   140 	int width, height, bpp;
       
   141 
       
   142 	/* Initialize SDL */
       
   143 	if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
       
   144 		fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError());
       
   145 		exit(1);
       
   146 	}
       
   147 
       
   148 	/* See if we try to get a hardware colormap */
       
   149 	width = 640;
       
   150 	height = 480;
       
   151 	bpp = 8;
       
   152 	videoflags = SDL_SWSURFACE;
       
   153 	while ( argc > 1 ) {
       
   154 		--argc;
       
   155 		if ( argv[argc-1] && (strcmp(argv[argc-1], "-width") == 0) ) {
       
   156 			width = atoi(argv[argc]);
       
   157 			--argc;
       
   158 		} else
       
   159 		if ( argv[argc-1] && (strcmp(argv[argc-1], "-height") == 0) ) {
       
   160 			height = atoi(argv[argc]);
       
   161 			--argc;
       
   162 		} else
       
   163 		if ( argv[argc-1] && (strcmp(argv[argc-1], "-bpp") == 0) ) {
       
   164 			bpp = atoi(argv[argc]);
       
   165 			--argc;
       
   166 		} else
       
   167 		if ( argv[argc] && (strcmp(argv[argc], "-hw") == 0) ) {
       
   168 			videoflags |= SDL_HWSURFACE;
       
   169 		} else
       
   170 		if ( argv[argc] && (strcmp(argv[argc], "-hwpalette") == 0) ) {
       
   171 			videoflags |= SDL_HWPALETTE;
       
   172 		} else
       
   173 		if ( argv[argc] && (strcmp(argv[argc], "-flip") == 0) ) {
       
   174 			videoflags |= SDL_DOUBLEBUF;
       
   175 		} else
       
   176 		if ( argv[argc] && (strcmp(argv[argc], "-noframe") == 0) ) {
       
   177 			videoflags |= SDL_NOFRAME;
       
   178 		} else
       
   179 		if ( argv[argc] && (strcmp(argv[argc], "-resize") == 0) ) {
       
   180 			videoflags |= SDL_RESIZABLE;
       
   181 		} else
       
   182 		if ( argv[argc] && (strcmp(argv[argc], "-fullscreen") == 0) ) {
       
   183 			videoflags |= SDL_FULLSCREEN;
       
   184 		} else {
       
   185 			fprintf(stderr, "Usage: %s [-width] [-height] [-bpp] [-hw] [-hwpalette] [-flip] [-noframe] [-fullscreen] [-resize]\n",
       
   186 								argv[0]);
       
   187 			exit(1);
       
   188 		}
       
   189 	}
       
   190 
       
   191 	/* Set a video mode */
       
   192 	screen = CreateScreen(width, height, bpp, videoflags);
       
   193 	if ( screen == NULL ) {
       
   194 		exit(2);
       
   195 	}
       
   196         
       
   197         DrawBackground(screen);
       
   198 		
       
   199 	/* Wait for a keystroke */
       
   200 	done = 0;
       
   201 	while ( !done && SDL_WaitEvent(&event) ) {
       
   202 		switch (event.type) {
       
   203 			case SDL_MOUSEBUTTONDOWN:
       
   204 				DrawBox(screen, event.button.x, event.button.y, width, height);
       
   205 				break;
       
   206 			case SDL_KEYDOWN:
       
   207 				/* Ignore ALT-TAB for windows */
       
   208 				if ( (event.key.keysym.sym == SDLK_LALT) ||
       
   209 				     (event.key.keysym.sym == SDLK_TAB) ) {
       
   210 					break;
       
   211 				}
       
   212 				/* Center the mouse on <SPACE> */
       
   213 				if ( event.key.keysym.sym == SDLK_SPACE ) {
       
   214 					SDL_WarpMouse(width/2, height/2);
       
   215 					break;
       
   216 				}
       
   217 				/* Toggle fullscreen mode on <RETURN> */
       
   218 				if ( event.key.keysym.sym == SDLK_RETURN ) {
       
   219 					videoflags ^= SDL_FULLSCREEN;
       
   220 					screen = CreateScreen(
       
   221 						screen->w, screen->h,
       
   222 						screen->format->BitsPerPixel,
       
   223 								videoflags);
       
   224 					if ( screen == NULL ) {
       
   225 						fprintf(stderr,
       
   226 					"Couldn't toggle fullscreen mode\n");
       
   227 						done = 1;
       
   228 					}
       
   229                                         DrawBackground(screen);
       
   230 					break;
       
   231 				}
       
   232 				/* Any other key quits the application... */
       
   233 			case SDL_QUIT:
       
   234 				done = 1;
       
   235 				break;
       
   236 			case SDL_VIDEOEXPOSE:
       
   237 				DrawBackground(screen);
       
   238 				break;
       
   239 			case SDL_VIDEORESIZE:
       
   240 					screen = CreateScreen(
       
   241 						event.resize.w, event.resize.h,
       
   242 						screen->format->BitsPerPixel,
       
   243 								videoflags);
       
   244 					if ( screen == NULL ) {
       
   245 						fprintf(stderr,
       
   246 					"Couldn't resize video mode\n");
       
   247 						done = 1;
       
   248 					}
       
   249 					DrawBackground(screen);
       
   250 				break;
       
   251 			default:
       
   252 				break;
       
   253 		}
       
   254 	}
       
   255 	SDL_Quit();
       
   256 	return(0);
       
   257 }