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 } 258