mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-06 15:51:25 +00:00
X11 gamma restoration now works properly for systems with a normal gamma that
uses all three components (red, green, blue). Next up: three-component internal gamma.
This commit is contained in:
parent
c877ba7fbd
commit
b75d50d088
2 changed files with 33 additions and 12 deletions
|
@ -41,7 +41,7 @@ extern Visual *x_vis;
|
||||||
extern Window x_root;
|
extern Window x_root;
|
||||||
extern Window x_win;
|
extern Window x_win;
|
||||||
extern XVisualInfo *x_visinfo;
|
extern XVisualInfo *x_visinfo;
|
||||||
extern double x_gamma;
|
extern vec3_t x_gamma;
|
||||||
extern int x_screen;
|
extern int x_screen;
|
||||||
extern int x_shmeventtype;
|
extern int x_shmeventtype;
|
||||||
extern Time x_time;
|
extern Time x_time;
|
||||||
|
@ -50,7 +50,7 @@ extern qboolean oktodraw;
|
||||||
|
|
||||||
void GetEvent (void);
|
void GetEvent (void);
|
||||||
|
|
||||||
double X11_GetGamma (void);
|
vec3_t *X11_GetGamma (void);
|
||||||
qboolean X11_AddEvent (int event, void (*event_handler)(XEvent *));
|
qboolean X11_AddEvent (int event, void (*event_handler)(XEvent *));
|
||||||
qboolean X11_RemoveEvent (int event, void (*event_handler)(XEvent *));
|
qboolean X11_RemoveEvent (int event, void (*event_handler)(XEvent *));
|
||||||
qboolean X11_SetGamma (double);
|
qboolean X11_SetGamma (double);
|
||||||
|
|
|
@ -99,7 +99,7 @@ Time x_time;
|
||||||
static XF86VidModeModeInfo **vidmodes;
|
static XF86VidModeModeInfo **vidmodes;
|
||||||
static int nummodes;
|
static int nummodes;
|
||||||
static int original_mode = 0;
|
static int original_mode = 0;
|
||||||
static double x_gamma = -1;
|
static vec3_t x_gamma = {-1, -1, -1};
|
||||||
static qboolean vidmode_avail = false;
|
static qboolean vidmode_avail = false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -387,8 +387,20 @@ X11_SetVidMode (int width, int height)
|
||||||
vidmode_avail = VID_CheckVMode (x_disp, NULL, NULL);
|
vidmode_avail = VID_CheckVMode (x_disp, NULL, NULL);
|
||||||
|
|
||||||
if (vidmode_avail) {
|
if (vidmode_avail) {
|
||||||
if (x_gamma > 0 || (x_gamma = X11_GetGamma ()))
|
vec3_t *temp;
|
||||||
|
|
||||||
|
if (x_gamma[0] > 0) { // already initialized
|
||||||
vid_gamma_avail = true;
|
vid_gamma_avail = true;
|
||||||
|
} else { // do the init
|
||||||
|
temp = X11_GetGamma ();
|
||||||
|
if (temp && temp[0] > 0) {
|
||||||
|
x_gamma[0] = (*temp)[0];
|
||||||
|
x_gamma[1] = (*temp)[1];
|
||||||
|
x_gamma[2] = (*temp)[2];
|
||||||
|
vid_gamma_avail = true;
|
||||||
|
free (temp);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vid_fullscreen->int_val && vidmode_avail) {
|
if (vid_fullscreen->int_val && vidmode_avail) {
|
||||||
|
@ -714,21 +726,28 @@ X11_ForceViewPort (void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
double
|
vec3_t *
|
||||||
X11_GetGamma (void)
|
X11_GetGamma (void)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_VIDMODE
|
#ifdef HAVE_VIDMODE
|
||||||
# ifdef X_XF86VidModeGetGamma
|
# ifdef X_XF86VidModeGetGamma
|
||||||
XF86VidModeGamma xgamma;
|
XF86VidModeGamma xgamma;
|
||||||
|
vec3_t *temp;
|
||||||
|
|
||||||
if (vidmode_avail && vid_system_gamma->int_val) {
|
if (vidmode_avail && vid_system_gamma->int_val) {
|
||||||
if (XF86VidModeGetGamma (x_disp, x_screen, &xgamma)) {
|
if (XF86VidModeGetGamma (x_disp, x_screen, &xgamma)) {
|
||||||
return ((xgamma.red + xgamma.green + xgamma.blue) / 3);
|
if ((temp = malloc (sizeof (vec3_t)))) {
|
||||||
|
(*temp)[0] = xgamma.red;
|
||||||
|
(*temp)[1] = xgamma.green;
|
||||||
|
(*temp)[2] = xgamma.blue;
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
return -1.0;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
qboolean
|
qboolean
|
||||||
|
@ -756,7 +775,9 @@ X11_RestoreGamma (void)
|
||||||
XF86VidModeGamma xgamma;
|
XF86VidModeGamma xgamma;
|
||||||
|
|
||||||
if (vid_gamma_avail) {
|
if (vid_gamma_avail) {
|
||||||
xgamma.red = xgamma.green = xgamma.blue = (float) x_gamma;
|
xgamma.red = x_gamma[0];
|
||||||
|
xgamma.green = x_gamma[1];
|
||||||
|
xgamma.blue = x_gamma[2];
|
||||||
XF86VidModeSetGamma (x_disp, x_screen, &xgamma);
|
XF86VidModeSetGamma (x_disp, x_screen, &xgamma);
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
Loading…
Reference in a new issue