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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.     This library is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.     Library General Public License for more details.
  12.     You should have received a copy of the GNU Library General Public
  13.     License along with this library; if not, write to the Free
  14.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15.     Sam Lantinga
  16.     slouken@libsdl.org
  17. */
  18. #ifdef SAVE_RCSID
  19. static char rcsid =
  20.  "@(#) $Id: SDL_x11gamma.c,v 1.4 2002/04/22 21:38:05 wmay Exp $";
  21. #endif
  22. #include "SDL.h"
  23. #include "SDL_events.h"
  24. #include "SDL_events_c.h"
  25. #include "SDL_x11video.h"
  26. /* From the X server sources... */
  27. #define MAX_GAMMA 10.0
  28. #define MIN_GAMMA (1.0/MAX_GAMMA)
  29. static int X11_SetGammaNoLock(_THIS, float red, float green, float blue)
  30. {
  31. #ifdef XFREE86_VMGAMMA
  32.     if (use_vidmode >= 200) {
  33.         SDL_NAME(XF86VidModeGamma) gamma;
  34.         Bool succeeded;
  35. /* Clamp the gamma values */
  36. if ( red < MIN_GAMMA ) {
  37. gamma.red = MIN_GAMMA;
  38. } else
  39. if ( red > MAX_GAMMA ) {
  40. gamma.red = MAX_GAMMA;
  41. } else {
  42.          gamma.red = red;
  43. }
  44. if ( green < MIN_GAMMA ) {
  45. gamma.green = MIN_GAMMA;
  46. } else
  47. if ( green > MAX_GAMMA ) {
  48. gamma.green = MAX_GAMMA;
  49. } else {
  50.          gamma.green = green;
  51. }
  52. if ( blue < MIN_GAMMA ) {
  53. gamma.blue = MIN_GAMMA;
  54. } else
  55. if ( blue > MAX_GAMMA ) {
  56. gamma.blue = MAX_GAMMA;
  57. } else {
  58.          gamma.blue = blue;
  59. }
  60.         if ( SDL_GetAppState() & SDL_APPACTIVE ) {
  61.             succeeded = SDL_NAME(XF86VidModeSetGamma)(SDL_Display, SDL_Screen, &gamma);
  62.             XSync(SDL_Display, False);
  63.         } else {
  64.             gamma_saved[0] = gamma.red;
  65.             gamma_saved[1] = gamma.green;
  66.             gamma_saved[2] = gamma.blue;
  67.             succeeded = True;
  68.         }
  69.         if ( succeeded ) {
  70.             ++gamma_changed;
  71.         }
  72.         return succeeded ? 0 : -1;
  73.     }
  74. #endif
  75.     SDL_SetError("Gamma correction not supported");
  76.     return -1;
  77. }
  78. int X11_SetVidModeGamma(_THIS, float red, float green, float blue)
  79. {
  80.     int result;
  81.     SDL_Lock_EventThread();
  82.     result = X11_SetGammaNoLock(this, red, green, blue);
  83.     SDL_Unlock_EventThread();
  84.     return(result);
  85. }
  86. static int X11_GetGammaNoLock(_THIS, float *red, float *green, float *blue)
  87. {
  88. #ifdef XFREE86_VMGAMMA
  89.     if (use_vidmode >= 2) {
  90.         SDL_NAME(XF86VidModeGamma) gamma;
  91.         if (SDL_NAME(XF86VidModeGetGamma)(SDL_Display, SDL_Screen, &gamma)) {
  92.             *red   = gamma.red;
  93.             *green = gamma.green;
  94.             *blue  = gamma.blue;
  95.             return 0;
  96.         }
  97.         return -1;
  98.     }
  99. #endif
  100.     return -1;
  101. }
  102. int X11_GetVidModeGamma(_THIS, float *red, float *green, float *blue)
  103. {
  104.     int result;
  105.     SDL_Lock_EventThread();
  106.     result = X11_GetGammaNoLock(this, red, green, blue);
  107.     SDL_Unlock_EventThread();
  108.     return(result);
  109. }
  110. void X11_SaveVidModeGamma(_THIS)
  111. {
  112.     /* Try to save the current gamma, otherwise disable gamma control */
  113.     if ( X11_GetGammaNoLock(this,
  114.               &gamma_saved[0], &gamma_saved[1], &gamma_saved[2]) < 0 ) {
  115.         this->SetGamma = 0;
  116.         this->GetGamma = 0;
  117.     }
  118.     gamma_changed = 0;
  119. }
  120. void X11_SwapVidModeGamma(_THIS)
  121. {
  122.     float new_gamma[3];
  123.     if ( gamma_changed ) {
  124.         new_gamma[0] = gamma_saved[0];
  125.         new_gamma[1] = gamma_saved[1];
  126.         new_gamma[2] = gamma_saved[2];
  127.         X11_GetGammaNoLock(this, &gamma_saved[0], &gamma_saved[1], &gamma_saved[2]);
  128.         X11_SetGammaNoLock(this, new_gamma[0], new_gamma[1], new_gamma[2]);
  129.     }
  130. }