Acme-MITHALDU-BleedingOpenGL
view release on metacpan or search on metacpan
case GL_UNSIGNED_SHORT_4_4_4_4_REV:
case GL_UNSIGNED_SHORT_5_5_5_1:
case GL_UNSIGNED_SHORT_1_5_5_5_REV:
RIV(GLushort)
case GL_UNSIGNED_INT_8_8_8_8:
case GL_UNSIGNED_INT_8_8_8_8_REV:
case GL_UNSIGNED_INT_10_10_10_2:
case GL_UNSIGNED_INT_2_10_10_10_REV:
RIV(GLuint)
#endif
case GL_UNSIGNED_BYTE:
case GL_BITMAP:
case GL_BYTE:
RIV(GLubyte)
case GL_UNSIGNED_SHORT:
case GL_SHORT:
RIV(GLushort)
case GL_UNSIGNED_INT:
case GL_INT:
RIV(GLuint)
case GL_FLOAT:
RNV(GLfloat)
case GL_DOUBLE:
RNV(GLdouble)
case GL_2_BYTES:
{
unsigned long v = SvIV(sv);
(*(GLubyte*)*ptr) = (GLubyte)(v >> 8);
(*(unsigned char**)ptr)++;
(*(GLubyte*)*ptr) = (GLubyte)(v & 0xff);
(*(unsigned char**)ptr)++;
break;
}
case GL_3_BYTES:
{
unsigned long v = SvIV(sv);
(*(GLubyte*)*ptr) = (GLubyte)((v >> 16) & 0xff);
(*(unsigned char**)ptr)++;
(*(GLubyte*)*ptr) = (GLubyte)((v >> 8) & 0xff);
(*(unsigned char**)ptr)++;
(*(GLubyte*)*ptr) = (GLubyte)((v >> 0) & 0xff);
(*(unsigned char**)ptr)++;
break;
}
case GL_4_BYTES:
{
unsigned long v = SvIV(sv);
(*(GLubyte*)*ptr) = (GLubyte)((v >> 24) & 0xff);
(*(unsigned char**)ptr)++;
(*(GLubyte*)*ptr) = (GLubyte)((v >> 16) & 0xff);
(*(unsigned char**)ptr)++;
(*(GLubyte*)*ptr) = (GLubyte)((v >> 8) & 0xff);
(*(unsigned char**)ptr)++;
(*(GLubyte*)*ptr) = (GLubyte)((v >> 0) & 0xff);
(*ptr)++;
break;
}
default:
croak("Unable to set data with unknown type");
}
#undef RIV
#undef RNV
}
SV * pgl_get_type(GLenum type, void ** ptr)
{
SV * result = 0;
#define RIV(t) \
result = newSViv((*(t*)*ptr)); \
*(unsigned char**)ptr += sizeof(t); \
break;
#define RNV(t) \
result = newSVnv((*(t*)*ptr)); \
*(unsigned char**)ptr += sizeof(t); \
break;
switch (type) {
#ifdef GL_VERSION_1_2
case GL_UNSIGNED_BYTE_3_3_2:
case GL_UNSIGNED_BYTE_2_3_3_REV:
RIV(GLubyte)
case GL_UNSIGNED_SHORT_5_6_5:
case GL_UNSIGNED_SHORT_5_6_5_REV:
case GL_UNSIGNED_SHORT_4_4_4_4:
case GL_UNSIGNED_SHORT_4_4_4_4_REV:
case GL_UNSIGNED_SHORT_5_5_5_1:
case GL_UNSIGNED_SHORT_1_5_5_5_REV:
RIV(GLushort)
case GL_UNSIGNED_INT_8_8_8_8:
case GL_UNSIGNED_INT_8_8_8_8_REV:
case GL_UNSIGNED_INT_10_10_10_2:
case GL_UNSIGNED_INT_2_10_10_10_REV:
RIV(GLuint)
#endif
case GL_UNSIGNED_BYTE:
case GL_BITMAP:
case GL_BYTE:
RIV(GLubyte)
case GL_UNSIGNED_SHORT:
case GL_SHORT:
RIV(GLushort)
case GL_UNSIGNED_INT:
case GL_INT:
RIV(GLuint)
case GL_FLOAT:
RNV(GLfloat)
case GL_DOUBLE:
RNV(GLdouble)
case GL_2_BYTES:
{
unsigned long v;
v = (*(GLubyte*)*ptr) << 8;
(*(unsigned char**)ptr)++;
v |= (*(GLubyte*)*ptr) << 0;
(*(unsigned char**)ptr)++;
result = newSViv(v);
break;
}
case GL_3_BYTES:
{
unsigned long v;
v = (*(GLubyte*)*ptr) << 16;
(*(unsigned char**)ptr)++;
v |= (*(GLubyte*)*ptr) << 8;
(*(unsigned char**)ptr)++;
v |= (*(GLubyte*)*ptr) << 0;
(*(unsigned char**)ptr)++;
result = newSViv(v);
break;
}
case GL_4_BYTES:
{
unsigned long v;
v = (*(GLubyte*)*ptr) << 24;
(*(unsigned char**)ptr)++;
v |= (*(GLubyte*)*ptr) << 16;
(*(unsigned char**)ptr)++;
v |= (*(GLubyte*)*ptr) << 8;
(*(unsigned char**)ptr)++;
v |= (*(GLubyte*)*ptr) << 0;
(*(unsigned char**)ptr)++;
result = newSViv(v);
break;
}
default:
croak("Unable to get data with unknown type");
}
return result;
#undef RIV
#undef RNV
}
GLvoid * pack_image_ST(SV ** stack, int count, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, int mode)
{
int i;
void * ptr, * optr;
GLsizei size, max;
gl_pixelbuffer_size2(width, height, depth, format, type, mode, &size, &max);
optr = ptr = malloc(size);
for (i=0;i<count;i++) {
if (SvROK(stack[i])) {
AV * ast[8];
int apos[8];
int level = 0;
ast[0] = (AV*)SvRV(stack[i]);
apos[0] = 0;
if (SvTYPE(ast[0]) != SVt_PVAV) {
croak("Weird nest 1");
}
while (level >= 0) {
SV ** sv;
sv = av_fetch(ast[level], apos[level]++, 0);
if (!sv) {
level--;
continue;
}
if (SvROK(*sv)) {
if (SvTYPE(SvRV(*sv)) != SVt_PVAV) {
croak("Weird nest 2");
}
level++;
if (level >= 8)
goto too_many_levels;
ast[level] = (AV*)SvRV(*sv);
apos[level] = 0;
} else {
if (!max--)
goto too_much_data;
pgl_set_type(*sv, type, &ptr);
}
}
} else {
if (!max--)
goto too_much_data;
pgl_set_type(stack[i], type, &ptr);
}
}
if (max>0)
goto too_little_data;
return optr;
too_little_data:
croak("too little data");
too_much_data:
croak("too much data");
too_many_levels:
croak("too many levels");
return 0; // Just to make the compiler happy
}
GLvoid * allocate_image_ST(GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, int mode)
{
//int i;
void * ptr;
GLsizei size, max;
gl_pixelbuffer_size2(width, height, depth, format, type, mode, &size, &max);
ptr = malloc(size);
return ptr;
}
SV ** unpack_image_ST(SV ** SP, void * data,
GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, int mode)
{
#define sp SP
int i;
GLsizei size, max;
gl_pixelbuffer_size2(width, height, depth, format, type, mode, &size, &max);
EXTEND(sp, max);
for (i=0;i<max;i++) {
PUSHs(sv_2mortal(pgl_get_type(type, &data)));
}
return sp;
#undef sp
}
( run in 1.083 second using v1.01-cache-2.11-cpan-d80b1682f3f )