| """Windows-specific platform features""" |
| import ctypes |
| import platform |
| from OpenGL.platform import ctypesloader, baseplatform |
| import sys |
|
|
| if sys.hexversion < 0x2070000: |
| vc = 'vc7' |
| |
| else: |
| vc = 'vc9' |
|
|
| def _size(): |
| return platform.architecture()[0].strip( 'bits' ) |
| size = _size() |
|
|
| class Win32Platform( baseplatform.BasePlatform ): |
| """Win32-specific platform implementation""" |
|
|
| GLUT_GUARD_CALLBACKS = True |
| @baseplatform.lazy_property |
| def GL(self): |
| try: |
| return ctypesloader.loadLibrary( |
| ctypes.windll, 'opengl32', mode = ctypes.RTLD_GLOBAL |
| ) |
| except OSError as err: |
| raise ImportError("Unable to load OpenGL library", *err.args) |
| @baseplatform.lazy_property |
| def GLU(self): |
| try: |
| return ctypesloader.loadLibrary( |
| ctypes.windll, 'glu32', mode = ctypes.RTLD_GLOBAL |
| ) |
| except OSError as err: |
| return None |
| @baseplatform.lazy_property |
| def GLUT( self ): |
| for possible in ('freeglut%s'%(size,),'freeglut', 'glut%s'%(size,)): |
| |
| |
| try: |
| return ctypesloader.loadLibrary( |
| ctypes.windll, possible, mode = ctypes.RTLD_GLOBAL |
| ) |
| except WindowsError as err: |
| pass |
| return None |
| @baseplatform.lazy_property |
| def GLE( self ): |
| for libName in ('opengle%s.%s'%(size,vc,),'gle%s'%(size,)): |
| try: |
| GLE = ctypesloader.loadLibrary( ctypes.cdll, libName ) |
| GLE.FunctionType = ctypes.CFUNCTYPE |
| return GLE |
| except WindowsError as err: |
| pass |
| else: |
| break |
| return None |
|
|
| DEFAULT_FUNCTION_TYPE = staticmethod( ctypes.WINFUNCTYPE ) |
| |
| GLUT_CALLBACK_TYPE = staticmethod( ctypes.CFUNCTYPE ) |
| GDI32 = ctypes.windll.gdi32 |
| @baseplatform.lazy_property |
| def WGL( self ): |
| return self.OpenGL |
| @baseplatform.lazy_property |
| def getExtensionProcedure( self ): |
| wglGetProcAddress = self.OpenGL.wglGetProcAddress |
| wglGetProcAddress.restype = ctypes.c_void_p |
| return wglGetProcAddress |
|
|
| GLUT_FONT_CONSTANTS = { |
| 'GLUT_STROKE_ROMAN': ctypes.c_void_p( 0), |
| 'GLUT_STROKE_MONO_ROMAN': ctypes.c_void_p( 1), |
| 'GLUT_BITMAP_9_BY_15': ctypes.c_void_p( 2), |
| 'GLUT_BITMAP_8_BY_13': ctypes.c_void_p( 3), |
| 'GLUT_BITMAP_TIMES_ROMAN_10': ctypes.c_void_p( 4), |
| 'GLUT_BITMAP_TIMES_ROMAN_24': ctypes.c_void_p( 5), |
| 'GLUT_BITMAP_HELVETICA_10': ctypes.c_void_p( 6), |
| 'GLUT_BITMAP_HELVETICA_12': ctypes.c_void_p( 7), |
| 'GLUT_BITMAP_HELVETICA_18': ctypes.c_void_p( 8), |
| } |
|
|
|
|
| def getGLUTFontPointer( self,constant ): |
| """Platform specific function to retrieve a GLUT font pointer |
| |
| GLUTAPI void *glutBitmap9By15; |
| #define GLUT_BITMAP_9_BY_15 (&glutBitmap9By15) |
| |
| Key here is that we want the addressof the pointer in the DLL, |
| not the pointer in the DLL. That is, our pointer is to the |
| pointer defined in the DLL, we don't want the *value* stored in |
| that pointer. |
| """ |
| return self.GLUT_FONT_CONSTANTS[ constant ] |
|
|
| @baseplatform.lazy_property |
| def GetCurrentContext( self ): |
| wglGetCurrentContext = self.GL.wglGetCurrentContext |
| wglGetCurrentContext.restype = ctypes.c_void_p |
| return wglGetCurrentContext |
|
|
| def constructFunction( |
| self, |
| functionName, dll, |
| resultType=ctypes.c_int, argTypes=(), |
| doc = None, argNames = (), |
| extension = None, |
| deprecated = False, |
| module = None, |
| error_checker=None, |
| ): |
| """Override construct function to do win32-specific hacks to find entry points""" |
| try: |
| return super( Win32Platform, self ).constructFunction( |
| functionName, dll, |
| resultType, argTypes, |
| doc, argNames, |
| extension, |
| deprecated, |
| module, |
| error_checker=error_checker, |
| ) |
| except AttributeError as err: |
| try: |
| return super( Win32Platform, self ).constructFunction( |
| functionName, self.GDI32, |
| resultType, argTypes, |
| doc, argNames, |
| extension, |
| deprecated, |
| module, |
| error_checker=error_checker, |
| ) |
| except AttributeError as err: |
| return super( Win32Platform, self ).constructFunction( |
| functionName, dll, |
| resultType, argTypes, |
| doc, argNames, |
| extension, |
| deprecated, |
| module, |
| force_extension = True, |
| error_checker=error_checker, |
| ) |
| |
|
|