#include <assert.h>
#define NEED_GL_FUNCS_WRAPPED
#include "glxclient.h"
void glEnableClientState(GLenum array)
{
__GLXcontext *gc = __glXGetCurrentContext();
__GLXattribute * state = (__GLXattribute *)(gc->client_state_private);
switch (array) {
case GL_COLOR_ARRAY:
state->vertArray.color.enable = GL_TRUE;
break;
case GL_EDGE_FLAG_ARRAY:
state->vertArray.edgeFlag.enable = GL_TRUE;
break;
case GL_INDEX_ARRAY:
state->vertArray.index.enable = GL_TRUE;
break;
case GL_NORMAL_ARRAY:
state->vertArray.normal.enable = GL_TRUE;
break;
case GL_TEXTURE_COORD_ARRAY:
state->vertArray.texCoord[state->vertArray.activeTexture].enable = GL_TRUE;
break;
case GL_VERTEX_ARRAY:
state->vertArray.vertex.enable = GL_TRUE;
break;
case GL_SECONDARY_COLOR_ARRAY:
state->vertArray.secondaryColor.enable = GL_TRUE;
break;
case GL_FOG_COORDINATE_ARRAY:
state->vertArray.fogCoord.enable = GL_TRUE;
break;
default:
__glXSetError(gc, GL_INVALID_ENUM);
}
}
void glDisableClientState(GLenum array)
{
__GLXcontext *gc = __glXGetCurrentContext();
__GLXattribute * state = (__GLXattribute *)(gc->client_state_private);
switch (array) {
case GL_COLOR_ARRAY:
state->vertArray.color.enable = GL_FALSE;
break;
case GL_EDGE_FLAG_ARRAY:
state->vertArray.edgeFlag.enable = GL_FALSE;
break;
case GL_INDEX_ARRAY:
state->vertArray.index.enable = GL_FALSE;
break;
case GL_NORMAL_ARRAY:
state->vertArray.normal.enable = GL_FALSE;
break;
case GL_TEXTURE_COORD_ARRAY:
state->vertArray.texCoord[state->vertArray.activeTexture].enable = GL_FALSE;
break;
case GL_VERTEX_ARRAY:
state->vertArray.vertex.enable = GL_FALSE;
break;
case GL_SECONDARY_COLOR_ARRAY:
state->vertArray.secondaryColor.enable = GL_FALSE;
break;
case GL_FOG_COORDINATE_ARRAY:
state->vertArray.fogCoord.enable = GL_FALSE;
break;
default:
__glXSetError(gc, GL_INVALID_ENUM);
}
}
void glPushClientAttrib(GLuint mask)
{
__GLXcontext *gc = __glXGetCurrentContext();
__GLXattribute * state = (__GLXattribute *)(gc->client_state_private);
__GLXattribute **spp = gc->attributes.stackPointer, *sp;
if (spp < &gc->attributes.stack[__GL_CLIENT_ATTRIB_STACK_DEPTH]) {
if (!(sp = *spp)) {
sp = (__GLXattribute *)Xmalloc(sizeof(__GLXattribute));
*spp = sp;
}
sp->mask = mask;
gc->attributes.stackPointer = spp + 1;
if (mask & GL_CLIENT_PIXEL_STORE_BIT) {
sp->storePack = state->storePack;
sp->storeUnpack = state->storeUnpack;
}
if (mask & GL_CLIENT_VERTEX_ARRAY_BIT) {
sp->vertArray = state->vertArray;
}
} else {
__glXSetError(gc, GL_STACK_OVERFLOW);
return;
}
}
void glPopClientAttrib(void)
{
__GLXcontext *gc = __glXGetCurrentContext();
__GLXattribute * state = (__GLXattribute *)(gc->client_state_private);
__GLXattribute **spp = gc->attributes.stackPointer, *sp;
GLuint mask;
if (spp > &gc->attributes.stack[0]) {
--spp;
sp = *spp;
assert(sp != 0);
mask = sp->mask;
gc->attributes.stackPointer = spp;
if (mask & GL_CLIENT_PIXEL_STORE_BIT) {
state->storePack = sp->storePack;
state->storeUnpack = sp->storeUnpack;
}
if (mask & GL_CLIENT_VERTEX_ARRAY_BIT) {
state->vertArray = sp->vertArray;
}
sp->mask = 0;
} else {
__glXSetError(gc, GL_STACK_UNDERFLOW);
return;
}
}
void __glFreeAttributeState(__GLXcontext *gc)
{
__GLXattribute *sp, **spp;
for (spp = &gc->attributes.stack[0];
spp < &gc->attributes.stack[__GL_CLIENT_ATTRIB_STACK_DEPTH];
spp++) {
sp = *spp;
if (sp) {
XFree((char *)sp);
} else {
break;
}
}
}