367 lines
11 KiB
C
367 lines
11 KiB
C
/*
|
|
=======================================================================================
|
|
Name : DispMode.c
|
|
Author : vincent lhullier Date :04/09/98
|
|
Description : Manage the different display mode available
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include "Init_Gli.h"
|
|
#include "GLI_util.h"
|
|
#include "DllInter.h"
|
|
#include "DispMode.h"
|
|
#include "Tex.h"
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
|
|
/*
|
|
=======================================================================================
|
|
Extern (globals and function prototypes)
|
|
=======================================================================================
|
|
*/
|
|
|
|
extern HINSTANCE fn_hGetApplicationInstance(void);
|
|
extern HWND fn_hGetApplicationWindow(void);
|
|
/* Defined in project main2_0 */
|
|
extern void fn_vChangeDeviceResolution(void);
|
|
/* Defined in Gliglou\Gld */
|
|
extern BOOL GLD_fn_bChangeDeviceDisplayMode( GLD_tdhDevice hDev );
|
|
/* Defined if GAM\Basic.c */
|
|
extern void GAM_fn_vActualizeAllGameViewportSize(void);
|
|
|
|
/*
|
|
=======================================================================================
|
|
Globals
|
|
=======================================================================================
|
|
*/
|
|
/*
|
|
* to store display mode
|
|
*/
|
|
GLI_tdstDisplayMode GLI_gs_a_stDisplayMode[ GLI_C_lMaxDisplayMode ];
|
|
long GLI_gs_lNumberOfDisplayModes = 0;
|
|
long GLI_gs_lCurrentDisplayMode;
|
|
long GLI_gs_lRequestedDisplayMode = -1;
|
|
|
|
/*
|
|
* Brightness value
|
|
*/
|
|
float GLI_g_xBrightness = 0.5f;
|
|
|
|
/*
|
|
=======================================================================================
|
|
Access function
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
* for display mode
|
|
*/
|
|
long GLI_fn_lIsFullScreenMode( void )
|
|
{
|
|
return (GLI_gs_a_stDisplayMode[GLI_gs_lCurrentDisplayMode].lFullScreen);
|
|
}
|
|
|
|
long GLI_fn_lDisplayModeWidth( void )
|
|
{
|
|
/*if (GLI_fn_lIsFullScreenMode() )*/
|
|
return GLI_gs_a_stDisplayMode[GLI_gs_lCurrentDisplayMode].lWidth;
|
|
|
|
/*
|
|
* windowed
|
|
*/
|
|
/*return 640;*/
|
|
}
|
|
|
|
long GLI_fn_lDisplayModeHeight( void )
|
|
{
|
|
/*if (GLI_fn_lIsFullScreenMode() )*/
|
|
return GLI_gs_a_stDisplayMode[GLI_gs_lCurrentDisplayMode].lHeight;
|
|
|
|
/*
|
|
* windowed
|
|
*/
|
|
/*return 480;*/
|
|
|
|
}
|
|
|
|
long GLI_fn_lDisplayModeBPP( void )
|
|
{
|
|
return GLI_gs_a_stDisplayMode[GLI_gs_lCurrentDisplayMode].lBpp;
|
|
}
|
|
|
|
long GLI_fn_lGetDisplayMode( void )
|
|
{
|
|
return GLI_gs_lCurrentDisplayMode;
|
|
}
|
|
|
|
/*
|
|
=======================================================================================
|
|
function for list of display modes
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Add a display mode in list (no check if already exist are done)
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
long GLI_fn_lAddDisplayMode( long _lFullScreen, long _lWidth, long _lHeight, long _lBpp )
|
|
{
|
|
GLI_gs_a_stDisplayMode[ GLI_gs_lNumberOfDisplayModes ].lFullScreen = _lFullScreen;
|
|
GLI_gs_a_stDisplayMode[ GLI_gs_lNumberOfDisplayModes ].lWidth = _lWidth;
|
|
GLI_gs_a_stDisplayMode[ GLI_gs_lNumberOfDisplayModes ].lHeight = _lHeight;
|
|
GLI_gs_a_stDisplayMode[ GLI_gs_lNumberOfDisplayModes ].lBpp = _lBpp;
|
|
GLI_gs_lNumberOfDisplayModes++;
|
|
return TRUE;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : return number of display modes
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
long GLI_fn_lGetNumberOfDisplayModes( void )
|
|
{
|
|
return GLI_gs_lNumberOfDisplayModes;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : return index of current dsplay mode
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
long GLI_fn_lGetCurrentDisplayMode( void )
|
|
{
|
|
return GLI_gs_lCurrentDisplayMode;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : return current display mode width and height
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
long GLI_fn_lGetDisplayModeParameters( long _lDisplayMode, long *_p_lWidth, long *_p_lHeight )
|
|
{
|
|
if ( (_lDisplayMode < 0) || (_lDisplayMode >= GLI_gs_lNumberOfDisplayModes) )
|
|
return 0;
|
|
|
|
*_p_lWidth = GLI_gs_a_stDisplayMode[ _lDisplayMode ].lWidth;
|
|
*_p_lHeight= GLI_gs_a_stDisplayMode[ _lDisplayMode ].lHeight;
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : return a string with display description (640x480 for example)
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
long GLI_fn_lGetDisplayModeDescription( long _lDisplayMode, char *_szDesc )
|
|
{
|
|
long lWidth, lHeight;
|
|
|
|
if ( !GLI_fn_lGetDisplayModeParameters( _lDisplayMode, &lWidth, &lHeight ) )
|
|
return 0;
|
|
|
|
sprintf( _szDesc, "%dx%d", lWidth, lHeight );
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : to do a request to change display mode
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void GLI_fn_lRequestNewDisplayMode( long _lDisplayMode )
|
|
{
|
|
/* check is there is not already a request */
|
|
if (GLI_gs_lRequestedDisplayMode != -1)
|
|
return;
|
|
|
|
/* check if mode requested is not equal to current */
|
|
if (_lDisplayMode == GLI_gs_lCurrentDisplayMode)
|
|
return;
|
|
|
|
/* make the request */
|
|
GLI_gs_lRequestedDisplayMode = _lDisplayMode;
|
|
fn_vChangeDeviceResolution();
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : change really display mode (have to be called by win app
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
long GLI_fn_lChangeDisplayMode( void )
|
|
{
|
|
long lOldDisplayMode;
|
|
|
|
|
|
if (GLI_gs_lRequestedDisplayMode == -1)
|
|
return 0;
|
|
|
|
lOldDisplayMode = GLI_gs_lCurrentDisplayMode;
|
|
GLI_gs_lCurrentDisplayMode = GLI_gs_lRequestedDisplayMode;
|
|
|
|
GLI_vCloseGli();
|
|
GLI_xInitGli();
|
|
GLI_vComputeTextures();
|
|
|
|
GLD_fn_bChangeDeviceDisplayMode( 0 );
|
|
GAM_fn_vActualizeAllGameViewportSize();
|
|
GLI_gs_lRequestedDisplayMode = -1;
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Readapt display (called by win app when window is windowed and is moved
|
|
or resized )
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void GLI_fn_vReadaptDisplay( void )
|
|
{
|
|
if ( !GLI_DRV_vReadaptDisplay )
|
|
return ;
|
|
|
|
GLI_DRV_vReadaptDisplay();
|
|
GLD_bAdjustDeviceToWindow( 0 );
|
|
}
|
|
|
|
/*
|
|
=======================================================================================
|
|
choose / select
|
|
=======================================================================================
|
|
*/
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : select display mode by index
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
long GLI_fn_lSelectDisplayModeByIndex( long _lIndex )
|
|
{
|
|
if ( (_lIndex < 0) || (_lIndex >= GLI_gs_lNumberOfDisplayModes) )
|
|
return -1;
|
|
|
|
GLI_gs_lCurrentDisplayMode = _lIndex;
|
|
return GLI_gs_lCurrentDisplayMode;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : select display mode by dimension
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
long GLI_fn_lSelectDisplayModeByDimension( long _lWidth, long _lHeight, long _lBpp )
|
|
{
|
|
long lIndex;
|
|
|
|
for (lIndex = 0; lIndex < GLI_gs_lNumberOfDisplayModes; lIndex++)
|
|
{
|
|
if (
|
|
(_lWidth == GLI_gs_a_stDisplayMode[ lIndex ].lWidth) &&
|
|
(_lHeight == GLI_gs_a_stDisplayMode[ lIndex ].lHeight) &&
|
|
(_lBpp == GLI_gs_a_stDisplayMode[ lIndex ].lBpp)
|
|
)
|
|
{
|
|
GLI_gs_lCurrentDisplayMode = lIndex;
|
|
return lIndex;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : choose display mode
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
long GLI_fn_lChooseDisplayMode( void )
|
|
{
|
|
GLI_gs_lCurrentDisplayMode = -1;
|
|
|
|
/* no resolution available */
|
|
if (GLI_gs_lNumberOfDisplayModes == 0)
|
|
{
|
|
Erm_fn_iMessageBox( "No available resolution", "FatalError", MB_OK | MB_ICONSTOP );
|
|
return FALSE;
|
|
}
|
|
|
|
/* try default resolution */
|
|
GLI_gs_lCurrentDisplayMode = GLI_fn_lSelectDisplayModeByDimension( GLI_gst_DllInfo.l_InitWidth, GLI_gst_DllInfo.l_InitHeight, GLI_gst_DllInfo.l_InitBpp );
|
|
|
|
/* try 640x480 resolution */
|
|
if (GLI_gs_lCurrentDisplayMode == -1)
|
|
{
|
|
HDC hDC = GetDC(NULL);
|
|
long lBPP = GetDeviceCaps(hDC, PLANES) * GetDeviceCaps(hDC, BITSPIXEL);
|
|
ReleaseDC(NULL, hDC);
|
|
GLI_gs_lCurrentDisplayMode = GLI_fn_lSelectDisplayModeByDimension( 640, 480, lBPP );
|
|
}
|
|
|
|
/* first resolution */
|
|
if (GLI_gs_lCurrentDisplayMode == -1)
|
|
GLI_gs_lCurrentDisplayMode = 0;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*
|
|
=======================================================================================
|
|
Main functions
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Ask driver to enumerate available display modes
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void GLI_fn_vLoadDisplayMode( void )
|
|
{
|
|
GLI_gs_lNumberOfDisplayModes = 0;
|
|
#if 0
|
|
GLI_gs_lNumberOfDisplayModes = 1;
|
|
GLI_gs_a_stDisplayMode[0].lWidth = 640;
|
|
GLI_gs_a_stDisplayMode[0].lHeight = 480;
|
|
|
|
HDC hDC = GetDC(NULL);
|
|
GLI_gs_a_stDisplayMode[0].lBpp = GetDeviceCaps(hDC, PLANES) * GetDeviceCaps(hDC, BITSPIXEL);
|
|
ReleaseDC(NULL, hDC);
|
|
|
|
GLI_gs_a_stDisplayMode[0].lFullScreen = 0;
|
|
#else
|
|
GLI_DRV_fnl_EnumModes( GLI_gst_DllInfo.sz_DriverName, GLI_gst_DllInfo.sz_DeviceName );
|
|
#endif
|
|
}
|
|
|
|
/*
|
|
=======================================================================================
|
|
Brightness
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : change brightness value (_lValue is from 0 to 100)
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void GLI_fn_vSetBrightness( long _lValue )
|
|
{
|
|
if (_lValue < 0)
|
|
_lValue = 0;
|
|
else if (_lValue >= 100)
|
|
_lValue = 100;
|
|
|
|
GLI_g_xBrightness = ((float) _lValue) / 100.0f;
|
|
}
|
|
|
|
long GLI_fn_lGetBrightness()
|
|
{
|
|
return (long)(GLI_g_xBrightness * 100.0f);
|
|
}
|