diff src/video/SDL_gamma.c @ 1662:782fd950bd46 SDL-1.3

Revamp of the video system in progress - adding support for multiple displays, multiple windows, and a full video mode selection API. WARNING: None of the video drivers have been updated for the new API yet! The API is still under design and very fluid. The code is now run through a consistent indent format: indent -i4 -nut -nsc -br -ce The headers are being converted to automatically generate doxygen documentation.
author Sam Lantinga <slouken@libsdl.org>
date Sun, 28 May 2006 13:04:16 +0000
parents 97d0966f4bf7
children 4da1ee79c9af
line wrap: on
line diff
--- a/src/video/SDL_gamma.c	Sun May 21 17:27:13 2006 +0000
+++ b/src/video/SDL_gamma.c	Sun May 28 13:04:16 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,196 @@
 #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;	
+    SDL_VideoDevice *_this = SDL_GetVideoDevice ();
+    int succeeded;
 
-	succeeded = -1;
-	/* Prefer using SetGammaRamp(), as it's more flexible */
-	{
-		Uint16 ramp[3][256];
+    succeeded = -1;
+    /* Prefer using SetGammaRamp(), as it's more flexible */
+    {
+        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]);
+        succeeded = SDL_SetGammaRamp (ramp[0], ramp[1], ramp[2]);
+    }
+    if ((succeeded < 0) && _this->SetGamma) {
+        SDL_ClearError ();
+        succeeded = _this->SetGamma (_this, red, green, blue);
+    }
+    return succeeded;
 }
 
 /* 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;	
+    SDL_VideoDevice *_this = SDL_GetVideoDevice ();
+    int succeeded;
 
-	succeeded = -1;
-	/* Prefer using GetGammaRamp(), as it's more flexible */
-	{
-		Uint16 ramp[3][256];
+    succeeded = -1;
+    /* Prefer using GetGammaRamp(), as it's more flexible */
+    {
+        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]);
+        }
+    }
+    if ((succeeded < 0) && _this->GetGamma) {
+        SDL_ClearError ();
+        succeeded = _this->GetGamma (_this, red, green, blue);
+    }
+    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;
+    SDL_Surface *screen = SDL_PublicSurface;
 
-	/* Verify the screen parameter */
-	if ( !screen ) {
-		SDL_SetError("No video mode has been set");
-		return -1;
-	}
+    /* 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_CurrentWindow.gamma) {
+        SDL_GetGammaRamp (0, 0, 0);
+    }
 
-	/* 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_CurrentWindow.gamma[0 * 256], red,
+                    256 * sizeof (*SDL_CurrentWindow.gamma));
+    }
+    if (green) {
+        SDL_memcpy (&SDL_CurrentWindow.gamma[1 * 256], green,
+                    256 * sizeof (*SDL_CurrentWindow.gamma));
+    }
+    if (blue) {
+        SDL_memcpy (&SDL_CurrentWindow.gamma[2 * 256], blue,
+                    256 * sizeof (*SDL_CurrentWindow.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->SetGammaRamp) {
+        succeeded = _this->SetGammaRamp (_this, SDL_CurrentWindow.gamma);
+    } 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 ( ! 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;
-			}
-		}
-	}
+    /* Lazily allocate the gamma table */
+    if (!SDL_CurrentWindow.gamma) {
+        SDL_CurrentWindow.gamma =
+            SDL_malloc (3 * 256 * sizeof (*SDL_CurrentWindow.gamma));
+        if (!SDL_CurrentWindow.gamma) {
+            SDL_OutOfMemory ();
+            return -1;
+        }
+        if (_this->GetGammaRamp) {
+            /* Get the real hardware gamma */
+            _this->GetGammaRamp (_this, SDL_CurrentWindow.gamma);
+        } else {
+            /* Assume an identity gamma */
+            int i;
+            for (i = 0; i < 256; ++i) {
+                SDL_CurrentWindow.gamma[0 * 256 + i] = (i << 8) | i;
+                SDL_CurrentWindow.gamma[1 * 256 + i] = (i << 8) | i;
+                SDL_CurrentWindow.gamma[2 * 256 + i] = (i << 8) | i;
+            }
+        }
+    }
 
-	/* 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_CurrentWindow.gamma[0 * 256],
+                    256 * sizeof (*red));
+    }
+    if (green) {
+        SDL_memcpy (green, &SDL_CurrentWindow.gamma[1 * 256],
+                    256 * sizeof (*green));
+    }
+    if (blue) {
+        SDL_memcpy (blue, &SDL_CurrentWindow.gamma[2 * 256],
+                    256 * sizeof (*blue));
+    }
+    return 0;
 }
+
+/* vi: set ts=4 sw=4 expandtab: */