diff options
Diffstat (limited to 'src/native')
-rw-r--r-- | src/native/jogl/MacOSXWindowSystemInterface.m | 57 |
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; } |