test/graywin.c

/* [<][>]
[^][v][top][bottom][index][help] */

FUNCTIONS

This source file includes following functions.
  1. DrawBox
  2. CreateScreen
  3. main

   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)
     /* [<][>][^][v][top][bottom][index][help] */
  19 {
  20         static unsigned int seeded = 0;
  21         SDL_Rect area;
  22         Uint32 color;
  23 
  24         /* Seed the random number generator */
  25         if ( seeded == 0 ) {
  26                 srand(time(NULL));
  27                 seeded = 1;
  28         }
  29 
  30         /* Get the bounds of the rectangle */
  31         area.w = (rand()%640);
  32         area.h = (rand()%480);
  33         area.x = X-(area.w/2);
  34         area.y = Y-(area.h/2);
  35         color = (rand()%NUM_COLORS);
  36 
  37         /* Do it! */
  38         SDL_FillRect(screen, &area, color);
  39         SDL_UpdateRects(screen, 1, &area);
  40 }
  41 
  42 SDL_Surface *CreateScreen(Uint16 w, Uint16 h, Uint8 bpp, Uint32 flags)
     /* [<][>][^][v][top][bottom][index][help] */
  43 {
  44         SDL_Surface *screen;
  45         int i;
  46         SDL_Color palette[NUM_COLORS];
  47         Uint8 *buffer;
  48 
  49         /* Set the video mode */
  50         screen = SDL_SetVideoMode(w, h, bpp, flags);
  51         if ( screen == NULL ) {
  52                 fprintf(stderr, "Couldn't set display mode: %s\n",
  53                                                         SDL_GetError());
  54                 return(NULL);
  55         }
  56         fprintf(stderr, "Screen is in %s mode\n",
  57                 (screen->flags & SDL_FULLSCREEN) ? "fullscreen" : "windowed");
  58 
  59         /* Set a gray colormap, reverse order from white to black */
  60         for ( i=0; i<NUM_COLORS; ++i ) {
  61                 palette[i].r = (NUM_COLORS-1)-i * (256 / NUM_COLORS);
  62                 palette[i].g = (NUM_COLORS-1)-i * (256 / NUM_COLORS);
  63                 palette[i].b = (NUM_COLORS-1)-i * (256 / NUM_COLORS);
  64         }
  65         SDL_SetColors(screen, palette, 0, NUM_COLORS);
  66 
  67         /* Set the surface pixels and refresh! */
  68         if ( SDL_LockSurface(screen) < 0 ) {
  69                 fprintf(stderr, "Couldn't lock display surface: %s\n",
  70                                                         SDL_GetError());
  71                 return(NULL);
  72         }
  73         buffer = (Uint8 *)screen->pixels;
  74         for ( i=0; i<screen->h; ++i ) {
  75                 memset(buffer,(i*(NUM_COLORS-1))/screen->h, screen->w);
  76                 buffer += screen->pitch;
  77         }
  78         SDL_UnlockSurface(screen);
  79         SDL_UpdateRect(screen, 0, 0, 0, 0);
  80 
  81         return(screen);
  82 }
  83 
  84 int main(int argc, char *argv[])
     /* [<][>][^][v][top][bottom][index][help] */
  85 {
  86         SDL_Surface *screen;
  87         Uint32 videoflags;
  88         int    done;
  89         SDL_Event event;
  90         int width, height, bpp;
  91 
  92         /* Initialize SDL */
  93         if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
  94                 fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError());
  95                 exit(1);
  96         }
  97 
  98         /* See if we try to get a hardware colormap */
  99         width = 640;
 100         height = 480;
 101         bpp = 8;
 102         videoflags = SDL_SWSURFACE;
 103         while ( argc > 1 ) {
 104                 --argc;
 105                 if ( argv[argc-1] && (strcmp(argv[argc-1], "-width") == 0) ) {
 106                         width = atoi(argv[argc]);
 107                         --argc;
 108                 } else
 109                 if ( argv[argc-1] && (strcmp(argv[argc-1], "-height") == 0) ) {
 110                         height = atoi(argv[argc]);
 111                         --argc;
 112                 } else
 113                 if ( argv[argc-1] && (strcmp(argv[argc-1], "-bpp") == 0) ) {
 114                         bpp = atoi(argv[argc]);
 115                         --argc;
 116                 } else
 117                 if ( argv[argc] && (strcmp(argv[argc], "-hw") == 0) ) {
 118                         videoflags |= SDL_HWSURFACE;
 119                 } else
 120                 if ( argv[argc] && (strcmp(argv[argc], "-hwpalette") == 0) ) {
 121                         videoflags |= SDL_HWPALETTE;
 122                 } else
 123                 if ( argv[argc] && (strcmp(argv[argc], "-noframe") == 0) ) {
 124                         videoflags |= SDL_NOFRAME;
 125                 } else
 126                 if ( argv[argc] && (strcmp(argv[argc], "-fullscreen") == 0) ) {
 127                         videoflags |= SDL_FULLSCREEN;
 128                 } else {
 129                         fprintf(stderr, "Usage: %s [-warp] [-fullscreen]\n",
 130                                                                 argv[0]);
 131                         exit(1);
 132                 }
 133         }
 134 
 135         /* Set a video mode */
 136         screen = CreateScreen(width, height, bpp, videoflags);
 137         if ( screen == NULL ) {
 138                 exit(2);
 139         }
 140                 
 141         /* Wait for a keystroke */
 142         done = 0;
 143         while ( !done && SDL_WaitEvent(&event) ) {
 144                 switch (event.type) {
 145                         case SDL_MOUSEBUTTONDOWN:
 146                                 DrawBox(screen, event.button.x, event.button.y);
 147                                 break;
 148                         case SDL_KEYDOWN:
 149                                 /* Ignore ALT-TAB for windows */
 150                                 if ( (event.key.keysym.sym == SDLK_LALT) ||
 151                                      (event.key.keysym.sym == SDLK_TAB) ) {
 152                                         break;
 153                                 }
 154                                 /* Center the mouse on <SPACE> */
 155                                 if ( event.key.keysym.sym == SDLK_SPACE ) {
 156                                         SDL_WarpMouse(640/2, 480/2);
 157                                         break;
 158                                 }
 159                                 /* Toggle fullscreen mode on <RETURN> */
 160                                 if ( event.key.keysym.sym == SDLK_RETURN ) {
 161                                         videoflags ^= SDL_FULLSCREEN;
 162                                         screen = CreateScreen(
 163                                                 screen->w, screen->h,
 164                                                 screen->format->BitsPerPixel,
 165                                                                 videoflags);
 166                                         if ( screen == NULL ) {
 167                                                 fprintf(stderr,
 168                                         "Couldn't toggle fullscreen mode\n");
 169                                                 done = 1;
 170                                         }
 171                                         break;
 172                                 }
 173                                 /* Any other key quits the application... */
 174                         case SDL_QUIT:
 175                                 done = 1;
 176                                 break;
 177                         default:
 178                                 break;
 179                 }
 180         }
 181         SDL_Quit();
 182         return(0);
 183 }

/* [<][>][^][v][top][bottom][index][help] */