X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_ext.c;h=972ae783034c4afb73ff3e29830d60f62152046f;hb=e9ebb8053106d2504605c70a1fd777a52f1d9da4;hp=5b2ca928b14cdd515232fb03afd2f34b2d0829ec;hpb=7c1f2d267626b937acdb59e18c0e22fabbc6d339;p=freeglut diff --git a/src/freeglut_ext.c b/src/freeglut_ext.c index 5b2ca92..972ae78 100644 --- a/src/freeglut_ext.c +++ b/src/freeglut_ext.c @@ -25,175 +25,202 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "../include/GL/freeglut.h" +#define GLX_GLXEXT_PROTOTYPES +#include #include "freeglut_internal.h" - -struct name_address_pair +static GLUTproc fghGetGLUTProcAddress( const char* procName ) { - const char *name; - void *address; -}; + /* optimization: quick initial check */ + if( strncmp( procName, "glut", 4 ) != 0 ) + return NULL; -static struct name_address_pair glut_functions[] = -{ - { "glutInit", (void *) glutInit }, - { "glutInitDisplayMode", (void *) glutInitDisplayMode }, - { "glutInitDisplayString", (void *) glutInitDisplayString }, - { "glutInitWindowPosition", (void *) glutInitWindowPosition }, - { "glutInitWindowSize", (void *) glutInitWindowSize }, - { "glutMainLoop", (void *) glutMainLoop }, - { "glutCreateWindow", (void *) glutCreateWindow }, - { "glutCreateSubWindow", (void *) glutCreateSubWindow }, - { "glutDestroyWindow", (void *) glutDestroyWindow }, - { "glutPostRedisplay", (void *) glutPostRedisplay }, - { "glutPostWindowRedisplay", (void *) glutPostWindowRedisplay }, - { "glutSwapBuffers", (void *) glutSwapBuffers }, - { "glutGetWindow", (void *) glutGetWindow }, - { "glutSetWindow", (void *) glutSetWindow }, - { "glutSetWindowTitle", (void *) glutSetWindowTitle }, - { "glutSetIconTitle", (void *) glutSetIconTitle }, - { "glutPositionWindow", (void *) glutPositionWindow }, - { "glutReshapeWindow", (void *) glutReshapeWindow }, - { "glutPopWindow", (void *) glutPopWindow }, - { "glutPushWindow", (void *) glutPushWindow }, - { "glutIconifyWindow", (void *) glutIconifyWindow }, - { "glutShowWindow", (void *) glutShowWindow }, - { "glutHideWindow", (void *) glutHideWindow }, - { "glutFullScreen", (void *) glutFullScreen }, - { "glutSetCursor", (void *) glutSetCursor }, - { "glutWarpPointer", (void *) glutWarpPointer }, - { "glutEstablishOverlay", (void *) glutEstablishOverlay }, - { "glutRemoveOverlay", (void *) glutRemoveOverlay }, - { "glutUseLayer", (void *) glutUseLayer }, - { "glutPostOverlayRedisplay", (void *) glutPostOverlayRedisplay }, - { "glutPostWindowOverlayRedisplay", (void *) glutPostWindowOverlayRedisplay }, - { "glutShowOverlay", (void *) glutShowOverlay }, - { "glutHideOverlay", (void *) glutHideOverlay }, - { "glutCreateMenu", (void *) glutCreateMenu }, - { "glutDestroyMenu", (void *) glutDestroyMenu }, - { "glutGetMenu", (void *) glutGetMenu }, - { "glutSetMenu", (void *) glutSetMenu }, - { "glutAddMenuEntry", (void *) glutAddMenuEntry }, - { "glutAddSubMenu", (void *) glutAddSubMenu }, - { "glutChangeToMenuEntry", (void *) glutChangeToMenuEntry }, - { "glutChangeToSubMenu", (void *) glutChangeToSubMenu }, - { "glutRemoveMenuItem", (void *) glutRemoveMenuItem }, - { "glutAttachMenu", (void *) glutAttachMenu }, - { "glutDetachMenu", (void *) glutDetachMenu }, - { "glutDisplayFunc", (void *) glutDisplayFunc }, - { "glutReshapeFunc", (void *) glutReshapeFunc }, - { "glutKeyboardFunc", (void *) glutKeyboardFunc }, - { "glutMouseFunc", (void *) glutMouseFunc }, - { "glutMotionFunc", (void *) glutMotionFunc }, - { "glutPassiveMotionFunc", (void *) glutPassiveMotionFunc }, - { "glutEntryFunc", (void *) glutEntryFunc }, - { "glutVisibilityFunc", (void *) glutVisibilityFunc }, - { "glutIdleFunc", (void *) glutIdleFunc }, - { "glutTimerFunc", (void *) glutTimerFunc }, - { "glutMenuStateFunc", (void *) glutMenuStateFunc }, - { "glutSpecialFunc", (void *) glutSpecialFunc }, - { "glutSpaceballMotionFunc", (void *) glutSpaceballMotionFunc }, - { "glutSpaceballRotateFunc", (void *) glutSpaceballRotateFunc }, - { "glutSpaceballButtonFunc", (void *) glutSpaceballButtonFunc }, - { "glutButtonBoxFunc", (void *) glutButtonBoxFunc }, - { "glutDialsFunc", (void *) glutDialsFunc }, - { "glutTabletMotionFunc", (void *) glutTabletMotionFunc }, - { "glutTabletButtonFunc", (void *) glutTabletButtonFunc }, - { "glutMenuStatusFunc", (void *) glutMenuStatusFunc }, - { "glutOverlayDisplayFunc", (void *) glutOverlayDisplayFunc }, - { "glutWindowStatusFunc", (void *) glutWindowStatusFunc }, - { "glutKeyboardUpFunc", (void *) glutKeyboardUpFunc }, - { "glutSpecialUpFunc", (void *) glutSpecialUpFunc }, - { "glutJoystickFunc", (void *) glutJoystickFunc }, - { "glutSetColor", (void *) glutSetColor }, - { "glutGetColor", (void *) glutGetColor }, - { "glutCopyColormap", (void *) glutCopyColormap }, - { "glutGet", (void *) glutGet }, - { "glutDeviceGet", (void *) glutDeviceGet }, - { "glutExtensionSupported", (void *) glutExtensionSupported }, - { "glutGetModifiers", (void *) glutGetModifiers }, - { "glutLayerGet", (void *) glutLayerGet }, - { "glutBitmapCharacter", (void *) glutBitmapCharacter }, - { "glutBitmapWidth", (void *) glutBitmapWidth }, - { "glutStrokeCharacter", (void *) glutStrokeCharacter }, - { "glutStrokeWidth", (void *) glutStrokeWidth }, - { "glutBitmapLength", (void *) glutBitmapLength }, - { "glutStrokeLength", (void *) glutStrokeLength }, - { "glutWireSphere", (void *) glutWireSphere }, - { "glutSolidSphere", (void *) glutSolidSphere }, - { "glutWireCone", (void *) glutWireCone }, - { "glutSolidCone", (void *) glutSolidCone }, - { "glutWireCube", (void *) glutWireCube }, - { "glutSolidCube", (void *) glutSolidCube }, - { "glutWireTorus", (void *) glutWireTorus }, - { "glutSolidTorus", (void *) glutSolidTorus }, - { "glutWireDodecahedron", (void *) glutWireDodecahedron }, - { "glutSolidDodecahedron", (void *) glutSolidDodecahedron }, - { "glutWireTeapot", (void *) glutWireTeapot }, - { "glutSolidTeapot", (void *) glutSolidTeapot }, - { "glutWireOctahedron", (void *) glutWireOctahedron }, - { "glutSolidOctahedron", (void *) glutSolidOctahedron }, - { "glutWireTetrahedron", (void *) glutWireTetrahedron }, - { "glutSolidTetrahedron", (void *) glutSolidTetrahedron }, - { "glutWireIcosahedron", (void *) glutWireIcosahedron }, - { "glutSolidIcosahedron", (void *) glutSolidIcosahedron }, - { "glutVideoResizeGet", (void *) glutVideoResizeGet }, - { "glutSetupVideoResizing", (void *) glutSetupVideoResizing }, - { "glutStopVideoResizing", (void *) glutStopVideoResizing }, - { "glutVideoResize", (void *) glutVideoResize }, - { "glutVideoPan", (void *) glutVideoPan }, - { "glutReportErrors", (void *) glutReportErrors }, - { "glutIgnoreKeyRepeat", (void *) glutIgnoreKeyRepeat }, - { "glutSetKeyRepeat", (void *) glutSetKeyRepeat }, - { "glutForceJoystickFunc", (void *) glutForceJoystickFunc }, - { "glutGameModeString", (void *) glutGameModeString }, - { "glutEnterGameMode", (void *) glutEnterGameMode }, - { "glutLeaveGameMode", (void *) glutLeaveGameMode }, - { "glutGameModeGet", (void *) glutGameModeGet }, - /* freeglut extensions */ - { "glutMainLoopEvent", (void *) glutMainLoopEvent }, - { "glutLeaveMainLoop", (void *) glutLeaveMainLoop }, - { "glutCloseFunc", (void *) glutCloseFunc }, - { "glutWMCloseFunc", (void *) glutWMCloseFunc }, - { "glutMenuDestroyFunc", (void *) glutMenuDestroyFunc }, - { "glutSetOption", (void *) glutSetOption }, - { "glutSetWindowData", (void *) glutSetWindowData }, - { "glutGetWindowData", (void *) glutGetWindowData }, - { "glutSetMenuData", (void *) glutSetMenuData }, - { "glutGetMenuData", (void *) glutGetMenuData }, - { "glutBitmapHeight", (void *) glutBitmapHeight }, - { "glutStrokeHeight", (void *) glutStrokeHeight }, - { "glutBitmapString", (void *) glutBitmapString }, - { "glutStrokeString", (void *) glutStrokeString }, - { "glutWireRhombicDodecahedron", (void *) glutWireRhombicDodecahedron }, - { "glutSolidRhombicDodecahedron", (void *) glutSolidRhombicDodecahedron }, - { "glutWireSierpinskiSponge ", (void *) glutWireSierpinskiSponge }, - { "glutSolidSierpinskiSponge ", (void *) glutSolidSierpinskiSponge }, - { "glutGetProcAddress", (void *) glutGetProcAddress }, - { "glutMouseWheelFunc", (void *) glutMouseWheelFunc }, - { NULL, NULL } -}; +#define CHECK_NAME(x) if( strcmp( procName, #x ) == 0) return (GLUTproc)x; + CHECK_NAME(glutInit); + CHECK_NAME(glutInitDisplayMode); + CHECK_NAME(glutInitDisplayString); + CHECK_NAME(glutInitWindowPosition); + CHECK_NAME(glutInitWindowSize); + CHECK_NAME(glutMainLoop); + CHECK_NAME(glutExit); + CHECK_NAME(glutCreateWindow); + CHECK_NAME(glutCreateSubWindow); + CHECK_NAME(glutDestroyWindow); + CHECK_NAME(glutPostRedisplay); + CHECK_NAME(glutPostWindowRedisplay); + CHECK_NAME(glutSwapBuffers); + CHECK_NAME(glutGetWindow); + CHECK_NAME(glutSetWindow); + CHECK_NAME(glutSetWindowTitle); + CHECK_NAME(glutSetIconTitle); + CHECK_NAME(glutPositionWindow); + CHECK_NAME(glutReshapeWindow); + CHECK_NAME(glutPopWindow); + CHECK_NAME(glutPushWindow); + CHECK_NAME(glutIconifyWindow); + CHECK_NAME(glutShowWindow); + CHECK_NAME(glutHideWindow); + CHECK_NAME(glutFullScreen); + CHECK_NAME(glutSetCursor); + CHECK_NAME(glutWarpPointer); + CHECK_NAME(glutEstablishOverlay); + CHECK_NAME(glutRemoveOverlay); + CHECK_NAME(glutUseLayer); + CHECK_NAME(glutPostOverlayRedisplay); + CHECK_NAME(glutPostWindowOverlayRedisplay); + CHECK_NAME(glutShowOverlay); + CHECK_NAME(glutHideOverlay); + CHECK_NAME(glutCreateMenu); + CHECK_NAME(glutDestroyMenu); + CHECK_NAME(glutGetMenu); + CHECK_NAME(glutSetMenu); + CHECK_NAME(glutAddMenuEntry); + CHECK_NAME(glutAddSubMenu); + CHECK_NAME(glutChangeToMenuEntry); + CHECK_NAME(glutChangeToSubMenu); + CHECK_NAME(glutRemoveMenuItem); + CHECK_NAME(glutAttachMenu); + CHECK_NAME(glutDetachMenu); + CHECK_NAME(glutDisplayFunc); + CHECK_NAME(glutReshapeFunc); + CHECK_NAME(glutKeyboardFunc); + CHECK_NAME(glutMouseFunc); + CHECK_NAME(glutMotionFunc); + CHECK_NAME(glutPassiveMotionFunc); + CHECK_NAME(glutEntryFunc); + CHECK_NAME(glutVisibilityFunc); + CHECK_NAME(glutIdleFunc); + CHECK_NAME(glutTimerFunc); + CHECK_NAME(glutMenuStateFunc); + CHECK_NAME(glutSpecialFunc); + CHECK_NAME(glutSpaceballMotionFunc); + CHECK_NAME(glutSpaceballRotateFunc); + CHECK_NAME(glutSpaceballButtonFunc); + CHECK_NAME(glutButtonBoxFunc); + CHECK_NAME(glutDialsFunc); + CHECK_NAME(glutTabletMotionFunc); + CHECK_NAME(glutTabletButtonFunc); + CHECK_NAME(glutMenuStatusFunc); + CHECK_NAME(glutOverlayDisplayFunc); + CHECK_NAME(glutWindowStatusFunc); + CHECK_NAME(glutKeyboardUpFunc); + CHECK_NAME(glutSpecialUpFunc); +#if !defined(_WIN32_WCE) + CHECK_NAME(glutJoystickFunc); +#endif /* !defined(_WIN32_WCE) */ + CHECK_NAME(glutSetColor); + CHECK_NAME(glutGetColor); + CHECK_NAME(glutCopyColormap); + CHECK_NAME(glutGet); + CHECK_NAME(glutDeviceGet); + CHECK_NAME(glutExtensionSupported); + CHECK_NAME(glutGetModifiers); + CHECK_NAME(glutLayerGet); + CHECK_NAME(glutBitmapCharacter); + CHECK_NAME(glutBitmapWidth); + CHECK_NAME(glutStrokeCharacter); + CHECK_NAME(glutStrokeWidth); + CHECK_NAME(glutBitmapLength); + CHECK_NAME(glutStrokeLength); + CHECK_NAME(glutWireSphere); + CHECK_NAME(glutSolidSphere); + CHECK_NAME(glutWireCone); + CHECK_NAME(glutSolidCone); + CHECK_NAME(glutWireCube); + CHECK_NAME(glutSolidCube); + CHECK_NAME(glutWireTorus); + CHECK_NAME(glutSolidTorus); + CHECK_NAME(glutWireDodecahedron); + CHECK_NAME(glutSolidDodecahedron); + CHECK_NAME(glutWireTeapot); + CHECK_NAME(glutSolidTeapot); + CHECK_NAME(glutWireOctahedron); + CHECK_NAME(glutSolidOctahedron); + CHECK_NAME(glutWireTetrahedron); + CHECK_NAME(glutSolidTetrahedron); + CHECK_NAME(glutWireIcosahedron); + CHECK_NAME(glutSolidIcosahedron); + CHECK_NAME(glutVideoResizeGet); + CHECK_NAME(glutSetupVideoResizing); + CHECK_NAME(glutStopVideoResizing); + CHECK_NAME(glutVideoResize); + CHECK_NAME(glutVideoPan); + CHECK_NAME(glutReportErrors); + CHECK_NAME(glutIgnoreKeyRepeat); + CHECK_NAME(glutSetKeyRepeat); +#if !defined(_WIN32_WCE) + CHECK_NAME(glutForceJoystickFunc); + CHECK_NAME(glutGameModeString); + CHECK_NAME(glutEnterGameMode); + CHECK_NAME(glutLeaveGameMode); + CHECK_NAME(glutGameModeGet); +#endif /* !defined(_WIN32_WCE) */ + /* freeglut extensions */ + CHECK_NAME(glutMainLoopEvent); + CHECK_NAME(glutLeaveMainLoop); + CHECK_NAME(glutCloseFunc); + CHECK_NAME(glutWMCloseFunc); + CHECK_NAME(glutMenuDestroyFunc); + CHECK_NAME(glutFullScreenToggle); + CHECK_NAME(glutSetOption); + CHECK_NAME(glutGetModeValues); + CHECK_NAME(glutSetWindowData); + CHECK_NAME(glutGetWindowData); + CHECK_NAME(glutSetMenuData); + CHECK_NAME(glutGetMenuData); + CHECK_NAME(glutBitmapHeight); + CHECK_NAME(glutStrokeHeight); + CHECK_NAME(glutBitmapString); + CHECK_NAME(glutStrokeString); + CHECK_NAME(glutWireRhombicDodecahedron); + CHECK_NAME(glutSolidRhombicDodecahedron); + CHECK_NAME(glutWireSierpinskiSponge); + CHECK_NAME(glutSolidSierpinskiSponge); + CHECK_NAME(glutWireCylinder); + CHECK_NAME(glutSolidCylinder); + CHECK_NAME(glutGetProcAddress); + CHECK_NAME(glutMouseWheelFunc); + CHECK_NAME(glutJoystickGetNumAxes); + CHECK_NAME(glutJoystickGetNumButtons); + CHECK_NAME(glutJoystickNotWorking); + CHECK_NAME(glutJoystickGetDeadBand); + CHECK_NAME(glutJoystickSetDeadBand); + CHECK_NAME(glutJoystickGetSaturation); + CHECK_NAME(glutJoystickSetSaturation); + CHECK_NAME(glutJoystickSetMinRange); + CHECK_NAME(glutJoystickSetMaxRange); + CHECK_NAME(glutJoystickSetCenter); + CHECK_NAME(glutJoystickGetMinRange); + CHECK_NAME(glutJoystickGetMaxRange); + CHECK_NAME(glutJoystickGetCenter); + CHECK_NAME(glutInitContextVersion); + CHECK_NAME(glutInitContextFlags); + CHECK_NAME(glutInitContextProfile); +#undef CHECK_NAME + return NULL; +} -void *FGAPIENTRY glutGetProcAddress( const char *procName ) -{ - /* Try GLUT functions first */ - int i; - for( i = 0; glut_functions[ i ].name; i++ ) - if( strcmp( glut_functions[ i ].name, procName ) == 0) - return glut_functions[ i ].address; - /* Try core GL functions */ -#if TARGET_HOST_WIN32 - return( void * )wglGetProcAddress( ( LPCSTR )procName ); -#elif TARGET_HOST_UNIX_X11 && defined( GLX_ARB_get_proc_address ) - return(void * )glXGetProcAddressARB( ( const GLubyte * )procName ); +SFG_Proc fghGetProcAddress( const char *procName ) +{ +#if TARGET_HOST_MS_WINDOWS + return (SFG_Proc)wglGetProcAddress( ( LPCSTR )procName ); +#elif TARGET_HOST_POSIX_X11 && defined( GLX_ARB_get_proc_address ) + return (SFG_Proc)glXGetProcAddressARB( ( const GLubyte * )procName ); #else return NULL; #endif } + + +GLUTproc FGAPIENTRY +glutGetProcAddress( const char *procName ) +{ + GLUTproc p; + FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGetProcAddress" ); + + /* Try GLUT functions first, then core GL functions */ + p = fghGetGLUTProcAddress( procName ); + return ( p != NULL ) ? p : fghGetProcAddress( procName ); +}