int SDL_SetGamma(float red, float green, float blue) { int succeeded; SDL_VideoDevice *video = current_video; SDL_VideoDevice *this = current_video; succeeded = -1; #ifdef USE_MATH_H /* 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]); } #else SDL_SetError("Gamma correction not supported"); #endif if ( (succeeded < 0) && video->SetGamma ) { SDL_ClearError(); succeeded = video->SetGamma(this, red, green, blue); } return succeeded; }
int SDL_SetGamma(float red, float green, float blue) { Uint16 ramp[3][256]; CalculateGammaRamp(red, ramp[0]); CalculateGammaRamp(green, ramp[1]); CalculateGammaRamp(blue, ramp[2]); return SDL_SetGammaRamp(ramp[0], ramp[1], ramp[2]); }
void UpdateHardwareGamma(void) { float gamma = (vid_gamma->value); int i; Display* dpy = NULL; SDL_SysWMinfo info; #if SDL_VERSION_ATLEAST(2, 0, 0) SDL_VERSION(&info.version); if(!SDL_GetWindowWMInfo(window, &info)) #else if(SDL_GetWMInfo(&info) != 1) #endif { VID_Printf(PRINT_ALL, "Couldn't get Window info from SDL\n"); return; } dpy = info.info.x11.display; XRRScreenResources* res = XRRGetScreenResources(dpy, info.info.x11.window); if(res == NULL) { VID_Printf(PRINT_ALL, "Unable to get xrandr screen resources.\n"); return; } for(i=0; i < res->ncrtc; ++i) { int len = XRRGetCrtcGammaSize(dpy, res->crtcs[i]); size_t rampSize = len*sizeof(Uint16); Uint16* ramp = malloc(rampSize); // TODO: check for NULL if(ramp == NULL) { VID_Printf(PRINT_ALL, "Couldn't allocate &zd byte of memory for gamma ramp - OOM?!\n", rampSize); return; } CalculateGammaRamp(gamma, ramp, len); XRRCrtcGamma* gamma = XRRAllocGamma(len); memcpy(gamma->red, ramp, rampSize); memcpy(gamma->green, ramp, rampSize); memcpy(gamma->blue, ramp, rampSize); free(ramp); XRRSetCrtcGamma(dpy, res->crtcs[i], gamma); XRRFreeGamma(gamma); } XRRFreeScreenResources(res); }
void UpdateHardwareGamma(void) { float gamma = (vid_gamma->value); Uint16 ramp[256]; CalculateGammaRamp(gamma, ramp, 256); #if SDL_VERSION_ATLEAST(2, 0, 0) if(SDL_SetWindowGammaRamp(window, ramp, ramp, ramp) != 0) { #else if(SDL_SetGammaRamp(ramp, ramp, ramp) < 0) { #endif VID_Printf(PRINT_ALL, "Setting gamma failed: %s\n", SDL_GetError()); } } #endif // X11GAMMA static qboolean IsFullscreen() { #if SDL_VERSION_ATLEAST(2, 0, 0) return !!(SDL_GetWindowFlags(window) & SDL_WINDOW_FULLSCREEN); #else return !!(window->flags & SDL_FULLSCREEN); #endif } static qboolean CreateSDLWindow(int flags) { #if SDL_VERSION_ATLEAST(2, 0, 0) int windowPos = SDL_WINDOWPOS_UNDEFINED; // TODO: support fullscreen on different displays with SDL_WINDOWPOS_UNDEFINED_DISPLAY(displaynum) window = SDL_CreateWindow("Yamagi Quake II", windowPos, windowPos, vid.width, vid.height, flags); if(window == NULL) { return false; } context = SDL_GL_CreateContext(window); if(context == NULL) { SDL_DestroyWindow(window); window = NULL; return false; } return true; #else window = SDL_SetVideoMode(vid.width, vid.height, 0, flags); SDL_EnableUNICODE(SDL_TRUE); return window != NULL; #endif }
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]; 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; }