aboutsummaryrefslogtreecommitdiffstats
path: root/src/native/jogl/MacOSXWindowSystemInterface.m
diff options
context:
space:
mode:
Diffstat (limited to 'src/native/jogl/MacOSXWindowSystemInterface.m')
-rw-r--r--src/native/jogl/MacOSXWindowSystemInterface.m57
1 files changed, 39 insertions, 18 deletions
diff --git a/src/native/jogl/MacOSXWindowSystemInterface.m b/src/native/jogl/MacOSXWindowSystemInterface.m
index 11188f377..0499984c3 100644
--- a/src/native/jogl/MacOSXWindowSystemInterface.m
+++ b/src/native/jogl/MacOSXWindowSystemInterface.m
@@ -6,7 +6,7 @@ typedef int Bool;
void* createContext(void* nsView, void* shareContext) {
NSView *view = nsView;
NSOpenGLContext *share = shareContext;
-
+
// FIXME: hardcoded pixel format. Instead pass these attributes down
// as arguments. There is really no way to enumerate the possible
// pixel formats for a given window on Mac OS X, so we will assume
@@ -24,16 +24,14 @@ void* createContext(void* nsView, void* shareContext) {
NSOpenGLPFAAccumSize, 0,
0
};
-
- NSRect rect = [view frame];
-
- NSOpenGLPixelFormat* fmt = [[NSOpenGLPixelFormat alloc] initWithAttributes: (NSOpenGLPixelFormatAttribute*) attribs];
-
+
+ NSOpenGLPixelFormat* fmt = [[NSOpenGLPixelFormat alloc] initWithAttributes: (NSOpenGLPixelFormatAttribute*) attribs];
+
NSOpenGLContext* context = [[NSOpenGLContext alloc] initWithFormat: [fmt autorelease] shareContext: share];
-
+
if (view != nil) {
[context setView: view];
-
+
[context makeCurrentContext];
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
[context update];
@@ -45,7 +43,7 @@ void* createContext(void* nsView, void* shareContext) {
Bool makeCurrentContext(void* nsView, void* nsContext) {
NSOpenGLContext *context = nsContext;
-
+
[context makeCurrentContext];
return true;
}
@@ -53,7 +51,7 @@ Bool makeCurrentContext(void* nsView, void* nsContext) {
Bool clearCurrentContext(void* nsView, void* nsContext) {
NSView *view = nsView;
NSOpenGLContext *context = nsContext;
-
+
[NSOpenGLContext clearCurrentContext];
return true;
}
@@ -61,13 +59,13 @@ Bool clearCurrentContext(void* nsView, void* nsContext) {
void updateContext(void* nsView, void* nsContext) {
NSView *view = nsView;
NSOpenGLContext *context = nsContext;
-
+
[context update];
}
Bool deleteContext(void* nsView, void* nsContext) {
NSOpenGLContext *context = nsContext;
-
+
[context setView: nil];
[context release];
return true;
@@ -82,14 +80,37 @@ Bool flushBuffer(void* nsView, void* nsContext) {
#include <mach-o/dyld.h>
+Bool imagesInitialized = false;
+static char libGLStr[] = "/System/Library/Frameworks/OpenGL.framework/Libraries/libGL.dylib";
+static char libGLUStr[] = "/System/Library/Frameworks/OpenGL.framework/Libraries/libGLU.dylib";
+static const struct mach_header *libGLImage;
+static const struct mach_header *libGLUImage;
void* getProcAddress(const char *procname) {
- void *funcPtr = NULL;
- static char underscoreName[256];
- strcpy(underscoreName, "_");
+ if (imagesInitialized == false) {
+ imagesInitialized = true;
+ unsigned long options = NSADDIMAGE_OPTION_RETURN_ON_ERROR;
+ libGLImage = NSAddImage(libGLStr, options);
+ libGLUImage = NSAddImage(libGLUStr, options);
+ }
+
+ unsigned long options = NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR;
+ char underscoreName[512] = "_";
strcat(underscoreName, procname);
- if (NSIsSymbolNameDefined(underscoreName)) {
+
+ if (NSIsSymbolNameDefinedInImage(libGLImage, underscoreName) == YES) {
+ NSSymbol sym = NSLookupSymbolInImage(libGLImage, underscoreName, options);
+ return NSAddressOfSymbol(sym);
+ }
+
+ if (NSIsSymbolNameDefinedInImage(libGLUImage, underscoreName) == YES) {
+ NSSymbol sym = NSLookupSymbolInImage(libGLUImage, underscoreName, options);
+ return NSAddressOfSymbol(sym);
+ }
+
+ if (NSIsSymbolNameDefinedWithHint(underscoreName, "GL")) {
NSSymbol sym = NSLookupAndBindSymbol(underscoreName);
- funcPtr = (void *)NSAddressOfSymbol(sym);
+ return NSAddressOfSymbol(sym);
}
- return funcPtr;
+
+ return NULL;
}