]> git.mxchange.org Git - simgear.git/blob - simgear/screen/extensions.cxx
491618123389babf8000d7915c1c12ff01298769
[simgear.git] / simgear / screen / extensions.cxx
1 /*
2  *
3  * Copyright (c) 2001 César Blecua Udías    All Rights Reserved.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included
13  * in all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18  * CESAR BLECUA UDIAS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
19  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
20  * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21  * SOFTWARE.
22  *
23  */
24
25 #include <string.h>
26
27 #include "extensions.hxx"
28 #include <simgear/debug/logstream.hxx>
29 #if !defined(WIN32) && !defined( GLX_VERSION_1_4 )
30 #  include <dlfcn.h>
31 #endif
32
33 bool SGSearchExtensionsString(const char *extString, const char *extName) {
34     // Returns GL_TRUE if the *extName string appears in the *extString string,
35     // surrounded by white spaces, or GL_FALSE otherwise.
36
37     const char *p, *end;
38     int n, extNameLen;
39
40     if ((extString == NULL) || (extName == NULL))
41         return false;
42
43     extNameLen = strlen(extName);
44
45     p=extString;
46     end = p + strlen(p);
47
48     while (p < end) {
49         n = strcspn(p, " ");
50         if ((extNameLen == n) && (strncmp(extName, p, n) == 0))
51             return GL_TRUE;
52
53         p += (n + 1);
54     }
55
56     return GL_FALSE;
57 }
58
59 bool SGIsOpenGLExtensionSupported(char *extName) {
60    // Returns GL_TRUE if the OpenGL Extension whose name is *extName
61    // is supported by the system, or GL_FALSE otherwise.
62    //
63    // The *extName string must follow the OpenGL extensions naming scheme
64    // (ie: "GL_type_extension", like GL_EXT_convolution)
65
66     return SGSearchExtensionsString((const char *)glGetString(GL_EXTENSIONS),extName);
67 }
68
69 #ifdef __APPLE__
70
71 #include <CoreFoundation/CoreFoundation.h>
72
73 void* macosxGetGLProcAddress(const char *func) {
74
75   /* We may want to cache the bundleRef at some point */
76   static CFBundleRef bundle = 0;
77
78   if (!bundle) {
79
80     CFURLRef bundleURL = CFURLCreateWithFileSystemPath (kCFAllocatorDefault,
81                                                         CFSTR("/System/Library/Frameworks/OpenGL.framework"), kCFURLPOSIXPathStyle, true);
82
83     bundle = CFBundleCreate (kCFAllocatorDefault, bundleURL);
84     CFRelease (bundleURL);
85   }
86
87   if (!bundle)
88     return 0;
89
90   CFStringRef functionName = CFStringCreateWithCString
91     (kCFAllocatorDefault, func, kCFStringEncodingASCII);
92   
93   void *function;
94   
95   function = CFBundleGetFunctionPointerForName (bundle, functionName);
96
97   CFRelease (functionName);
98
99   return function;
100 }
101
102 #elif !defined( WIN32 ) && !defined(GLX_VERSION_1_4)
103
104 void *SGGetGLProcAddress(const char *func) {
105     static void *libHandle = NULL;
106     void *fptr = NULL;
107
108     /*
109      * Clear the error buffer
110      */
111     dlerror();
112
113     /*
114      * Since libGL must be linked to the binary we run on, this is the
115      * right handle. That 'current binary' handle also avoids conflicts which
116      * arise from linking with a different libGL at link time an than later
117      * use the standard libGL at runtime ...
118      */
119     if (libHandle == NULL)
120         libHandle = dlopen(NULL, RTLD_LAZY);
121
122     if (libHandle != NULL) {
123         fptr = dlsym(libHandle, func);
124
125 #if defined (__FreeBSD__)
126         const char *error = dlerror();
127 #else
128         char *error = dlerror();
129 #endif
130         if (error)
131             SG_LOG(SG_GENERAL, SG_INFO, error);
132     }
133
134     return fptr;
135 }
136
137 #endif
138