test-kivy-app/kivy_venv/lib/python3.11/site-packages/kivy/graphics/memory.pxi
2024-09-15 15:12:16 +03:00

75 lines
2.4 KiB
Cython

from cpython.array cimport array, clone
'''
These functions below, take a data element; if the data implements the
buffer interface, the data is returned unchanged, otherwise, a python
array is created from the data and returned.
in both cases, the second parameter is initialized with a pointer to the
starting address of the returned buffer
The return value is a tuple, of (original data, array), where in the first
case, array is None.
The method used below (a untyped python array + array.data.as_floats pointer)
results in the fastest list to array creation and usage. Even malloc isn't
faster. Note, using memoryview (which we avoided for this case) is relatively
slow in cython.
When the user passes in a memoryview type, we have no choice but to use the
memoryview passed in, though.
'''
cdef inline _ensure_float_view(data, float **f):
cdef array arr
cdef list src
cdef int i
cdef float [::1] memview
# do if/else instead of straight try/except because its faster for list
if not isinstance(data, (tuple, list)):
try:
memview = data
f[0] = &memview[0]
return data, None
except Exception as e:
import traceback; traceback.print_exc()
src = list(data)
arr = clone(array('f'), len(src), False)
f[0] = arr.data.as_floats
for i in range(len(src)):
f[0][i] = src[i]
else:
src = list(data)
arr = clone(array('f'), len(src), False)
f[0] = arr.data.as_floats
for i in range(len(src)):
f[0][i] = src[i]
return src, arr
cdef inline _ensure_ushort_view(data, unsigned short **f):
cdef array arr
cdef list src
cdef int i
cdef unsigned short [::1] memview
# do if/else instead of straight try/except because its faster for list
if not isinstance(data, (tuple, list)):
try:
memview = data
f[0] = &memview[0]
return data, None
except:
src = list(data)
arr = clone(array('H'), len(src), False)
f[0] = arr.data.as_ushorts
for i in range(len(src)):
f[0][i] = src[i]
else:
src = list(data)
arr = clone(array('H'), len(src), False)
f[0] = arr.data.as_ushorts
for i in range(len(src)):
f[0][i] = src[i]
return src, arr