Mercurial > sdl-ios-xcode
diff src/video/SDL_gamma.c @ 1895:c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 10 Jul 2006 21:04:37 +0000 |
parents | 65800e7f7146 |
children | e1da92da346c |
line wrap: on
line diff
--- a/src/video/SDL_gamma.c Thu Jul 06 18:01:37 2006 +0000 +++ b/src/video/SDL_gamma.c Mon Jul 10 21:04:37 2006 +0000 @@ -24,7 +24,7 @@ /* Gamma correction support */ #ifdef HAVE_MATH_H -#include <math.h> /* Used for calculating gamma ramps */ +#include <math.h> /* Used for calculating gamma ramps */ #else /* Math routines from uClibc: http://www.uclibc.org */ #include "math_private.h" @@ -38,196 +38,177 @@ #include "SDL_sysvideo.h" -static void CalculateGammaRamp(float gamma, Uint16 *ramp) +static void +CalculateGammaRamp(float gamma, Uint16 * ramp) { - int i; + int i; - /* 0.0 gamma is all black */ - if ( gamma <= 0.0f ) { - for ( i=0; i<256; ++i ) { - ramp[i] = 0; - } - return; - } else - /* 1.0 gamma is identity */ - if ( gamma == 1.0f ) { - for ( i=0; i<256; ++i ) { - ramp[i] = (i << 8) | i; - } - return; - } else - /* Calculate a real gamma ramp */ - { int value; - gamma = 1.0f / gamma; - for ( i=0; i<256; ++i ) { - value = (int)(pow((double)i/256.0, gamma)*65535.0+0.5); - if ( value > 65535 ) { - value = 65535; - } - ramp[i] = (Uint16)value; - } - } + /* 0.0 gamma is all black */ + if (gamma <= 0.0f) { + for (i = 0; i < 256; ++i) { + ramp[i] = 0; + } + return; + } else + /* 1.0 gamma is identity */ + if (gamma == 1.0f) { + for (i = 0; i < 256; ++i) { + ramp[i] = (i << 8) | i; + } + return; + } else + /* Calculate a real gamma ramp */ + { + int value; + gamma = 1.0f / gamma; + for (i = 0; i < 256; ++i) { + value = (int) (pow((double) i / 256.0, gamma) * 65535.0 + 0.5); + if (value > 65535) { + value = 65535; + } + ramp[i] = (Uint16) value; + } + } } -static void CalculateGammaFromRamp(float *gamma, Uint16 *ramp) +static void +CalculateGammaFromRamp(float *gamma, Uint16 * ramp) { - /* The following is adapted from a post by Garrett Bass on OpenGL - Gamedev list, March 4, 2000. - */ - float sum = 0.0f; - int i, count = 0; + /* The following is adapted from a post by Garrett Bass on OpenGL + Gamedev list, March 4, 2000. + */ + float sum = 0.0f; + int i, count = 0; - *gamma = 1.0; - for ( i = 1; i < 256; ++i ) { - if ( (ramp[i] != 0) && (ramp[i] != 65535) ) { - double B = (double)i / 256.0; - double A = ramp[i] / 65535.0; - sum += (float) ( log(A) / log(B) ); - count++; - } - } - if ( count && sum > 0.0f ) { - *gamma = 1.0f / (sum / count); - } + *gamma = 1.0; + for (i = 1; i < 256; ++i) { + if ((ramp[i] != 0) && (ramp[i] != 65535)) { + double B = (double) i / 256.0; + double A = ramp[i] / 65535.0; + sum += (float) (log(A) / log(B)); + count++; + } + } + if (count && sum > 0.0f) { + *gamma = 1.0f / (sum / count); + } } -int SDL_SetGamma(float red, float green, float blue) +int +SDL_SetGamma(float red, float green, float blue) { - int succeeded; - SDL_VideoDevice *video = current_video; - SDL_VideoDevice *this = current_video; - - succeeded = -1; - /* Prefer using SetGammaRamp(), as it's more flexible */ - { - Uint16 ramp[3][256]; + Uint16 ramp[3][256]; - CalculateGammaRamp(red, ramp[0]); - CalculateGammaRamp(green, ramp[1]); - CalculateGammaRamp(blue, ramp[2]); - succeeded = SDL_SetGammaRamp(ramp[0], ramp[1], ramp[2]); - } - if ( (succeeded < 0) && video->SetGamma ) { - SDL_ClearError(); - succeeded = video->SetGamma(this, red, green, blue); - } - return succeeded; + CalculateGammaRamp(red, ramp[0]); + CalculateGammaRamp(green, ramp[1]); + CalculateGammaRamp(blue, ramp[2]); + + return SDL_SetGammaRamp(ramp[0], ramp[1], ramp[2]); } /* Calculating the gamma by integrating the gamma ramps isn't exact, so this function isn't officially supported. */ -int SDL_GetGamma(float *red, float *green, float *blue) +int +SDL_GetGamma(float *red, float *green, float *blue) { - int succeeded; - SDL_VideoDevice *video = current_video; - SDL_VideoDevice *this = current_video; - - succeeded = -1; - /* Prefer using GetGammaRamp(), as it's more flexible */ - { - Uint16 ramp[3][256]; + int succeeded; + Uint16 ramp[3][256]; - succeeded = SDL_GetGammaRamp(ramp[0], ramp[1], ramp[2]); - if ( succeeded >= 0 ) { - CalculateGammaFromRamp(red, ramp[0]); - CalculateGammaFromRamp(green, ramp[1]); - CalculateGammaFromRamp(blue, ramp[2]); - } - } - if ( (succeeded < 0) && video->GetGamma ) { - SDL_ClearError(); - succeeded = video->GetGamma(this, red, green, blue); - } - return succeeded; + succeeded = SDL_GetGammaRamp(ramp[0], ramp[1], ramp[2]); + if (succeeded >= 0) { + CalculateGammaFromRamp(red, ramp[0]); + CalculateGammaFromRamp(green, ramp[1]); + CalculateGammaFromRamp(blue, ramp[2]); + } + return succeeded; } -int SDL_SetGammaRamp(const Uint16 *red, const Uint16 *green, const Uint16 *blue) +int +SDL_SetGammaRamp(const Uint16 * red, const Uint16 * green, + const Uint16 * blue) { - int succeeded; - SDL_VideoDevice *video = current_video; - SDL_VideoDevice *this = current_video; - SDL_Surface *screen = SDL_PublicSurface; + SDL_VideoDevice *_this = SDL_GetVideoDevice(); + int succeeded; - /* Verify the screen parameter */ - if ( !screen ) { - SDL_SetError("No video mode has been set"); - return -1; - } - - /* Lazily allocate the gamma tables */ - if ( ! video->gamma ) { - SDL_GetGammaRamp(0, 0, 0); - } + /* Lazily allocate the gamma tables */ + if (!SDL_CurrentDisplay.gamma) { + SDL_GetGammaRamp(NULL, NULL, NULL); + } - /* Fill the gamma table with the new values */ - if ( red ) { - SDL_memcpy(&video->gamma[0*256], red, 256*sizeof(*video->gamma)); - } - if ( green ) { - SDL_memcpy(&video->gamma[1*256], green, 256*sizeof(*video->gamma)); - } - if ( blue ) { - SDL_memcpy(&video->gamma[2*256], blue, 256*sizeof(*video->gamma)); - } - - /* Gamma correction always possible on split palettes */ - if ( (screen->flags & SDL_HWPALETTE) == SDL_HWPALETTE ) { - SDL_Palette *pal = screen->format->palette; + /* Fill the gamma table with the new values */ + if (red) { + SDL_memcpy(&SDL_CurrentDisplay.gamma[0 * 256], red, + 256 * sizeof(*SDL_CurrentDisplay.gamma)); + } + if (green) { + SDL_memcpy(&SDL_CurrentDisplay.gamma[1 * 256], green, + 256 * sizeof(*SDL_CurrentDisplay.gamma)); + } + if (blue) { + SDL_memcpy(&SDL_CurrentDisplay.gamma[2 * 256], blue, + 256 * sizeof(*SDL_CurrentDisplay.gamma)); + } - /* If physical palette has been set independently, use it */ - if(video->physpal) - pal = video->physpal; - - SDL_SetPalette(screen, SDL_PHYSPAL, - pal->colors, 0, pal->ncolors); - return 0; - } - - /* Try to set the gamma ramp in the driver */ - succeeded = -1; - if ( video->SetGammaRamp ) { - succeeded = video->SetGammaRamp(this, video->gamma); - } else { - SDL_SetError("Gamma ramp manipulation not supported"); - } - return succeeded; + /* Try to set the gamma ramp in the driver */ + succeeded = -1; + if (_this && _this->SetDisplayGammaRamp) { + if (SDL_GetFocusWindow()) { + succeeded = + _this->SetDisplayGammaRamp(_this, SDL_CurrentDisplay.gamma); + } else { + succeeded = 0; + } + } else { + SDL_SetError("Gamma ramp manipulation not supported"); + } + return succeeded; } -int SDL_GetGammaRamp(Uint16 *red, Uint16 *green, Uint16 *blue) +int +SDL_GetGammaRamp(Uint16 * red, Uint16 * green, Uint16 * blue) { - SDL_VideoDevice *video = current_video; - SDL_VideoDevice *this = current_video; + SDL_VideoDevice *_this = SDL_GetVideoDevice(); + + /* Lazily allocate the gamma table */ + if (!SDL_CurrentDisplay.gamma) { + size_t rampsize = (3 * 256 * sizeof(*SDL_CurrentDisplay.gamma)); - /* Lazily allocate the gamma table */ - if ( ! video->gamma ) { - video->gamma = SDL_malloc(3*256*sizeof(*video->gamma)); - if ( ! video->gamma ) { - SDL_OutOfMemory(); - return -1; - } - if ( video->GetGammaRamp ) { - /* Get the real hardware gamma */ - video->GetGammaRamp(this, video->gamma); - } else { - /* Assume an identity gamma */ - int i; - for ( i=0; i<256; ++i ) { - video->gamma[0*256+i] = (i << 8) | i; - video->gamma[1*256+i] = (i << 8) | i; - video->gamma[2*256+i] = (i << 8) | i; - } - } - } + SDL_CurrentDisplay.gamma = SDL_malloc(rampsize * 2); + if (!SDL_CurrentDisplay.gamma) { + SDL_OutOfMemory(); + return -1; + } + if (_this && _this->GetDisplayGammaRamp) { + /* Get the real hardware gamma */ + _this->GetDisplayGammaRamp(_this, SDL_CurrentDisplay.gamma); + } else { + /* Assume an identity gamma */ + int i; + for (i = 0; i < 256; ++i) { + SDL_CurrentDisplay.gamma[0 * 256 + i] = (i << 8) | i; + SDL_CurrentDisplay.gamma[1 * 256 + i] = (i << 8) | i; + SDL_CurrentDisplay.gamma[2 * 256 + i] = (i << 8) | i; + } + } + SDL_CurrentDisplay.saved_gamma = SDL_CurrentDisplay.gamma + (3 * 256); + SDL_memcpy(SDL_CurrentDisplay.saved_gamma, SDL_CurrentDisplay.gamma, + rampsize); + } - /* Just copy from our internal table */ - if ( red ) { - SDL_memcpy(red, &video->gamma[0*256], 256*sizeof(*red)); - } - if ( green ) { - SDL_memcpy(green, &video->gamma[1*256], 256*sizeof(*green)); - } - if ( blue ) { - SDL_memcpy(blue, &video->gamma[2*256], 256*sizeof(*blue)); - } - return 0; + /* Just copy from our internal table */ + if (red) { + SDL_memcpy(red, &SDL_CurrentDisplay.gamma[0 * 256], + 256 * sizeof(*red)); + } + if (green) { + SDL_memcpy(green, &SDL_CurrentDisplay.gamma[1 * 256], + 256 * sizeof(*green)); + } + if (blue) { + SDL_memcpy(blue, &SDL_CurrentDisplay.gamma[2 * 256], + 256 * sizeof(*blue)); + } + return 0; } + +/* vi: set ts=4 sw=4 expandtab: */