punyverse/punyverse/_glgeom.pyx
2018-08-23 21:58:10 -04:00

40 lines
1.4 KiB
Cython

from libc.string cimport memcpy
include "_cyopengl.pxi"
cdef float PI = 3.1415926535897932324626
cdef float TWOPI = PI * 2
cdef extern from "Python.h":
object PyBytes_FromStringAndSize(const char *s, Py_ssize_t len)
const char* PyBytes_AsString(bytes o)
cpdef bytes bgr_to_rgb(bytes buffer, int width, int height, bint alpha=0):
cdef int length = len(buffer)
cdef int depth = length / (width * height)
cdef int depth2 = depth - alpha
cdef object final = PyBytes_FromStringAndSize(NULL, length)
cdef char *result = PyBytes_AsString(final)
cdef const char *source = PyBytes_AsString(buffer)
cdef int x, y, offset, i, row = width * depth
for y in xrange(height):
for x in xrange(width):
offset = y * row + x * depth
for i in xrange(depth2):
result[offset+i] = source[offset+depth2-i-1]
if alpha:
result[offset+depth2] = source[offset+depth2]
return final
cpdef bytes flip_vertical(bytes buffer, int width, int height):
cdef int length = len(buffer)
cdef object final = PyBytes_FromStringAndSize(NULL, length)
cdef char *result = PyBytes_AsString(final)
cdef const char *source = PyBytes_AsString(buffer)
cdef int y1, y2, row = length / height
for y1 in xrange(height):
y2 = height - y1 - 1
memcpy(result + y1 * row, source + y2 * row, row)
return final