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: */