Re #195 (Problems with Display configuration menu) : Use SDL to detect supported color depths and screen sizes, may be different in Windowed and Full-screen mode, hard-coded list as a fallback + tgf/tgfclient API consistency improvements

git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@2831 30fe4595-0a0c-4342-8851-515496e4dcbd

Former-commit-id: c258e69db3ed6abef61ffaad14da4ad644026677
Former-commit-id: 4661d482f43df57e9ad6c2a5a79d00d808af1e2a
This commit is contained in:
pouillot 2010-10-03 13:30:22 +00:00
parent 67356061a3
commit b6f55cba4f
15 changed files with 622 additions and 525 deletions

View file

@ -2,6 +2,8 @@ INCLUDE(../../../cmake/macros.cmake)
#PROJECT(tgf)
ADD_SDL_INCLUDEDIR()
ADD_OSSPEC_INCLUDEDIR()
ADD_SDLIB_INCLUDEDIR(txml portability)
@ -27,6 +29,8 @@ ENDIF(CMAKE_SKIP_RPATH OR CMAKE_SKIP_BUILD_RPATH)
ADD_SDLIB_LIBRARY(tgf txml)
ADD_SDL_LIBRARY(tgf)
IF(WIN32)
SD_INSTALL_FILES(BIN TARGETS tgf)
ELSE(WIN32)

View file

@ -30,6 +30,8 @@
#include <ctime>
#include <cstring>
#include <SDL/SDL.h>
#include "tgf.h"
#include "portability.h"
@ -410,7 +412,29 @@ char * _tgf_win_strdup(const char * str)
}
#endif // WIN32
// Build a new path string compatible with current OS and usable as a command line arg.
static char* gfPathBuildCommandLineArg(const char *path)
{
#ifdef WIN32
char *osPath = (char*)malloc(strlen(path)+3);
sprintf(osPath, "\"%s", path);
if (osPath[strlen(osPath)-1] == '/')
osPath[strlen(osPath)-1] = 0; // Remove trailing '/' for command line
strcat(osPath, "\"");
#else
char *osPath = strdup(path);
#endif //WIN32
GfPathMakeOSCompatible(osPath);
return osPath;
}
/** Initialize the gaming framework.
@ingroup tgf
@return None
*/
void GfInit(void)
{
gfTraceInit();
@ -418,9 +442,112 @@ void GfInit(void)
gfModInit();
gfOsInit();
gfParamInit();
// Initialize SDL subsystems usefull for TGF.
if (SDL_Init(SDL_INIT_TIMER) < 0)
GfLogFatal("Couldn't initialize SDL(timer) (%s)\n", SDL_GetError());
}
/** Restart the gaming framework (restart the current process).
@ingroup tgf
@param sec Time to convert
@param plus String to display as the positive sign (+) for positive values of time.
@return None
@warning Never returns (retart the process).
*/
void GfRestart(bool bHardwareMouse, bool bMultiTexturing)
{
int retcode = 0;
static const int CMDSIZE = 1024;
char cmd[CMDSIZE];
char** args;
int i, nArgs;
int argInd;
// Command name.
sprintf(cmd, "%sspeed-dreams", GetBinDir());
#ifdef WIN32
strcat(cmd, ".exe");
#endif
GfPathMakeOSCompatible(cmd);
// Compute number of args.
nArgs = 1; // Executable is always the first arg.
if (bHardwareMouse)
nArgs += 1;
if (!bMultiTexturing)
nArgs += 1;
if (GetLocalDir() && strlen(GetLocalDir()))
nArgs += 2;
if (GetBinDir() && strlen(GetBinDir()))
nArgs += 2;
if (GetLibDir() && strlen(GetLibDir()))
nArgs += 2;
if (GetDataDir() && strlen(GetDataDir()))
nArgs += 2;
nArgs++; // Last arg must be a null pointer.
// Allocate args array.
args = (char**)malloc(sizeof(char*)*nArgs);
// First arg is the executable path-name.
argInd = 0;
args[argInd++] = gfPathBuildCommandLineArg(cmd);
// Then add subsequent args.
if (bHardwareMouse)
args[argInd++] = strdup("-m");
if (!bMultiTexturing)
args[argInd++] = strdup("-s");
if (GetLocalDir() && strlen(GetLocalDir()))
{
args[argInd++] = strdup("-l");
args[argInd++] = gfPathBuildCommandLineArg(GetLocalDir());
}
if (GetBinDir() && strlen(GetBinDir()))
{
args[argInd++] = strdup("-B");
args[argInd++] = gfPathBuildCommandLineArg(GetBinDir());
}
if (GetLibDir() && strlen(GetLibDir()))
{
args[argInd++] = strdup("-L");
args[argInd++] = gfPathBuildCommandLineArg(GetLibDir());
}
if (GetDataDir() && strlen(GetDataDir()))
{
args[argInd++] = strdup("-D");
args[argInd++] = gfPathBuildCommandLineArg(GetDataDir ());
}
// Finally, last null arg.
args[argInd] = 0;
// Exec the command : restart the game (simply replacing current process)
GfLogInfo("Restarting ");
for (i = 0; args[i]; i++)
GfLogInfo("%s ", args[i]);
GfLogInfo("...\n");
retcode = execvp(cmd, args);
// If successfull, we never get here ... but if failed ...
GfLogError("Failed to restart (exit code %d, %s)\n", retcode, strerror(errno));
for (i = 0; args[i]; i++)
free(args[i]);
free(args);
exit(1);
}
void gfMeanReset(tdble v, tMeanVal *pvt)
{
int i;
@ -460,7 +587,7 @@ tdble gfMean(tdble v, tMeanVal *pvt, int n, int w)
/** Convert a time in seconds (float) to an ascii string.
@ingroup screen
@ingroup tgf
@param sec Time to convert
@param plus String to display as the positive sign (+) for positive values of time.
@param zeros Flag to indicate if heading zeros are to be displayed or not.
@ -505,6 +632,23 @@ char* GfTime2Str(double sec, const char* plus, bool zeros, int prec)
return buf;
}
/** In-place convert internal file or dir path to an OS compatible path
@ingroup tgf
@param path The path to convert
@return The converted path.
*/
// In-place convert internal file or dir path to an OS compatible path
char* GfPathMakeOSCompatible(char* path)
{
#ifdef WIN32
size_t i;
for (i = 0; i < strlen(path); i++)
if (path[i] == '/')
path[i] = '\\';
#endif //WIN32
return path;
}
// Determine if a dir or file path is absolute or not.
bool GfPathIsAbsolute(const char *pszPath)
{
@ -733,21 +877,6 @@ const char* SetBinDir(const char *pszPath)
}
static int singleTextureMode = 0;
int GetSingleTextureMode (void)
{
return singleTextureMode;
}
void SetSingleTextureMode (void)
{
singleTextureMode = 1;
}
// Nearest power of 2 integer
int GfNearestPow2 (int x)
{

View file

@ -164,10 +164,12 @@ typedef struct
t3Dd M; /**< Moments */
} tForces;
/***********************************
* Gaming framework initialization *
***********************************/
/******************************
* Gaming framework managment *
******************************/
TGF_API void GfInit(void);
TGF_API void GfRestart(bool bHardwareMouse = false, bool bSingleTexturing = false);
/************************************************************************
* Memory pools *
@ -262,6 +264,7 @@ TGF_API void GfDirFreeList(tFList *list, tfDirfreeUserData freeUserData, bool fr
TGF_API bool GfPathIsAbsolute(const char *pszPath);
TGF_API char* GfPathNormalizeDir(char* pszPath, size_t nMaxPathLen);
TGF_API char* GfPathMakeOSCompatible(char* path);
/**********************************
* Interface For Parameter Files *
@ -420,6 +423,11 @@ static inline void GfLogMessage(int nLevel, const char *pszFmt, ...) {};
TGF_API double GfTimeClock(void);
TGF_API char *GfTime2Str(double sec, const char* plus="", bool zeros=true, int prec=3);
/******************
* Miscellaneous. *
******************/
TGF_API int GfNearestPow2(int x);
/* Mean values */
#define GF_MEAN_MAX_VAL 5
@ -456,13 +464,9 @@ TGF_API const char *SetDataDir(const char *pszPath);
TGF_API const char *GetBinDir();
TGF_API const char *SetBinDir(const char *pszPath);
/* MISC */
TGF_API int GetSingleTextureMode();
TGF_API void SetSingleTextureMode();
TGF_API int GfNearestPow2(int x);
/* Settings files run-time setup */
/************************************************
* User settings files run-time update/install. *
************************************************/
TGF_API void GfFileSetup();

View file

@ -14,9 +14,10 @@ ADD_PLIB_INCLUDEDIR()
SET(TGFCLIENT_SOURCES control.cpp glfeatures.cpp guibutton.cpp guifont.cpp
guiimage.cpp guimenu.cpp guiscrollbar.cpp guitexture.cpp
tgfclient.cpp gui.cpp guiedit.cpp guihelp.cpp
guilabel.cpp guiobject.cpp guiscrollist.cpp guicombobox.cpp guicheckbox.cpp guiprogresbar.cpp
screen.cpp guieventloop.cpp glfeatures.h gui.h screen_properties.h
guimenu.h tgfclient.h guifont.h )
guilabel.cpp guiobject.cpp guiscrollist.cpp
guicombobox.cpp guicheckbox.cpp guiprogresbar.cpp
guiscreen.cpp guieventloop.cpp
glfeatures.h gui.h guiscreen.h guimenu.h tgfclient.h guifont.h )
#disable developer warning
IF (COMMAND CMAKE_POLICY)
@ -71,5 +72,5 @@ ENDIF(UNIX)
SD_INSTALL_FILES(DATA config USER config FILES screen.xml)
SD_INSTALL_FILES(INCLUDE FILES glfeatures.h screen_properties.h tgfclient.h)
SD_INSTALL_FILES(INCLUDE FILES glfeatures.h guiscreen.h tgfclient.h)

View file

@ -190,6 +190,24 @@ int GfglGetUserTextureMaxSize(void)
}
/*
----------------------- Multi-texturing (anti-aliasing) support.
*/
static bool bMultiTexturingEnabled = true;
bool GfglIsMultiTexturingEnabled()
{
return bMultiTexturingEnabled;
}
void GfglEnableMultiTexturing(bool bEnable)
{
bMultiTexturingEnabled = bEnable;
}
/*
----------------------- Non-power of 2 size texture support.
*/

View file

@ -382,8 +382,6 @@ extern void gfuiScrollListPrevElt (tGfuiObject *object);
extern void gfuiReleaseImage(tGfuiObject *obj);
extern void gfuiDrawImage(tGfuiObject *obj);
extern SDL_Surface* gfScrGetScreenSurface();
#endif /* _GUI_H__ */

View file

@ -28,6 +28,7 @@ typedef struct
} tMnuCallbackInfo;
extern void gfMenuInit(void);
#endif /* __MENU__H__ */

View file

@ -1,10 +1,10 @@
/***************************************************************************
file : screen_properties.h
file : guiscreen.h
created : Sat Apr 19 23:37:41 CEST 2003
copyright : (C) 2003 by Eric Espi<EFBFBD>
copyright : (C) 2003 by Eric Espie
email : eric.espie@torcs.org
version : $Id: screen_properties.h,v 1.4 2005/02/01 15:55:55 berniw Exp $
version : $Id$
***************************************************************************/
@ -20,11 +20,14 @@
/** @file
@author <a href=mailto:torcs@free.fr>Eric Espie</a>
@version $Id: screen_properties.h,v 1.4 2005/02/01 15:55:55 berniw Exp $
@version $Id$
*/
#ifndef _SCREEN_PROPERTIES_H_
#define _SCREEN_PROPERTIES_H_
#ifndef _GUISCREEN_H_
#define _GUISCREEN_H_
#include <SDL/SDL_video.h>
#define GFSCR_CONF_FILE "config/screen.xml"
@ -83,7 +86,9 @@
#define GFSCR_ATTR_ALPHA "alpha"
#endif /* _SCREEN_PROPERTIES_H_ */
SDL_Surface* gfScrGetScreenSurface();
#endif /* _GUISCREEN_H_ */

View file

@ -17,15 +17,10 @@
***************************************************************************/
#include "gui.h"
#include "tgfclient.h"
#include "guimenu.h"
extern void gfScreenInit(void);
extern void gfMenuInit(void);
void
GfInitClient(void)
void GfInitClient(void)
{
gfuiInit();
gfMenuInit();
gfScreenInit();
}

View file

@ -22,13 +22,12 @@
@version $Id$
*/
#ifndef __TGFCLIENT__H__
#define __TGFCLIENT__H__
#include <string>
#include <vector>
#ifndef __TGFCLIENT__H__
#define __TGFCLIENT__H__
#ifdef WIN32
# include <windows.h>
//Disable some MSVC warnings
@ -47,11 +46,10 @@
# include <plib/js.h>
#endif
#include <SDL/SDL_keysym.h>
#include <SDL/SDL_video.h>
#include <tgf.h>
#include "screen_properties.h"
#include "guiscreen.h"
// DLL exported symbols declarator for Windows.
@ -77,15 +75,23 @@ TGFCLIENT_API void GfInitClient(void);
* Screen Interface *
********************/
typedef struct ScreenSize
{
int width; // Width in pixels.
int height; // Height in pixels.
} tScreenSize;
TGFCLIENT_API void GfScrInit(int argc, char *argv[]);
TGFCLIENT_API void GfScrShutdown(void);
TGFCLIENT_API void *GfScrMenuInit(void *precMenu);
TGFCLIENT_API void GfScrGetSize(int *scrW, int *scrH, int *viewW, int *viewH);
SDL_Surface* gfScrGetScreenSurface();
TGFCLIENT_API unsigned char* GfScrCaptureAsImage(int* viewW, int *viewH);
TGFCLIENT_API int GfScrCaptureAsPNG(const char *filename);
TGFCLIENT_API void GfScrReinit(void*);
TGFCLIENT_API int* GfScrGetPossibleColorDepths(int* pnDepths);
TGFCLIENT_API tScreenSize* GfScrGetPossibleSizes(int nColorDepth, bool bFullScreen, int* pnSizes);
/*****************************
* GUI interface (low-level) *
*****************************/
@ -593,6 +599,11 @@ TGFCLIENT_API void GfglUpdateUserTextureMaxSize(void);
TGFCLIENT_API bool GfglIsTextureRectangleARBAvailable(void); // In case mipmapping NOT needed.
TGFCLIENT_API bool GfglIsTextureNonPowerOf2ARBAvailable(void); // In case mipmapping needed.
// Multi-texturing support
TGFCLIENT_API bool GfglIsMultiTexturingEnabled();
TGFCLIENT_API void GfglEnableMultiTexturing(bool bEnable = true);
#endif /* __TGFCLIENT__H__ */

View file

@ -70,7 +70,7 @@ init_args(int argc, char **argv)
// -s option : Single texture mode (= disable multi-texturing)
else if (!strncmp(argv[i], "-s", 2))
{
SetSingleTextureMode ();
GfglEnableMultiTexturing(false);
}
// -m option : Allow the hardware mouse cursor
else if (!strncmp(argv[i], "-m", 2))

View file

@ -86,7 +86,7 @@ PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB = NULL;
// desc: sets up OpenGL for multitexturing support
bool InitMultiTex(void)
{
if (GetSingleTextureMode ()) {
if (!GfglIsMultiTexturingEnabled()) {
maxTextureUnits = 1;
return true;
} else {

View file

@ -53,56 +53,6 @@ init_args(int argc, char **argv)
GfInitInstallDir(argv[0]);
// Parse command line args.
#ifdef WIN32
int i = 1;
while (i < argc)
{
// -l or /l option : User settings dir (named "local dir")
if (!strncmp(argv[i], "-l", 2) || !strncmp(argv[i], "/l", 2))
{
if (++i < argc)
localdir = SetLocalDir(argv[i]);
}
// -L or /L option : Libraries dir (root dir of the tree where loadable modules are installed)
else if (!strncmp(argv[i], "-L", 2) || !strncmp(argv[i], "/L", 2))
{
if (++i < argc)
libdir = SetLibDir(argv[i]);
}
// -D or /D option : Data dir (root dir of the data tree)
else if (!strncmp(argv[i], "-D", 2) || !strncmp(argv[i], "/D", 2))
{
if (++i < argc)
datadir = SetDataDir(argv[i]);
}
// -B or /B option : Binaries dir (the dir where Speed Dreams exe and DLLs are installed)
else if (!strncmp(argv[i], "-B", 2) || !strncmp(argv[i], "/B", 2))
{
if (++i < argc)
bindir = SetBinDir(argv[i]);
}
// -s or /s option : Single texture mode (= disable multi-texturing)
else if (!strncmp(argv[i], "-s", 2) || !strncmp(argv[i], "/s", 2))
{
SetSingleTextureMode ();
}
// -m or /m option : Allow the hardware mouse cursor
else if (!strncmp(argv[i], "-m", 2) || !strncmp(argv[i], "/m", 2))
{
GfuiMouseSetHWPresent();
}
else
{
g_strMenuFile = argv[i];
}
// Next arg (even if current not recognized).
i++;
}
#else
int i = 1;
while (i < argc)
{
@ -133,7 +83,7 @@ init_args(int argc, char **argv)
// -s option : Single texture mode (= disable multi-texturing)
else if (!strncmp(argv[i], "-s", 2))
{
SetSingleTextureMode ();
GfglEnableMultiTexturing(false);
}
// -m option : Allow the hardware mouse cursor
else if (!strncmp(argv[i], "-m", 2))
@ -148,7 +98,6 @@ init_args(int argc, char **argv)
// Next arg (even if current not recognized).
i++;
}
#endif
// If any of the Speed-Dreams dirs not run-time specified / empty,
// use associated compile-time variable SD_XXDIR to get default value

View file

@ -70,7 +70,7 @@ init_args(int argc, char **argv)
// -s or /s option : Single texture mode (= disable multi-texturing)
else if (!strncmp(argv[i], "-s", 2) || !strncmp(argv[i], "/s", 2))
{
SetSingleTextureMode ();
GfglEnableMultiTexturing(false);
}
// -m or /m option : Allow the hardware mouse cursor
else if (!strncmp(argv[i], "-m", 2) || !strncmp(argv[i], "/m", 2))