/* ** GLimp_SetGammaRamp */ void GLimp_SetGammaRamp( size_t stride, unsigned short *ramp ) { if( qwglGetDeviceGammaRamp3DFX ) qwglSetDeviceGammaRamp3DFX( glw_state.hDC, ramp ); else SetDeviceGammaRamp( glw_state.hDC, ramp ); }
/* ** GLimp_SetGamma ** ** This routine should only be called if glConfig.deviceSupportsGamma is TRUE */ void GLimp_SetGamma( unsigned char red[256], unsigned char green[256], unsigned char blue[256] ) { unsigned short table[3][256]; int i, j; int ret; OSVERSIONINFO vinfo; if ( !glConfig.deviceSupportsGamma || r_ignorehwgamma->integer || !glw_state.hDC ) { return; } //mapGammaMax(); for ( i = 0; i < 256; i++ ) { table[0][i] = ( ( ( unsigned short ) red[i] ) << 8 ) | red[i]; table[1][i] = ( ( ( unsigned short ) green[i] ) << 8 ) | green[i]; table[2][i] = ( ( ( unsigned short ) blue[i] ) << 8 ) | blue[i]; } // Win2K puts this odd restriction on gamma ramps... vinfo.dwOSVersionInfoSize = sizeof(vinfo); GetVersionEx( &vinfo ); if ( vinfo.dwMajorVersion == 5 && vinfo.dwPlatformId == VER_PLATFORM_WIN32_NT ) { Com_DPrintf( "performing W2K gamma clamp.\n" ); for ( j = 0 ; j < 3 ; j++ ) { for ( i = 0 ; i < 128 ; i++ ) { if ( table[j][i] > ( (128+i) << 8 ) ) { table[j][i] = (128+i) << 8; } } if ( table[j][127] > 254<<8 ) { table[j][127] = 254<<8; } } } else { Com_DPrintf( "skipping W2K gamma clamp.\n" ); } // enforce constantly increasing for ( j = 0 ; j < 3 ; j++ ) { for ( i = 1 ; i < 256 ; i++ ) { if ( table[j][i] < table[j][i-1] ) { table[j][i] = table[j][i-1]; } } } if ( qwglSetDeviceGammaRamp3DFX ) { qwglSetDeviceGammaRamp3DFX( glw_state.hDC, table ); } else { ret = SetDeviceGammaRamp( glw_state.hDC, table ); if ( !ret ) { Com_Printf( "SetDeviceGammaRamp failed.\n" ); } } }
/* ** WG_RestoreGamma */ void WG_RestoreGamma( void ) { if ( glConfig.deviceSupportsGamma ) { if ( qwglSetDeviceGammaRamp3DFX ) { qwglSetDeviceGammaRamp3DFX( glw_state.hDC, s_oldHardwareGamma ); } else { HDC hDC; hDC = GetDC( GetDesktopWindow() ); SetDeviceGammaRamp( hDC, s_oldHardwareGamma ); ReleaseDC( GetDesktopWindow(), hDC ); } } }
/* ** GLimp_SetGammaRamp */ void GLimp_SetGammaRamp( size_t stride, unsigned short size, unsigned short *ramp ) { unsigned short ramp256[3*256]; if( size != 256 ) return; memcpy( ramp256, ramp , size*sizeof(*ramp)); memcpy( ramp256+ 256, ramp+ stride, size*sizeof(*ramp)); memcpy( ramp256+2*256, ramp+2*stride, size*sizeof(*ramp)); if( qwglGetDeviceGammaRamp3DFX ) qwglSetDeviceGammaRamp3DFX( glw_state.hDC, ramp256 ); else SetDeviceGammaRamp( glw_state.hDC, ramp256 ); }
//Knightmare- added Vic's hardware gammaramp void UpdateGammaRamp (void) { int i, o; if (!gl_state.gammaRamp) return; memcpy (gamma_ramp, original_ramp, sizeof(original_ramp)); for (o = 0; o < 3; o++) { for (i = 0; i < 256; i++) { signed int v; v = 255 * pow ((i+0.5)/255.5, vid_gamma->value ) + 0.5; if (v > 255) v = 255; if (v < 0) v = 0; gamma_ramp[o][i] = ((WORD)v) << 8; } } if( qwglSetDeviceGammaRamp3DFX ) { WORD newramp[3*256]; int j; for( j = 0; j < 256; j++ ) { newramp[j+0] = gamma_ramp[0][j]; newramp[j+256] = gamma_ramp[1][j]; newramp[j+512] = gamma_ramp[2][j]; } qwglSetDeviceGammaRamp3DFX ( glw_state.hDC, newramp ); } else { SetDeviceGammaRamp ( glw_state.hDC, gamma_ramp ); } }
void GLimp_Shutdown( void ) { //Knightmare- added Vic's hardware gamma ramp if ( !r_ignorehwgamma->value ) { if( qwglSetDeviceGammaRamp3DFX ) { WORD newramp[3*256]; int j; for( j = 0; j < 256; j++ ) { newramp[j+0] = original_ramp[0][j]; newramp[j+256] = original_ramp[1][j]; newramp[j+512] = original_ramp[2][j]; } qwglSetDeviceGammaRamp3DFX ( glw_state.hDC, newramp ); } else { SetDeviceGammaRamp (glw_state.hDC, original_ramp); } } //end Knightmare if ( qwglMakeCurrent && !qwglMakeCurrent( NULL, NULL ) ) VID_Printf( PRINT_ALL, "ref_gl::R_Shutdown() - wglMakeCurrent failed\n"); if ( glw_state.hGLRC ) { if ( qwglDeleteContext && !qwglDeleteContext( glw_state.hGLRC ) ) VID_Printf( PRINT_ALL, "ref_gl::R_Shutdown() - wglDeleteContext failed\n"); glw_state.hGLRC = NULL; } if (glw_state.hDC) { if ( !ReleaseDC( glw_state.hWnd, glw_state.hDC ) ) VID_Printf( PRINT_ALL, "ref_gl::R_Shutdown() - ReleaseDC failed\n" ); glw_state.hDC = NULL; } if (glw_state.hWnd) { //Knightmare- remove leftover button on taskbar ShowWindow (glw_state.hWnd, SW_HIDE); //end Knightmare DestroyWindow ( glw_state.hWnd ); glw_state.hWnd = NULL; } if ( glw_state.log_fp ) { fclose( glw_state.log_fp ); glw_state.log_fp = 0; } UnregisterClass (WINDOW_CLASS_NAME, glw_state.hInstance); if ( gl_state.fullscreen ) { ChangeDisplaySettings( 0, 0 ); gl_state.fullscreen = false; } }
/* ================= GLimp_SetGamma ================= */ void GLimp_SetGamma( unsigned char red[256], unsigned char green[256], unsigned char blue[256] ) { Uint16 table[3][256]; int i, j; if( !glConfig.deviceSupportsGamma || r_ignorehwgamma->integer > 0 ) return; for (i = 0; i < 256; i++) { table[0][i] = ( ( ( Uint16 ) red[i] ) << 8 ) | red[i]; table[1][i] = ( ( ( Uint16 ) green[i] ) << 8 ) | green[i]; table[2][i] = ( ( ( Uint16 ) blue[i] ) << 8 ) | blue[i]; } #ifdef _WIN32 #include <windows.h> // Win2K and newer put this odd restriction on gamma ramps... { OSVERSIONINFO vinfo; vinfo.dwOSVersionInfoSize = sizeof( vinfo ); GetVersionEx( &vinfo ); if( vinfo.dwMajorVersion >= 5 && vinfo.dwPlatformId == VER_PLATFORM_WIN32_NT ) { ri.Printf( PRINT_DEVELOPER, "performing gamma clamp.\n" ); for( j = 0 ; j < 3 ; j++ ) { for( i = 0 ; i < 128 ; i++ ) { if( table[ j ] [ i] > ( ( 128 + i ) << 8 ) ) table[ j ][ i ] = ( 128 + i ) << 8; } if( table[ j ] [127 ] > 254 << 8 ) table[ j ][ 127 ] = 254 << 8; } } } #endif // enforce constantly increasing for (j = 0; j < 3; j++) { for (i = 1; i < 256; i++) { if (table[j][i] < table[j][i-1]) table[j][i] = table[j][i-1]; } } // leilei - 3dfx gamma support #ifdef _WIN32 if ( qwglSetDeviceGammaRamp3DFX ) { HDC hDC;// = GetDC( hWnd ); hDC = GetDC( GetForegroundWindow() ); qwglSetDeviceGammaRamp3DFX( hDC, table ); ReleaseDC( GetForegroundWindow(), hDC ); } else #endif { SDL_SetGammaRamp(table[0], table[1], table[2]); } }