File: strings.py

package info (click to toggle)
pyopengl 3.0.0~b6-3
  • links: PTS, VCS
  • area: main
  • in suites: lenny
  • size: 5,696 kB
  • ctags: 26,182
  • sloc: python: 34,233; ansic: 70; sh: 26; makefile: 15
file content (56 lines) | stat: -rw-r--r-- 2,447 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
"""String-array-handling code for PyOpenGL
"""
from OpenGL.arrays._strings import dataPointer
from OpenGL import constants
from OpenGL.arrays import formathandler
import ctypes

class StringHandler( formathandler.FormatHandler ):
	"""String-specific data-type handler for OpenGL"""
	HANDLED_TYPES = (str, )
	from_param = staticmethod( dataPointer )
	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"""
		# need to get bits-per-element...
		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, str ):
			return value
		elif hasattr( value, 'tostring' ):
			return value.tostring()
		elif hasattr( value, 'raw' ):
			return value.raw
		# could convert types to string here, but we're not registered for 
		# anything save string types...
		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"""
		)

BYTE_SIZES = {
	constants.GL_DOUBLE: ctypes.sizeof( constants.GLdouble ),
	constants.GL_FLOAT: ctypes.sizeof( constants.GLfloat ),
	constants.GL_INT: ctypes.sizeof( constants.GLint ),
	constants.GL_SHORT: ctypes.sizeof( constants.GLshort ),
	constants.GL_UNSIGNED_BYTE: ctypes.sizeof( constants.GLubyte ),
	constants.GL_UNSIGNED_SHORT: ctypes.sizeof( constants.GLshort ),
	constants.GL_BYTE: ctypes.sizeof( constants.GLbyte ),
	constants.GL_UNSIGNED_INT: ctypes.sizeof( constants.GLuint ),
}