clientattrib.c revision 6e8897ff9f90601ebf6eed500ad942c11b54d1f7
1/* 2 * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) 3 * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice including the dates of first publication and 13 * either this permission notice or a reference to 14 * http://oss.sgi.com/projects/FreeB/ 15 * shall be included in all copies or substantial portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 21 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 22 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23 * SOFTWARE. 24 * 25 * Except as contained in this notice, the name of Silicon Graphics, Inc. 26 * shall not be used in advertising or otherwise to promote the sale, use or 27 * other dealings in this Software without prior written authorization from 28 * Silicon Graphics, Inc. 29 */ 30 31#include <assert.h> 32#include "glxclient.h" 33#include "indirect.h" 34#include "indirect_vertex_array.h" 35 36/*****************************************************************************/ 37 38static void 39do_enable_disable(GLenum array, GLboolean val) 40{ 41 __GLXcontext *gc = __glXGetCurrentContext(); 42 __GLXattribute *state = (__GLXattribute *) (gc->client_state_private); 43 unsigned index = 0; 44 45 if (array == GL_TEXTURE_COORD_ARRAY) { 46 index = __glXGetActiveTextureUnit(state); 47 } 48 49 if (!__glXSetArrayEnable(state, array, index, val)) { 50 __glXSetError(gc, GL_INVALID_ENUM); 51 } 52} 53 54void 55__indirect_glEnableClientState(GLenum array) 56{ 57 do_enable_disable(array, GL_TRUE); 58} 59 60void 61__indirect_glDisableClientState(GLenum array) 62{ 63 do_enable_disable(array, GL_FALSE); 64} 65 66/************************************************************************/ 67 68void 69__indirect_glPushClientAttrib(GLuint mask) 70{ 71 __GLXcontext *gc = __glXGetCurrentContext(); 72 __GLXattribute *state = (__GLXattribute *) (gc->client_state_private); 73 __GLXattribute **spp = gc->attributes.stackPointer, *sp; 74 75 if (spp < &gc->attributes.stack[__GL_CLIENT_ATTRIB_STACK_DEPTH]) { 76 if (!(sp = *spp)) { 77 sp = (__GLXattribute *) Xmalloc(sizeof(__GLXattribute)); 78 *spp = sp; 79 } 80 sp->mask = mask; 81 gc->attributes.stackPointer = spp + 1; 82 if (mask & GL_CLIENT_PIXEL_STORE_BIT) { 83 sp->storePack = state->storePack; 84 sp->storeUnpack = state->storeUnpack; 85 } 86 if (mask & GL_CLIENT_VERTEX_ARRAY_BIT) { 87 __glXPushArrayState(state); 88 } 89 } 90 else { 91 __glXSetError(gc, GL_STACK_OVERFLOW); 92 return; 93 } 94} 95 96void 97__indirect_glPopClientAttrib(void) 98{ 99 __GLXcontext *gc = __glXGetCurrentContext(); 100 __GLXattribute *state = (__GLXattribute *) (gc->client_state_private); 101 __GLXattribute **spp = gc->attributes.stackPointer, *sp; 102 GLuint mask; 103 104 if (spp > &gc->attributes.stack[0]) { 105 --spp; 106 sp = *spp; 107 assert(sp != 0); 108 mask = sp->mask; 109 gc->attributes.stackPointer = spp; 110 111 if (mask & GL_CLIENT_PIXEL_STORE_BIT) { 112 state->storePack = sp->storePack; 113 state->storeUnpack = sp->storeUnpack; 114 } 115 if (mask & GL_CLIENT_VERTEX_ARRAY_BIT) { 116 __glXPopArrayState(state); 117 } 118 119 sp->mask = 0; 120 } 121 else { 122 __glXSetError(gc, GL_STACK_UNDERFLOW); 123 return; 124 } 125} 126 127void 128__glFreeAttributeState(__GLXcontext * gc) 129{ 130 __GLXattribute *sp, **spp; 131 132 for (spp = &gc->attributes.stack[0]; 133 spp < &gc->attributes.stack[__GL_CLIENT_ATTRIB_STACK_DEPTH]; spp++) { 134 sp = *spp; 135 if (sp) { 136 XFree((char *) sp); 137 } 138 else { 139 break; 140 } 141 } 142} 143