| | """Base class for the various Python data-format storage type APIs |
| | |
| | Data-type handlers are specified using OpenGL.plugins module |
| | """ |
| | import ctypes |
| | from OpenGL import plugins |
| |
|
| | class FormatHandler( object ): |
| | """Abstract class describing the handler interface |
| | |
| | Each data-type handler is responsible for providing a number of methods |
| | which allow it to manipulate (and create) instances of the data-type |
| | it represents. |
| | """ |
| | LAZY_TYPE_REGISTRY = {} |
| | HANDLER_REGISTRY = {} |
| | baseType = None |
| | typeConstant = None |
| | HANDLED_TYPES = () |
| | preferredOutput = None |
| | isOutput = False |
| | GENERIC_OUTPUT_PREFERENCES = ['numpy','ctypesarrays'] |
| | ALL_OUTPUT_HANDLERS = [] |
| | def loadAll( cls ): |
| | """Load all OpenGL.plugins-registered FormatHandler classes |
| | """ |
| | for entrypoint in plugins.FormatHandler.all(): |
| | cls.loadPlugin( entrypoint ) |
| | @classmethod |
| | def loadPlugin( cls, entrypoint ): |
| | """Load a single entry-point via plugins module""" |
| | if not entrypoint.loaded: |
| | from OpenGL.arrays.arraydatatype import ArrayDatatype |
| | try: |
| | plugin_class = entrypoint.load() |
| | except ImportError as err: |
| | from OpenGL import logs |
| | from OpenGL._configflags import WARN_ON_FORMAT_UNAVAILABLE |
| | _log = logs.getLog( 'OpenGL.formathandler' ) |
| | if WARN_ON_FORMAT_UNAVAILABLE: |
| | logFunc = _log.warn |
| | else: |
| | logFunc = _log.info |
| | logFunc( |
| | 'Unable to load registered array format handler %s:\n%s', |
| | entrypoint.name, _log.getException( err ) |
| | ) |
| | else: |
| | handler = plugin_class() |
| | |
| | ArrayDatatype.getRegistry()[ entrypoint.name ] = handler |
| | return handler |
| | entrypoint.loaded = True |
| | @classmethod |
| | def typeLookup( cls, type ): |
| | """Lookup handler by data-type""" |
| | registry = ArrayDatatype.getRegistry() |
| | try: |
| | return registry[ type ] |
| | except KeyError as err: |
| | key = '%s.%s'%(type.__module__,type.__name__) |
| | plugin = cls.LAZY_TYPE_REGISTRY.get( key ) |
| | if plugin: |
| | cls.loadPlugin( plugin ) |
| | return registry[ type ] |
| | raise KeyError( """Unable to find data-format handler for %s"""%( type,)) |
| | loadAll = classmethod( loadAll ) |
| |
|
| | def register( self, types=None ): |
| | """Register this class as handler for given set of types""" |
| | from OpenGL.arrays.arraydatatype import ArrayDatatype |
| | ArrayDatatype.getRegistry().register( self, types ) |
| | def registerReturn( self ): |
| | """Register this handler as the default return-type handler""" |
| | from OpenGL.arrays.arraydatatype import ArrayDatatype |
| | ArrayDatatype.getRegistry().registerReturn( self ) |
| |
|
| | def from_param( self, value, typeCode=None ): |
| | """Convert to a ctypes pointer value""" |
| | def dataPointer( self, value ): |
| | """return long for pointer value""" |
| | def asArray( self, value, typeCode=None ): |
| | """Given a value, convert to array representation""" |
| | def arrayToGLType( self, value ): |
| | """Given a value, guess OpenGL type of the corresponding pointer""" |
| | def arraySize( self, value, typeCode = None ): |
| | """Given a data-value, calculate dimensions for the array""" |
| | def unitSize( self, value, typeCode=None ): |
| | """Determine unit size of an array (if possible)""" |
| | if self.baseType is not None: |
| | return |
| | def dimensions( self, value, typeCode=None ): |
| | """Determine dimensions of the passed array value (if possible)""" |
| |
|