4 unsigned int palette_complete[256];
5 unsigned int palette_nofullbrights[256];
6 unsigned int palette_onlyfullbrights[256];
7 unsigned int palette_nocolormapnofullbrights[256];
8 unsigned int palette_pantsaswhite[256];
9 unsigned int palette_shirtaswhite[256];
10 unsigned int palette_alpha[256];
11 unsigned int palette_font[256];
13 qbyte host_basepal[768];
15 cvar_t v_gamma = {CVAR_SAVE, "v_gamma", "1"};
16 cvar_t v_contrast = {CVAR_SAVE, "v_contrast", "1"};
17 cvar_t v_brightness = {CVAR_SAVE, "v_brightness", "0"};
18 cvar_t v_overbrightbits = {CVAR_SAVE, "v_overbrightbits", "0"};
19 cvar_t v_hwgamma = {0, "v_hwgamma", "1"};
21 void Palette_Setup8to24(void)
24 int fullbright_start, fullbright_end;
25 int pants_start, pants_end;
26 int shirt_start, shirt_end;
27 int reversed_start, reversed_end;
32 out = (qbyte *) palette_complete; // palette is accessed as 32bit for speed reasons, but is created as 8bit bytes
33 for (i = 0;i < 255;i++)
40 palette_complete[255] = 0; // completely transparent black
42 // FIXME: fullbright_start should be read from colormap.lmp
43 colormap = COM_LoadFile("gfx/colormap.lmp", true);
44 if (colormap && com_filesize >= 16385)
45 fullbright_start = 256 - colormap[16384];
47 fullbright_start = 256;
58 memset(palette_nofullbrights, 0, sizeof(palette_nofullbrights));
59 for (i = 0;i < fullbright_start;i++)
60 palette_nofullbrights[i] = palette_complete[i];
62 memset(palette_onlyfullbrights, 0, sizeof(palette_onlyfullbrights));
63 for (i = fullbright_start;i < fullbright_end;i++)
64 palette_onlyfullbrights[i] = palette_complete[i];
66 for (i = 0;i < 256;i++)
67 palette_nocolormapnofullbrights[i] = palette_complete[i];
68 for (i = pants_start;i < pants_end;i++)
69 palette_nocolormapnofullbrights[i] = 0;
70 for (i = shirt_start;i < shirt_end;i++)
71 palette_nocolormapnofullbrights[i] = 0;
72 for (i = fullbright_start;i < fullbright_end;i++)
73 palette_nocolormapnofullbrights[i] = 0;
75 memset(palette_pantsaswhite, 0, sizeof(palette_pantsaswhite));
76 for (i = pants_start;i < pants_end;i++)
78 if (i >= reversed_start && i < reversed_end)
79 palette_pantsaswhite[i] = 15 - (i - pants_start);
81 palette_pantsaswhite[i] = i - pants_start;
84 memset(palette_shirtaswhite, 0, sizeof(palette_shirtaswhite));
85 for (i = shirt_start;i < shirt_end;i++)
87 if (i >= reversed_start && i < reversed_end)
88 palette_shirtaswhite[i] = 15 - (i - shirt_start);
90 palette_shirtaswhite[i] = i - shirt_start;
93 memset(palette_alpha, 0, sizeof(palette_alpha));
94 for (i = 0;i < 255;i++)
95 palette_alpha[i] = 0xFFFFFFFF;
97 memset(palette_font, 0, sizeof(palette_font));
98 for (i = 1;i < 255;i++)
99 palette_font[i] = palette_complete[i];
103 void BuildGammaTable8(float prescale, float gamma, float scale, float base, qbyte *out)
108 gamma = bound(0.1, gamma, 5.0);
109 if (gamma == 1) // LordHavoc: dodge the math
111 for (i = 0;i < 256;i++)
113 adjusted = (int) (i * prescale * scale + base * 255.0);
114 out[i] = bound(0, adjusted, 255);
119 invgamma = 1.0 / gamma;
121 for (i = 0;i < 256;i++)
123 d = pow((double) i * prescale, invgamma) * scale + base;
124 adjusted = (int) (255.0 * d);
125 out[i] = bound(0, adjusted, 255);
130 void BuildGammaTable16(float prescale, float gamma, float scale, float base, unsigned short *out)
135 gamma = bound(0.1, gamma, 5.0);
136 if (gamma == 1) // LordHavoc: dodge the math
138 for (i = 0;i < 256;i++)
140 adjusted = (int) (i * 256.0 * prescale * scale + base * 65535.0);
141 out[i] = bound(0, adjusted, 65535);
146 invgamma = 1.0 / gamma;
148 for (i = 0;i < 256;i++)
150 d = pow((double) i * prescale, invgamma) * scale + base;
151 adjusted = (int) (65535.0 * d);
152 out[i] = bound(0, adjusted, 65535);
157 qboolean hardwaregammasupported = false;
158 void VID_UpdateGamma(qboolean force)
160 static float cachegamma = -1, cachebrightness = -1, cachecontrast = -1;
161 static int cacheoverbrightbits = -1, cachehwgamma = -1;
163 // LordHavoc: don't mess with gamma tables if running dedicated
164 if (cls.state == ca_dedicated)
168 && v_gamma.value == cachegamma
169 && v_contrast.value == cachecontrast
170 && v_brightness.value == cachebrightness
171 && v_overbrightbits.integer == cacheoverbrightbits
172 && v_hwgamma.value == cachehwgamma)
175 if (v_gamma.value < 0.1)
176 Cvar_SetValue("v_gamma", 0.1);
177 if (v_gamma.value > 5.0)
178 Cvar_SetValue("v_gamma", 5.0);
180 if (v_contrast.value < 0.5)
181 Cvar_SetValue("v_contrast", 0.5);
182 if (v_contrast.value > 5.0)
183 Cvar_SetValue("v_contrast", 5.0);
185 if (v_brightness.value < 0)
186 Cvar_SetValue("v_brightness", 0);
187 if (v_brightness.value > 0.8)
188 Cvar_SetValue("v_brightness", 0.8);
190 cachegamma = v_gamma.value;
191 cachecontrast = v_contrast.value;
192 cachebrightness = v_brightness.value;
193 cacheoverbrightbits = v_overbrightbits.integer;
195 hardwaregammasupported = VID_SetGamma((float) (1 << cacheoverbrightbits), cachegamma, cachecontrast, cachebrightness);
196 if (!hardwaregammasupported)
198 Con_Printf("Hardware gamma not supported.\n");
199 Cvar_SetValue("v_hwgamma", 0);
201 cachehwgamma = v_hwgamma.integer;
204 void Gamma_Init(void)
206 Cvar_RegisterVariable(&v_gamma);
207 Cvar_RegisterVariable(&v_brightness);
208 Cvar_RegisterVariable(&v_contrast);
209 Cvar_RegisterVariable(&v_hwgamma);
210 Cvar_RegisterVariable(&v_overbrightbits);
213 void Palette_Init(void)
216 float gamma, scale, base;
219 pal = (qbyte *)COM_LoadFile ("gfx/palette.lmp", false);
221 Sys_Error ("Couldn't load gfx/palette.lmp");
222 memcpy(host_basepal, pal, 765);
224 host_basepal[765] = host_basepal[766] = host_basepal[767] = 0; // LordHavoc: force the transparent color to black
229 i = COM_CheckParm("-texgamma");
231 gamma = atof(com_argv[i + 1]);
232 i = COM_CheckParm("-texcontrast");
234 scale = atof(com_argv[i + 1]);
235 i = COM_CheckParm("-texbrightness");
237 base = atof(com_argv[i + 1]);
238 gamma = bound(0.01, gamma, 10.0);
239 scale = bound(0.01, scale, 10.0);
240 base = bound(0, base, 0.95);
242 BuildGammaTable8(1.0f, gamma, scale, base, temp);
243 for (i = 3;i < 765;i++)
244 host_basepal[i] = temp[host_basepal[i]];
246 Palette_Setup8to24();