]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - palette.c
fix for misnumbered video mode menu in menu key code (it should never be misnumbered...
[xonotic/darkplaces.git] / palette.c
index 60969b1478c22dbc339f3699a5c6c84c1e7ebd82..1de9ec732e677bcb9f78328845fa014073f0bcca 100644 (file)
--- a/palette.c
+++ b/palette.c
@@ -4,10 +4,15 @@
 unsigned int d_8to24table[256];
 //byte d_15to8table[32768];
 byte host_basepal[768];
-byte qgamma[256];
-static float vid_gamma = 1.0;
+byte texgamma[256];
 
-void Palette_Setup8to24()
+static float texture_gamma = 1.0;
+
+cvar_t vid_gamma = {CVAR_SAVE, "vid_gamma", "1"};
+cvar_t vid_brightness = {CVAR_SAVE, "vid_brightness", "1"};
+cvar_t vid_contrast = {CVAR_SAVE, "vid_contrast", "1"};
+
+void Palette_Setup8to24(void)
 {
        byte *in, *out;
        unsigned short i;
@@ -25,7 +30,7 @@ void Palette_Setup8to24()
 }
 
 /*
-void   Palette_Setup15to8()
+void   Palette_Setup15to8(void)
 {
        byte    *pal;
        unsigned r,g,b;
@@ -57,42 +62,140 @@ void       Palette_Setup15to8()
 }
 */
 
-void Palette_Gamma ()
+void BuildGammaTable8(float prescale, float gamma, float scale, float base, byte *out)
 {
-       float   inf;
-       int             i;
+       int i, adjusted;
+       double invgamma, d;
 
-       vid_gamma = 1;
+       gamma = bound(0.1, gamma, 5.0);
+       if (gamma == 1) // LordHavoc: dodge the math
+       {
+               for (i = 0;i < 256;i++)
+               {
+                       adjusted = (int) (i * prescale * scale + base * 255.0);
+                       out[i] = bound(0, adjusted, 255);
+               }
+       }
+       else
+       {
+               invgamma = 1.0 / gamma;
+               prescale /= 255.0f;
+               for (i = 0;i < 256;i++)
+               {
+                       d = pow((double) i * prescale, invgamma) * scale + base;
+                       adjusted = (int) (255.0 * d);
+                       out[i] = bound(0, adjusted, 255);
+               }
+       }
+}
+
+void BuildGammaTable16(float prescale, float gamma, float scale, float base, unsigned short *out)
+{
+       int i, adjusted;
+       double invgamma, d;
+
+       gamma = bound(0.1, gamma, 5.0);
+       if (gamma == 1) // LordHavoc: dodge the math
+       {
+               for (i = 0;i < 256;i++)
+               {
+                       adjusted = (int) (i * 256.0 * prescale * scale + base * 65535.0);
+                       out[i] = bound(0, adjusted, 65535);
+               }
+       }
+       else
+       {
+               invgamma = 1.0 / gamma;
+               prescale /= 255.0f;
+               for (i = 0;i < 256;i++)
+               {
+                       d = pow((double) i * prescale, invgamma) * scale + base;
+                       adjusted = (int) (65535.0 * d);
+                       out[i] = bound(0, adjusted, 65535);
+               }
+       }
+}
+
+void Texture_Gamma (void)
+{
+       int i, adjusted;
+       double invgamma;
+
+       texture_gamma = 1;
        if ((i = COM_CheckParm("-gamma")))
-               vid_gamma = atof(com_argv[i+1]);
+               texture_gamma = atof(com_argv[i+1]);
+       texture_gamma = bound(0.1, texture_gamma, 5.0);
 
-       if (vid_gamma == 1) // LordHavoc: dodge the math
+       if (texture_gamma == 1) // LordHavoc: dodge the math
        {
                for (i = 0;i < 256;i++)
-                       qgamma[i] = i;
+                       texgamma[i] = i;
        }
        else
        {
+               invgamma = 1.0 / texture_gamma;
                for (i = 0;i < 256;i++)
                {
-                       inf = pow((i+1)/256.0, vid_gamma)*255 + 0.5;
-                       if (inf < 0) inf = 0;
-                       if (inf > 255) inf = 255;
-                       qgamma[i] = inf;
+                       adjusted = (int) ((255.0 * pow((double) i / 255.0, invgamma)) + 0.5);
+                       texgamma[i] = bound(0, adjusted, 255);
                }
        }
 }
 
-void Palette_Init()
+qboolean hardwaregammasupported = false;
+void VID_UpdateGamma(qboolean force)
+{
+       static float cachegamma = -1, cachebrightness = -1, cachecontrast = -1, cachelighthalf = -1;
+
+       // LordHavoc: don't mess with gamma tables if running dedicated
+       if (cls.state == ca_dedicated)
+               return;
+
+       if (!force && vid_gamma.value == cachegamma && vid_brightness.value == cachebrightness && vid_contrast.value == cachecontrast && lighthalf == cachelighthalf)
+               return;
+
+       if (vid_gamma.value < 0.1)
+               Cvar_SetValue("vid_gamma", 0.1);
+       if (vid_gamma.value > 5.0)
+               Cvar_SetValue("vid_gamma", 5.0);
+
+       if (vid_brightness.value < 1.0)
+               Cvar_SetValue("vid_brightness", 1.0);
+       if (vid_brightness.value > 5.0)
+               Cvar_SetValue("vid_brightness", 5.0);
+
+       if (vid_contrast.value < 0.2)
+               Cvar_SetValue("vid_contrast", 0.2);
+       if (vid_contrast.value > 1)
+               Cvar_SetValue("vid_contrast", 1);
+
+       cachegamma = vid_gamma.value;
+       cachebrightness = vid_brightness.value;
+       cachecontrast = vid_contrast.value;
+       cachelighthalf = lighthalf;
+
+       hardwaregammasupported = VID_SetGamma((cachelighthalf ? 2.0f : 1.0f), cachegamma, cachebrightness * cachecontrast, 1 - cachecontrast);
+       if (!hardwaregammasupported)
+               Con_Printf("Hardware gamma not supported.\n");
+}
+
+void Gamma_Init(void)
+{
+       Cvar_RegisterVariable(&vid_gamma);
+       Cvar_RegisterVariable(&vid_brightness);
+       Cvar_RegisterVariable(&vid_contrast);
+}
+
+void Palette_Init(void)
 {
        byte *pal;
        pal = (byte *)COM_LoadMallocFile ("gfx/palette.lmp", false);
        if (!pal)
                Sys_Error ("Couldn't load gfx/palette.lmp");
        memcpy(host_basepal, pal, 765);
-       free(pal);
+       qfree(pal);
        host_basepal[765] = host_basepal[766] = host_basepal[767] = 0; // LordHavoc: force the transparent color to black
        Palette_Setup8to24();
 //     Palette_Setup15to8();
-       Palette_Gamma();
+       Texture_Gamma();
 }