| | """String-array-handling code for PyOpenGL |
| | """ |
| | from OpenGL.raw.GL import _types |
| | from OpenGL.raw.GL.VERSION import GL_1_1 |
| | from OpenGL.arrays import formathandler |
| | import ctypes |
| | from OpenGL import _bytes, error |
| | from OpenGL._configflags import ERROR_ON_COPY |
| |
|
| | def dataPointer( value, typeCode=None ): |
| | return ctypes.cast(ctypes.c_char_p(value), |
| | ctypes.c_void_p).value |
| |
|
| | class StringHandler( formathandler.FormatHandler ): |
| | """String-specific data-type handler for OpenGL""" |
| | HANDLED_TYPES = (_bytes.bytes, ) |
| | @classmethod |
| | def from_param( cls, value, typeCode=None ): |
| | return ctypes.c_void_p( dataPointer( value ) ) |
| | dataPointer = staticmethod( dataPointer ) |
| | def zeros( self, dims, typeCode=None ): |
| | """Currently don't allow strings as output types!""" |
| | raise NotImplemented( """Don't currently support strings as output arrays""" ) |
| | def ones( self, dims, typeCode=None ): |
| | """Currently don't allow strings as output types!""" |
| | raise NotImplemented( """Don't currently support strings as output arrays""" ) |
| | def arrayToGLType( self, value ): |
| | """Given a value, guess OpenGL type of the corresponding pointer""" |
| | raise NotImplemented( """Can't guess data-type from a string-type argument""" ) |
| | def arraySize( self, value, typeCode = None ): |
| | """Given a data-value, calculate ravelled size for the array""" |
| | |
| | byteCount = BYTE_SIZES[ typeCode ] |
| | return len(value)//byteCount |
| | def arrayByteCount( self, value, typeCode = None ): |
| | """Given a data-value, calculate number of bytes required to represent""" |
| | return len(value) |
| | def asArray( self, value, typeCode=None ): |
| | """Convert given value to an array value of given typeCode""" |
| | if isinstance( value, bytes ): |
| | return value |
| | elif hasattr( value, 'tostring' ): |
| | return value.tostring() |
| | elif hasattr( value, 'raw' ): |
| | return value.raw |
| | |
| | |
| | raise TypeError( """String handler got non-string object: %r"""%(type(value))) |
| | def dimensions( self, value, typeCode=None ): |
| | """Determine dimensions of the passed array value (if possible)""" |
| | raise TypeError( |
| | """Cannot calculate dimensions for a String data-type""" |
| | ) |
| |
|
| | class UnicodeHandler( StringHandler ): |
| | HANDLED_TYPES = (_bytes.unicode,) |
| | @classmethod |
| | def from_param( cls, value, typeCode=None ): |
| | |
| | converted = _bytes.as_8_bit( value ) |
| | result = StringHandler.from_param( converted ) |
| | if converted is not value: |
| | if ERROR_ON_COPY: |
| | raise error.CopyError( |
| | """Unicode string passed, cannot copy with ERROR_ON_COPY set, please use 8-bit strings""" |
| | ) |
| | result._temporary_array_ = converted |
| | return result |
| | def asArray( self, value, typeCode=None ): |
| | value = _bytes.as_8_bit( value ) |
| | return StringHandler.asArray( self, value, typeCode=typeCode ) |
| |
|
| |
|
| | BYTE_SIZES = { |
| | GL_1_1.GL_DOUBLE: ctypes.sizeof( _types.GLdouble ), |
| | GL_1_1.GL_FLOAT: ctypes.sizeof( _types.GLfloat ), |
| | GL_1_1.GL_INT: ctypes.sizeof( _types.GLint ), |
| | GL_1_1.GL_SHORT: ctypes.sizeof( _types.GLshort ), |
| | GL_1_1.GL_UNSIGNED_BYTE: ctypes.sizeof( _types.GLubyte ), |
| | GL_1_1.GL_UNSIGNED_SHORT: ctypes.sizeof( _types.GLshort ), |
| | GL_1_1.GL_BYTE: ctypes.sizeof( _types.GLbyte ), |
| | GL_1_1.GL_UNSIGNED_INT: ctypes.sizeof( _types.GLuint ), |
| | } |
| |
|