test/testgamma.c
author Holmes Futrell <hfutrell@umail.ucsb.edu>
Fri, 18 Jul 2008 19:23:13 +0000
branchgsoc2008_iphone
changeset 2377 e9a0bad0ea07
parent 1895 c121d94672cb
permissions -rw-r--r--
Just renamed it...
     1 
     2 /* Bring up a window and manipulate the gamma on it */
     3 
     4 #include <stdlib.h>
     5 #include <stdio.h>
     6 #include <string.h>
     7 #include <math.h>
     8 
     9 #include "SDL.h"
    10 
    11 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
    12 static void
    13 quit(int rc)
    14 {
    15     SDL_Quit();
    16     exit(rc);
    17 }
    18 
    19 /* Turn a normal gamma value into an appropriate gamma ramp */
    20 void
    21 CalculateGamma(double gamma, Uint16 * ramp)
    22 {
    23     int i, value;
    24 
    25     gamma = 1.0 / gamma;
    26     for (i = 0; i < 256; ++i) {
    27         value = (int) (pow((double) i / 256.0, gamma) * 65535.0 + 0.5);
    28         if (value > 65535) {
    29             value = 65535;
    30         }
    31         ramp[i] = (Uint16) value;
    32     }
    33 }
    34 
    35 /* This can be used as a general routine for all of the test programs */
    36 int
    37 get_video_args(char *argv[], int *w, int *h, int *bpp, Uint32 * flags)
    38 {
    39     int i;
    40 
    41     *w = 640;
    42     *h = 480;
    43     *bpp = 0;
    44     *flags = SDL_SWSURFACE;
    45 
    46     for (i = 1; argv[i]; ++i) {
    47         if (strcmp(argv[i], "-width") == 0) {
    48             if (argv[i + 1]) {
    49                 *w = atoi(argv[++i]);
    50             }
    51         } else if (strcmp(argv[i], "-height") == 0) {
    52             if (argv[i + 1]) {
    53                 *h = atoi(argv[++i]);
    54             }
    55         } else if (strcmp(argv[i], "-bpp") == 0) {
    56             if (argv[i + 1]) {
    57                 *bpp = atoi(argv[++i]);
    58             }
    59         } else if (strcmp(argv[i], "-fullscreen") == 0) {
    60             *flags |= SDL_FULLSCREEN;
    61         } else if (strcmp(argv[i], "-hw") == 0) {
    62             *flags |= SDL_HWSURFACE;
    63         } else if (strcmp(argv[i], "-hwpalette") == 0) {
    64             *flags |= SDL_HWPALETTE;
    65         } else
    66             break;
    67     }
    68     return i;
    69 }
    70 
    71 int
    72 main(int argc, char *argv[])
    73 {
    74     SDL_Surface *screen;
    75     SDL_Surface *image;
    76     float gamma;
    77     int i;
    78     int w, h, bpp;
    79     Uint32 flags;
    80     Uint16 ramp[256];
    81     Uint16 red_ramp[256];
    82     Uint32 then, timeout;
    83 
    84     /* Check command line arguments */
    85     argv += get_video_args(argv, &w, &h, &bpp, &flags);
    86 
    87     /* Initialize SDL */
    88     if (SDL_Init(SDL_INIT_VIDEO) < 0) {
    89         fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
    90         return (1);
    91     }
    92 
    93     /* Initialize the display, always use hardware palette */
    94     screen = SDL_SetVideoMode(w, h, bpp, flags | SDL_HWPALETTE);
    95     if (screen == NULL) {
    96         fprintf(stderr, "Couldn't set %dx%d video mode: %s\n",
    97                 w, h, SDL_GetError());
    98         quit(1);
    99     }
   100 
   101     /* Set the window manager title bar */
   102     SDL_WM_SetCaption("SDL gamma test", "testgamma");
   103 
   104     /* Set the desired gamma, if any */
   105     gamma = 1.0f;
   106     if (*argv) {
   107         gamma = (float) atof(*argv);
   108     }
   109     if (SDL_SetGamma(gamma, gamma, gamma) < 0) {
   110         fprintf(stderr, "Unable to set gamma: %s\n", SDL_GetError());
   111         quit(1);
   112     }
   113 #if 0                           /* This isn't supported.  Integrating the gamma ramps isn't exact */
   114     /* See what gamma was actually set */
   115     float real[3];
   116     if (SDL_GetGamma(&real[0], &real[1], &real[2]) < 0) {
   117         printf("Couldn't get gamma: %s\n", SDL_GetError());
   118     } else {
   119         printf("Set gamma values: R=%2.2f, G=%2.2f, B=%2.2f\n",
   120                real[0], real[1], real[2]);
   121     }
   122 #endif
   123 
   124     /* Do all the drawing work */
   125     image = SDL_LoadBMP("sample.bmp");
   126     if (image) {
   127         SDL_Rect dst;
   128 
   129         dst.x = (screen->w - image->w) / 2;
   130         dst.y = (screen->h - image->h) / 2;
   131         dst.w = image->w;
   132         dst.h = image->h;
   133         SDL_BlitSurface(image, NULL, screen, &dst);
   134         SDL_UpdateRects(screen, 1, &dst);
   135     }
   136 
   137     /* Wait a bit, handling events */
   138     then = SDL_GetTicks();
   139     timeout = (5 * 1000);
   140     while ((SDL_GetTicks() - then) < timeout) {
   141         SDL_Event event;
   142 
   143         while (SDL_PollEvent(&event)) {
   144             switch (event.type) {
   145             case SDL_QUIT:     /* Quit now */
   146                 timeout = 0;
   147                 break;
   148             case SDL_KEYDOWN:
   149                 switch (event.key.keysym.sym) {
   150                 case SDLK_SPACE:       /* Go longer.. */
   151                     timeout += (5 * 1000);
   152                     break;
   153                 case SDLK_UP:
   154                     gamma += 0.2f;
   155                     SDL_SetGamma(gamma, gamma, gamma);
   156                     break;
   157                 case SDLK_DOWN:
   158                     gamma -= 0.2f;
   159                     SDL_SetGamma(gamma, gamma, gamma);
   160                     break;
   161                 case SDLK_ESCAPE:
   162                     timeout = 0;
   163                     break;
   164                 default:
   165                     break;
   166                 }
   167                 break;
   168             }
   169         }
   170     }
   171 
   172     /* Perform a gamma flash to red using color ramps */
   173     while (gamma < 10.0) {
   174         /* Increase the red gamma and decrease everything else... */
   175         gamma += 0.1f;
   176         CalculateGamma(gamma, red_ramp);
   177         CalculateGamma(1.0 / gamma, ramp);
   178         SDL_SetGammaRamp(red_ramp, ramp, ramp);
   179     }
   180     /* Finish completely red */
   181     memset(red_ramp, 255, sizeof(red_ramp));
   182     memset(ramp, 0, sizeof(ramp));
   183     SDL_SetGammaRamp(red_ramp, ramp, ramp);
   184 
   185     /* Now fade out to black */
   186     for (i = (red_ramp[0] >> 8); i >= 0; --i) {
   187         memset(red_ramp, i, sizeof(red_ramp));
   188         SDL_SetGammaRamp(red_ramp, NULL, NULL);
   189     }
   190     SDL_Delay(1 * 1000);
   191 
   192     SDL_Quit();
   193     return (0);
   194 }