Implementing Jocelyn Frechot's changes -- see e-mail of Thursday, 11/8/2007 9:12 AM.

git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@735 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
fayjf 2007-11-12 04:06:19 +00:00
parent afd73e99d6
commit 7f75464b6f
7 changed files with 144 additions and 21 deletions

View File

@ -73,11 +73,14 @@
* Only one GLUT_AUXn bit may be used at a time. * Only one GLUT_AUXn bit may be used at a time.
* Value 0x0400 is defined in OpenGLUT. * Value 0x0400 is defined in OpenGLUT.
*/ */
#define GLUT_AUX 0x1000
#define GLUT_AUX1 0x1000 #define GLUT_AUX1 0x1000
#define GLUT_AUX2 0x2000 #define GLUT_AUX2 0x2000
#define GLUT_AUX3 0x4000 #define GLUT_AUX3 0x4000
#define GLUT_AUX4 0x8000 #define GLUT_AUX4 0x8000
/* /*
* Process loop function, see freeglut_main.c * Process loop function, see freeglut_main.c
*/ */
@ -98,6 +101,7 @@ FGAPI void FGAPIENTRY glutMenuDestroyFunc( void (* callback)( void ) );
* State setting and retrieval functions, see freeglut_state.c * State setting and retrieval functions, see freeglut_state.c
*/ */
FGAPI void FGAPIENTRY glutSetOption ( GLenum option_flag, int value ); FGAPI void FGAPIENTRY glutSetOption ( GLenum option_flag, int value );
FGAPI int * FGAPIENTRY glutGetModeValues(GLenum mode, int * size);
/* A.Donev: User-data manipulation */ /* A.Donev: User-data manipulation */
FGAPI void* FGAPIENTRY glutGetWindowData( void ); FGAPI void* FGAPIENTRY glutGetWindowData( void );
FGAPI void FGAPIENTRY glutSetWindowData(void* data); FGAPI void FGAPIENTRY glutSetWindowData(void* data);

View File

@ -161,6 +161,7 @@ static GLUTproc fghGetProcAddress( const char* procName )
CHECK_NAME(glutWMCloseFunc); CHECK_NAME(glutWMCloseFunc);
CHECK_NAME(glutMenuDestroyFunc); CHECK_NAME(glutMenuDestroyFunc);
CHECK_NAME(glutSetOption); CHECK_NAME(glutSetOption);
CHECK_NAME(glutGetModeValues);
CHECK_NAME(glutSetWindowData); CHECK_NAME(glutSetWindowData);
CHECK_NAME(glutGetWindowData); CHECK_NAME(glutGetWindowData);
CHECK_NAME(glutSetMenuData); CHECK_NAME(glutSetMenuData);

View File

@ -79,7 +79,9 @@ SFG_State fgState = { { -1, -1, GL_FALSE }, /* Position */
GLUT_EXEC_STATE_INIT, /* ExecState */ GLUT_EXEC_STATE_INIT, /* ExecState */
NULL, /* ProgramName */ NULL, /* ProgramName */
GL_FALSE, /* JoysticksInitialised */ GL_FALSE, /* JoysticksInitialised */
GL_FALSE /* InputDevsInitialised */ GL_FALSE, /* InputDevsInitialised */
0, /* AuxiliaryBufferNumber */
0 /* SampleNumber */
}; };
@ -893,7 +895,7 @@ void FGAPIENTRY glutInitDisplayString( const char* displayMode )
break ; break ;
case 36 : /* "aux": some number of aux buffers */ case 36 : /* "aux": some number of aux buffers */
glut_state_flag |= GLUT_AUX1; glut_state_flag |= GLUT_AUX;
break ; break ;
case 37 : /* Unrecognized */ case 37 : /* Unrecognized */

View File

@ -302,6 +302,9 @@ struct tagSFG_State
char *ProgramName; /* Name of the invoking program */ char *ProgramName; /* Name of the invoking program */
GLboolean JoysticksInitialised; /* Only initialize if application calls for them */ GLboolean JoysticksInitialised; /* Only initialize if application calls for them */
GLboolean InputDevsInitialised; /* Only initialize if application calls for them */ GLboolean InputDevsInitialised; /* Only initialize if application calls for them */
int AuxiliaryBufferNumber; /* Number of auxiliary buffers */
int SampleNumber; /* Number of samples per pixel */
}; };
/* The structure used by display initialization in freeglut_init.c */ /* The structure used by display initialization in freeglut_init.c */

View File

@ -116,6 +116,14 @@ void FGAPIENTRY glutSetOption( GLenum eWhat, int value )
fgStructure.CurrentWindow->State.Cursor = value; fgStructure.CurrentWindow->State.Cursor = value;
break; break;
case GLUT_AUX:
fgState.AuxiliaryBufferNumber = value;
break;
case GLUT_MULTISAMPLE:
fgState.SampleNumber = value;
break;
default: default:
fgWarning( "glutSetOption(): missing enum handle %d", eWhat ); fgWarning( "glutSetOption(): missing enum handle %d", eWhat );
break; break;
@ -720,4 +728,114 @@ int FGAPIENTRY glutLayerGet( GLenum eWhat )
return -1; return -1;
} }
int * FGAPIENTRY glutGetModeValues(GLenum eWhat, int * size)
{
int * array;
#if TARGET_HOST_POSIX_X11
int attributes[9];
GLXFBConfig * fbconfigArray; /* Array of FBConfigs */
int fbconfigArraySize; /* Number of FBConfigs in the array */
int attribute_name = 0;
#endif
FREEGLUT_EXIT_IF_NOT_INITIALISED("glutGetModeValues");
array = NULL;
*size = 0;
switch (eWhat)
{
#if TARGET_HOST_POSIX_X11
case GLUT_AUX:
case GLUT_MULTISAMPLE:
attributes[0] = GLX_BUFFER_SIZE;
attributes[1] = GLX_DONT_CARE;
switch (eWhat)
{
case GLUT_AUX:
/*
FBConfigs are now sorted by increasing number of auxiliary
buffers. We want at least one buffer.
*/
attributes[2] = GLX_AUX_BUFFERS;
attributes[3] = 1;
attributes[4] = None;
attribute_name = GLX_AUX_BUFFERS;
break;
case GLUT_MULTISAMPLE:
attributes[2] = GLX_AUX_BUFFERS;
attributes[3] = GLX_DONT_CARE;
attributes[4] = GLX_SAMPLE_BUFFERS;
attributes[5] = 1;
/*
FBConfigs are now sorted by increasing number of samples per
pixel. We want at least one sample.
*/
attributes[6] = GLX_SAMPLES;
attributes[7] = 1;
attributes[8] = None;
attribute_name = GLX_SAMPLES;
break;
}
fbconfigArray = glXChooseFBConfig(fgDisplay.Display,
fgDisplay.Screen,
attributes,
&fbconfigArraySize);
if (fbconfigArray != NULL)
{
int * temp_array;
int result; /* Returned by glXGetFBConfigAttrib. Not checked. */
int previous_value;
int i;
temp_array = malloc(sizeof(int) * fbconfigArraySize);
previous_value = 0;
for (i = 0; i < fbconfigArraySize; i++)
{
int value;
result = glXGetFBConfigAttrib(fgDisplay.Display,
fbconfigArray[i],
attribute_name,
&value);
if (value > previous_value)
{
temp_array[*size] = value;
previous_value = value;
(*size)++;
}
}
array = malloc(sizeof(int) * (*size));
for (i = 0; i < *size; i++)
{
array[i] = temp_array[i];
}
free(temp_array);
XFree(fbconfigArray);
}
break;
#endif
default:
break;
}
return array;
}
/*** END OF FILE ***/ /*** END OF FILE ***/

View File

@ -219,12 +219,6 @@ void fgDestroyWindow( SFG_Window* window )
fghClearCallBacks( window ); fghClearCallBacks( window );
fgCloseWindow( window ); fgCloseWindow( window );
#if TARGET_HOST_UNIX_X11
if (window->Window.FBConfig != NULL)
{
XFree( window->Window.FBConfig );
}
#endif
free( window ); free( window );
if( fgStructure.CurrentWindow == window ) if( fgStructure.CurrentWindow == window )
fgStructure.CurrentWindow = NULL; fgStructure.CurrentWindow = NULL;

View File

@ -128,19 +128,20 @@ GLXFBConfig* fgChooseFBConfig( void )
ATTRIB_VAL( GLX_ACCUM_ALPHA_SIZE, 1 ); ATTRIB_VAL( GLX_ACCUM_ALPHA_SIZE, 1 );
} }
if( fgState.DisplayMode & GLUT_AUX1 ) if ((fgState.DisplayMode & GLUT_AUX)
ATTRIB_VAL( GLX_AUX_BUFFERS, 1 ); || (fgState.DisplayMode & GLUT_AUX1)
if( fgState.DisplayMode & GLUT_AUX2 ) || (fgState.DisplayMode & GLUT_AUX2)
ATTRIB_VAL( GLX_AUX_BUFFERS, 2 ); || (fgState.DisplayMode & GLUT_AUX3)
if( fgState.DisplayMode & GLUT_AUX3 ) || (fgState.DisplayMode & GLUT_AUX4))
ATTRIB_VAL( GLX_AUX_BUFFERS, 3 );
if( fgState.DisplayMode & GLUT_AUX4 )
ATTRIB_VAL( GLX_AUX_BUFFERS, 4 );
if ( fgState.DisplayMode & GLUT_MULTISAMPLE )
{ {
ATTRIB_VAL( GLX_SAMPLE_BUFFERS, 1 ); ATTRIB_VAL(GLX_AUX_BUFFERS, fgState.AuxiliaryBufferNumber)
} }
if (fgState.DisplayMode & GLUT_MULTISAMPLE)
{
ATTRIB_VAL(GLX_SAMPLE_BUFFERS, 1)
ATTRIB_VAL(GLX_SAMPLES, fgState.SampleNumber)
}
/* Push a null at the end of the list */ /* Push a null at the end of the list */
ATTRIB( None ); ATTRIB( None );
@ -896,7 +897,7 @@ void fgCloseWindow( SFG_Window* window )
glXDestroyContext( fgDisplay.Display, window->Window.Context ); glXDestroyContext( fgDisplay.Display, window->Window.Context );
XFree( window->Window.FBConfig ); XFree( window->Window.FBConfig );
XDestroyWindow( fgDisplay.Display, window->Window.Handle ); XDestroyWindow( fgDisplay.Display, window->Window.Handle );
XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */ /* XFlush( fgDisplay.Display ); */ /* XXX Shouldn't need this */
#elif TARGET_HOST_MS_WINDOWS #elif TARGET_HOST_MS_WINDOWS