00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <assert.h>
00026 #include "../renderer/tr_local.h"
00027 #include "../qcommon/qcommon.h"
00028 #include "glw_win.h"
00029 #include "win_local.h"
00030
00031 static unsigned short s_oldHardwareGamma[3][256];
00032
00033
00034
00035
00036
00037
00038 void WG_CheckHardwareGamma( void )
00039 {
00040 HDC hDC;
00041
00042 glConfig.deviceSupportsGamma = qfalse;
00043
00044 if ( qwglSetDeviceGammaRamp3DFX )
00045 {
00046 glConfig.deviceSupportsGamma = qtrue;
00047
00048 hDC = GetDC( GetDesktopWindow() );
00049 glConfig.deviceSupportsGamma = qwglGetDeviceGammaRamp3DFX( hDC, s_oldHardwareGamma );
00050 ReleaseDC( GetDesktopWindow(), hDC );
00051
00052 return;
00053 }
00054
00055
00056 if ( glConfig.driverType == GLDRV_STANDALONE )
00057 {
00058 return;
00059 }
00060
00061 if ( !r_ignorehwgamma->integer )
00062 {
00063 hDC = GetDC( GetDesktopWindow() );
00064 glConfig.deviceSupportsGamma = GetDeviceGammaRamp( hDC, s_oldHardwareGamma );
00065 ReleaseDC( GetDesktopWindow(), hDC );
00066
00067 if ( glConfig.deviceSupportsGamma )
00068 {
00069
00070
00071
00072 if ( ( HIBYTE( s_oldHardwareGamma[0][255] ) <= HIBYTE( s_oldHardwareGamma[0][0] ) ) ||
00073 ( HIBYTE( s_oldHardwareGamma[1][255] ) <= HIBYTE( s_oldHardwareGamma[1][0] ) ) ||
00074 ( HIBYTE( s_oldHardwareGamma[2][255] ) <= HIBYTE( s_oldHardwareGamma[2][0] ) ) )
00075 {
00076 glConfig.deviceSupportsGamma = qfalse;
00077 ri.Printf( PRINT_WARNING, "WARNING: device has broken gamma support, generated gamma.dat\n" );
00078 }
00079
00080
00081
00082
00083
00084 if ( ( HIBYTE( s_oldHardwareGamma[0][181] ) == 255 ) )
00085 {
00086 int g;
00087
00088 ri.Printf( PRINT_WARNING, "WARNING: suspicious gamma tables, using linear ramp for restoration\n" );
00089
00090 for ( g = 0; g < 255; g++ )
00091 {
00092 s_oldHardwareGamma[0][g] = g << 8;
00093 s_oldHardwareGamma[1][g] = g << 8;
00094 s_oldHardwareGamma[2][g] = g << 8;
00095 }
00096 }
00097 }
00098 }
00099 }
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133 void GLimp_SetGamma( unsigned char red[256], unsigned char green[256], unsigned char blue[256] ) {
00134 unsigned short table[3][256];
00135 int i, j;
00136 int ret;
00137 OSVERSIONINFO vinfo;
00138
00139 if ( !glConfig.deviceSupportsGamma || r_ignorehwgamma->integer || !glw_state.hDC ) {
00140 return;
00141 }
00142
00143
00144
00145 for ( i = 0; i < 256; i++ ) {
00146 table[0][i] = ( ( ( unsigned short ) red[i] ) << 8 ) | red[i];
00147 table[1][i] = ( ( ( unsigned short ) green[i] ) << 8 ) | green[i];
00148 table[2][i] = ( ( ( unsigned short ) blue[i] ) << 8 ) | blue[i];
00149 }
00150
00151
00152 vinfo.dwOSVersionInfoSize = sizeof(vinfo);
00153 GetVersionEx( &vinfo );
00154 if ( vinfo.dwMajorVersion == 5 && vinfo.dwPlatformId == VER_PLATFORM_WIN32_NT ) {
00155 Com_DPrintf( "performing W2K gamma clamp.\n" );
00156 for ( j = 0 ; j < 3 ; j++ ) {
00157 for ( i = 0 ; i < 128 ; i++ ) {
00158 if ( table[j][i] > ( (128+i) << 8 ) ) {
00159 table[j][i] = (128+i) << 8;
00160 }
00161 }
00162 if ( table[j][127] > 254<<8 ) {
00163 table[j][127] = 254<<8;
00164 }
00165 }
00166 } else {
00167 Com_DPrintf( "skipping W2K gamma clamp.\n" );
00168 }
00169
00170
00171 for ( j = 0 ; j < 3 ; j++ ) {
00172 for ( i = 1 ; i < 256 ; i++ ) {
00173 if ( table[j][i] < table[j][i-1] ) {
00174 table[j][i] = table[j][i-1];
00175 }
00176 }
00177 }
00178
00179
00180 if ( qwglSetDeviceGammaRamp3DFX )
00181 {
00182 qwglSetDeviceGammaRamp3DFX( glw_state.hDC, table );
00183 }
00184 else
00185 {
00186 ret = SetDeviceGammaRamp( glw_state.hDC, table );
00187 if ( !ret ) {
00188 Com_Printf( "SetDeviceGammaRamp failed.\n" );
00189 }
00190 }
00191 }
00192
00193
00194
00195
00196 void WG_RestoreGamma( void )
00197 {
00198 if ( glConfig.deviceSupportsGamma )
00199 {
00200 if ( qwglSetDeviceGammaRamp3DFX )
00201 {
00202 qwglSetDeviceGammaRamp3DFX( glw_state.hDC, s_oldHardwareGamma );
00203 }
00204 else
00205 {
00206 HDC hDC;
00207
00208 hDC = GetDC( GetDesktopWindow() );
00209 SetDeviceGammaRamp( hDC, s_oldHardwareGamma );
00210 ReleaseDC( GetDesktopWindow(), hDC );
00211 }
00212 }
00213 }
00214