testgamma.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:4k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

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