void GLVideoSystem::set_gamma(float gamma) { Uint16 ramp[256]; SDL_CalculateGammaRamp(gamma, ramp); SDL_SetWindowGammaRamp(m_window, ramp, ramp, ramp); }
void SDLBaseVideoSystem::set_gamma(float gamma) { Uint16 ramp[256]; SDL_CalculateGammaRamp(gamma, ramp); SDL_SetWindowGammaRamp(m_sdl_window.get(), ramp, ramp, ramp); }
void SDLRenderer::set_gamma(float gamma) { Uint16 ramp[256]; SDL_CalculateGammaRamp(gamma, ramp); SDL_SetWindowGammaRamp(m_window, ramp, ramp, ramp); }
static int SDL_SetGamma(SDL_Window *win, float red, float green, float blue) { Uint16 red_ramp[256]; Uint16 green_ramp[256]; Uint16 blue_ramp[256]; SDL_CalculateGammaRamp(red, red_ramp); if (green == red) { Com_Memcpy(&green_ramp, &red_ramp, sizeof(red_ramp)); } else { SDL_CalculateGammaRamp(green, green_ramp); } if (blue == red) { Com_Memcpy(blue_ramp, red_ramp, sizeof(red_ramp)); } else { SDL_CalculateGammaRamp(blue, blue_ramp); } return SDL_SetWindowGammaRamp(win, red_ramp, green_ramp, blue_ramp); }
void GraphicsManager::setGamma(float gamma) { // Force calling it from the main thread if (!Common::isMainThread()) { Events::MainThreadFunctor<void> functor(boost::bind(&GraphicsManager::setGamma, this, gamma)); return RequestMan.callInMainThread(functor); } _gamma = gamma; uint16* gammaRamp = 0; SDL_CalculateGammaRamp(gamma, gammaRamp); SDL_SetWindowGammaRamp(_screen, gammaRamp, gammaRamp, gammaRamp); delete gammaRamp; }
bool CVideoMode::InitSDL() { ENSURE(!m_IsInitialised); ReadConfig(); EnableS3TC(); // preferred video mode = current desktop settings // (command line params may override these) gfx::GetVideoMode(&m_PreferredW, &m_PreferredH, &m_PreferredBPP, &m_PreferredFreq); int w = m_ConfigW; int h = m_ConfigH; if (m_ConfigFullscreen) { // If fullscreen and no explicit size set, default to the desktop resolution if (w == 0 || h == 0) { w = m_PreferredW; h = m_PreferredH; } } // If no size determined, default to something sensible if (w == 0 || h == 0) { w = DEFAULT_WINDOW_W; h = DEFAULT_WINDOW_H; } if (!m_ConfigFullscreen) { // Limit the window to the screen size (if known) if (m_PreferredW) w = std::min(w, m_PreferredW); if (m_PreferredH) h = std::min(h, m_PreferredH); } int bpp = GetBestBPP(); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); #if !SDL_VERSION_ATLEAST(1, 3, 0) SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, g_VSync ? 1 : 0); #endif #if CONFIG2_GLES && SDL_VERSION_ATLEAST(1, 3, 0) // Require GLES 2.0 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); #endif if (!SetVideoMode(w, h, bpp, m_ConfigFullscreen)) { // Fall back to a smaller depth buffer // (The rendering may be ugly but this helps when running in VMware) SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); if (!SetVideoMode(w, h, bpp, m_ConfigFullscreen)) return false; } #if SDL_VERSION_ATLEAST(1, 3, 0) SDL_GL_SetSwapInterval(g_VSync ? 1 : 0); #endif // Work around a bug in the proprietary Linux ATI driver (at least versions 8.16.20 and 8.14.13). // The driver appears to register its own atexit hook on context creation. // If this atexit hook is called before SDL_Quit destroys the OpenGL context, // some kind of double-free problem causes a crash and lockup in the driver. // Calling SDL_Quit twice appears to be harmless, though, and avoids the problem // by destroying the context *before* the driver's atexit hook is called. // (Note that atexit hooks are guaranteed to be called in reverse order of their registration.) atexit(SDL_Quit); // End work around. ogl_Init(); // required after each mode change // (TODO: does that mean we need to call this when toggling fullscreen later?) #if SDL_VERSION_ATLEAST(2, 0, 0) u16 ramp[256]; SDL_CalculateGammaRamp(g_Gamma, ramp); if (SDL_SetWindowGammaRamp(m_Window, ramp, ramp, ramp) < 0) LOGWARNING(L"SDL_SetGamma failed"); #else if (SDL_SetGamma(g_Gamma, g_Gamma, g_Gamma) < 0) LOGWARNING(L"SDL_SetGamma failed"); #endif m_IsInitialised = true; if (!m_ConfigFullscreen) { m_WindowedW = w; m_WindowedH = h; } return true; }
void SDLHardwareRenderDevice::setGamma(float g) { Uint16 ramp[256]; SDL_CalculateGammaRamp(g, ramp); SDL_SetWindowGammaRamp(window, ramp, ramp, ramp); }
void SetGamma(double fGamma) { Uint16 pRawRamp[256]; SDL_CalculateGammaRamp((float)((std::min<double>)((std::max<double>)(fGamma, 0.0), 1.0)), pRawRamp); SDL_SetWindowGammaRamp(m_Window, pRawRamp, pRawRamp, pRawRamp); }
Uint16 idris_SDL_calculateGammaRamp(float gamma) { Uint16 retval; SDL_CalculateGammaRamp(gamma, &retval); return retval; }
/** * @brief Call to SDL_CalculateGammaRamp * * @sa http://wiki.libsdl.org/moin.fcg/SDL_CalculateGammaRamp */ int pixels_calcGammaRamp(void *arg) { const char *expectedError1 = "Parameter 'gamma' is invalid"; const char *expectedError2 = "Parameter 'ramp' is invalid"; const char *error; float gamma; Uint16 *ramp; int variation; int i; int changed; Uint16 magic = 0xbeef; /* Allocate temp ramp array and fill with some value */ ramp = (Uint16 *)SDL_malloc(256 * sizeof(Uint16)); SDLTest_AssertCheck(ramp != NULL, "Validate temp ramp array could be allocated"); if (ramp == NULL) return TEST_ABORTED; /* Make call with different gamma values */ for (variation = 0; variation < 4; variation++) { switch (variation) { /* gamma = 0 all black */ case 0: gamma = 0.0f; break; /* gamma = 1 identity */ case 1: gamma = 1.0f; break; /* gamma = [0.2,0.8] normal range */ case 2: gamma = 0.2f + 0.8f * SDLTest_RandomUnitFloat(); break; /* gamma = >1.1 non-standard range */ case 3: gamma = 1.1f + SDLTest_RandomUnitFloat(); break; } /* Make call and check that values were updated */ for (i = 0; i < 256; i++) ramp[i] = magic; SDL_CalculateGammaRamp(gamma, ramp); SDLTest_AssertPass("Call to SDL_CalculateGammaRamp(%f)", gamma); changed = 0; for (i = 0; i < 256; i++) if (ramp[i] != magic) changed++; SDLTest_AssertCheck(changed > 250, "Validate that ramp was calculated; expected: >250 values changed, got: %d values changed", changed); /* Additional value checks for some cases */ i = SDLTest_RandomIntegerInRange(64,192); switch (variation) { case 0: SDLTest_AssertCheck(ramp[i] == 0, "Validate value at position %d; expected: 0, got: %d", i, ramp[i]); break; case 1: SDLTest_AssertCheck(ramp[i] == ((i << 8) | i), "Validate value at position %d; expected: %d, got: %d", i, (i << 8) | i, ramp[i]); break; case 2: case 3: SDLTest_AssertCheck(ramp[i] > 0, "Validate value at position %d; expected: >0, got: %d", i, ramp[i]); break; } } /* Negative cases */ SDL_ClearError(); SDLTest_AssertPass("Call to SDL_ClearError()"); gamma = -1; for (i=0; i<256; i++) ramp[i] = magic; SDL_CalculateGammaRamp(gamma, ramp); SDLTest_AssertPass("Call to SDL_CalculateGammaRamp(%f)", gamma); error = SDL_GetError(); SDLTest_AssertPass("Call to SDL_GetError()"); SDLTest_AssertCheck(error != NULL, "Validate that error message was not NULL"); if (error != NULL) { SDLTest_AssertCheck(SDL_strcmp(error, expectedError1) == 0, "Validate error message, expected: '%s', got: '%s'", expectedError1, error); } changed = 0; for (i = 0; i < 256; i++) if (ramp[i] != magic) changed++; SDLTest_AssertCheck(changed ==0, "Validate that ramp unchanged; expected: 0 values changed got: %d values changed", changed); SDL_CalculateGammaRamp(0.5f, NULL); SDLTest_AssertPass("Call to SDL_CalculateGammaRamp(0.5,NULL)"); error = SDL_GetError(); SDLTest_AssertPass("Call to SDL_GetError()"); SDLTest_AssertCheck(error != NULL, "Validate that error message was not NULL"); if (error != NULL) { SDLTest_AssertCheck(SDL_strcmp(error, expectedError2) == 0, "Validate error message, expected: '%s', got: '%s'", expectedError2, error); } /* Cleanup */ SDL_free(ramp); return TEST_COMPLETED; }