#if !defined(__glsutil_h_) #define __glsutil_h_ /* ** Copyright 1995-2095, Silicon Graphics, Inc. ** All Rights Reserved. ** ** This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.; ** the contents of this file may not be disclosed to third parties, copied or ** duplicated in any form, in whole or in part, without the prior written ** permission of Silicon Graphics, Inc. ** ** RESTRICTED RIGHTS LEGEND: ** Use, duplication or disclosure by the Government is subject to restrictions ** as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data ** and Computer Software clause at DFARS 252.227-7013, and/or in similar or ** successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished - ** rights reserved under the Copyright Laws of the United States. */ #include #include #if defined(__cplusplus) extern "C" { #endif /****************************************************************************** Array ******************************************************************************/ #define __GLS_ARRAY(inType) \ struct { \ inType *base; \ size_t count; \ size_t bufCount; \ } typedef __GLS_ARRAY(GLvoid) __GLSarray; #define __GLS_ARRAY_CHECK(inArray) \ assert( \ sizeof((inArray)->base) && \ sizeof(*(inArray)) == sizeof(__GLSarray) \ ) #define __GLS_ARRAY_APPEND(inoutArray, inCount, inInit) \ __GLS_ARRAY_CHECK(inoutArray); \ __glsArray_insert( \ (__GLSarray *)inoutArray, \ inoutArray->count, \ inCount, \ inInit, \ sizeof(*(inoutArray)->base) \ ) #define __GLS_ARRAY_FINAL(inoutArray) \ __GLS_ARRAY_CHECK(inoutArray); \ __glsArray_final((__GLSarray *)inoutArray) #define __GLS_ARRAY_INIT(outArray) \ __GLS_ARRAY_CHECK(outArray); \ __glsArray_init((__GLSarray *)outArray) #define __GLS_ARRAY_COMPACT(inoutArray) \ __GLS_ARRAY_CHECK(inoutArray); \ __glsArray_compact((__GLSarray *)inoutArray, sizeof(*(inoutArray)->base)) #define __GLS_ARRAY_DELETE(inoutArray, inIndex, inCount) \ __GLS_ARRAY_CHECK(inoutArray); \ __glsArray_delete( \ (__GLSarray *)inoutArray, \ inIndex, \ inCount, \ sizeof(*(inoutArray)->base) \ ) #define __GLS_ARRAY_INSERT(inoutArray, inIndex, inCount, inInit) \ __GLS_ARRAY_CHECK(inoutArray); \ __glsArray_insert( \ (__GLSarray *)inoutArray, \ inIndex, \ inCount, \ inInit, \ sizeof(*(inoutArray)->base) \ ) extern void __glsArray_final(__GLSarray *inoutArray); extern void __glsArray_init(__GLSarray *outArray); extern void __glsArray_compact(__GLSarray *inoutArray, size_t inElemSize); extern void __glsArray_delete( __GLSarray *inoutArray, size_t inIndex, size_t inCount, size_t inElemSize ); extern GLboolean __glsArray_insert( __GLSarray *inoutArray, size_t inIndex, size_t inCount, GLboolean inInit, size_t inElemSize ); /****************************************************************************** Checksum ******************************************************************************/ #define __GLS_CRC32_STEP(inCRC, inByte) \ inCRC = (inCRC << 8) ^ __glsCRC32table[(inCRC >> 24) ^ inByte]; extern const GLuint __glsCRC32table[256]; /****************************************************************************** Dict ******************************************************************************/ typedef struct __GLSdict __GLSdict; extern __GLSdict* __glsIntDict_create(size_t inTableCount); extern __GLSdict* __glsIntDict_destroy(__GLSdict *inDict); extern void __glsIntDict_print(__GLSdict *inoutDict, const GLubyte *inName); extern void __glsIntDict_remove(__GLSdict *inoutDict, GLint inKey); extern GLboolean __glsInt2IntDict_add( __GLSdict *inoutDict, GLint inKey, GLint inVal ); extern GLboolean __glsInt2IntDict_find( const __GLSdict *inDict, GLint inKey, GLint *optoutVal ); extern GLboolean __glsInt2IntDict_replace( __GLSdict *inoutDict, GLint inKey, GLint inVal ); extern GLboolean __glsInt2PtrDict_add( __GLSdict *inoutDict, GLint inKey, GLvoid *inVal ); extern GLvoid* __glsInt2PtrDict_find( const __GLSdict *inDict, GLint inKey ); extern GLboolean __glsInt2PtrDict_replace( __GLSdict *inoutDict, GLint inKey, GLvoid *inVal ); extern __GLSdict* __glsStrDict_create( size_t inTableCount, GLboolean inStaticKeys ); extern __GLSdict* __glsStrDict_destroy(__GLSdict *inDict); extern void __glsStrDict_print(__GLSdict *inoutDict, const GLubyte *inName); extern void __glsStrDict_remove(__GLSdict *inoutDict, const GLubyte *inKey); extern GLboolean __glsStr2IntDict_add( __GLSdict *inoutDict, const GLubyte *inKey, GLint inVal ); extern GLboolean __glsStr2IntDict_find( const __GLSdict *inDict, const GLubyte *inKey, GLint *optoutVal ); extern GLboolean __glsStr2IntDict_replace( __GLSdict *inoutDict, const GLubyte *inKey, GLint inVal ); extern GLboolean __glsStr2PtrDict_add( __GLSdict *inoutDict, const GLubyte *inKey, GLvoid *inVal ); extern GLvoid* __glsStr2PtrDict_find( const __GLSdict *inDict, const GLubyte *inKey ); extern GLboolean __glsStr2PtrDict_replace( __GLSdict *inoutDict, const GLubyte *inKey, GLvoid *inVal ); /****************************************************************************** List ******************************************************************************/ #define __GLS_LIST(inType) \ struct { \ inType *head; \ } #define __GLS_LIST_ITER(inType) \ struct { \ inType *elem; \ } typedef struct __GLSlistElem __GLSlistElem; typedef void (*__GLSlistElemDestructor)(__GLSlistElem *inElem); typedef __GLS_LIST(__GLSlistElem) __GLSlist; typedef __GLS_LIST_ITER(__GLSlistElem) __GLSlistIter; struct __GLSlistElem { __GLSlistElem *next; __GLSlistElem *prev; }; #define __GLS_LIST_ELEM \ __GLSlistElem __glsListElem #define __GLS_LIST_CHECK(inList) \ assert(sizeof((inList)->head) && sizeof(*(inList)) == sizeof(__GLSlist)) #define __GLS_LIST_ELEM_CHECK(inElem) \ assert(sizeof((inElem)->__glsListElem.next)) #define __GLS_LIST_ITER_CHECK(inIter) \ assert( \ sizeof((inIter)->elem) && sizeof(*(inIter)) == sizeof(__GLSlistIter) \ ) #define __GLS_LIST_APPEND(inoutList, inoutElem) \ __GLS_LIST_CHECK(inoutList); \ __GLS_LIST_ELEM_CHECK(inoutElem); \ __glsListAppend((__GLSlist *)(inoutList), (__GLSlistElem *)(inoutElem)) #define __GLS_LIST_CLEAR_DESTROY(inoutList, inDestructor) \ __GLS_LIST_CHECK(inoutList); \ __glsListClearDestroy( \ (__GLSlist *)(inoutList), (__GLSlistElemDestructor)(inDestructor) \ ) #define __GLS_LIST_FIRST(inList, inoutIter) \ __GLS_LIST_CHECK(inList); \ __GLS_LIST_ITER_CHECK(inoutIter); \ __glsListFirst((__GLSlist *)(inList), (__GLSlistIter *)(inoutIter)) #define __GLS_LIST_LAST(inList, inoutIter) \ __GLS_LIST_CHECK(inList); \ __GLS_LIST_ITER_CHECK(inoutIter); \ __glsListLast((__GLSlist *)(inList), (__GLSlistIter *)(inoutIter)) #define __GLS_LIST_NEXT(inList, inoutIter) \ __GLS_LIST_CHECK(inList); \ __GLS_LIST_ITER_CHECK(inoutIter); \ __glsListNext((__GLSlist *)(inList), (__GLSlistIter *)(inoutIter)) #define __GLS_LIST_PREPEND(inoutList, inoutElem) \ __GLS_LIST_CHECK(inoutList); \ __GLS_LIST_ELEM_CHECK(inoutElem); \ __glsListPrepend((__GLSlist *)(inoutList), (__GLSlistElem *)(inoutElem)) #define __GLS_LIST_PREV(inList, inoutIter) \ __GLS_LIST_CHECK(inList); \ __GLS_LIST_ITER_CHECK(inoutIter); \ __glsListPrev((__GLSlist *)(inList), (__GLSlistIter *)(inoutIter)) #define __GLS_LIST_REMOVE(inoutList, inoutElem) \ __GLS_LIST_CHECK(inoutList); \ __GLS_LIST_ELEM_CHECK(inoutElem); \ __glsListRemove((__GLSlist *)(inoutList), (__GLSlistElem*)(inoutElem)) #define __GLS_LIST_REMOVE_DESTROY(inoutList, inElem, inDestructor) \ __GLS_LIST_CHECK(inoutList); \ __GLS_LIST_ELEM_CHECK(inElem); \ __glsListRemoveDestroy( \ (__GLSlist *)(inoutList), \ (__GLSlistElem *)(inElem), \ (__GLSlistElemDestructor)(inDestructor) \ ) extern void __glsListAppend(__GLSlist *inoutList, __GLSlistElem *inoutElem); extern void __glsListClearDestroy( __GLSlist *inoutList, __GLSlistElemDestructor inDestructor ); extern void __glsListFirst(__GLSlist *inList, __GLSlistIter *inoutIter); extern void __glsListLast(__GLSlist *inList, __GLSlistIter *inoutIter); extern void __glsListNext(__GLSlist *inList, __GLSlistIter *inoutIter); extern void __glsListPrepend(__GLSlist *inoutList, __GLSlistElem *inoutElem); extern void __glsListPrev(__GLSlist *inList, __GLSlistIter *inoutIter); extern void __glsListRemove(__GLSlist *inoutList, __GLSlistElem *inoutElem); extern void __glsListRemoveDestroy( __GLSlist *inoutList, __GLSlistElem *inElem, __GLSlistElemDestructor inDestructor ); /****************************************************************************** IterList ******************************************************************************/ #define __GLS_ITERLIST(inType) \ struct { \ inType *head; \ size_t count; \ inType *iterElem; \ size_t iterIndex; \ } typedef __GLS_ITERLIST(__GLSlistElem) __GLSiterList; #define __GLS_ITERLIST_CHECK(inList) \ assert( \ sizeof((inList)->head) && sizeof(*(inList)) == sizeof(__GLSiterList) \ ) #define __GLS_ITERLIST_APPEND(inoutList, inoutElem) \ __GLS_ITERLIST_CHECK(inoutList); \ __GLS_LIST_ELEM_CHECK(inoutElem); \ __glsIterListAppend( \ (__GLSiterList *)(inoutList), (__GLSlistElem *)(inoutElem) \ ) #define __GLS_ITERLIST_CLEAR_DESTROY(inoutList, inDestructor) \ __GLS_ITERLIST_CHECK(inoutList); \ __glsIterListClearDestroy( \ (__GLSiterList *)(inoutList), (__GLSlistElemDestructor)(inDestructor) \ ) #define __GLS_ITERLIST_FIRST(inoutList) \ __GLS_ITERLIST_CHECK(inoutList); \ __glsIterListFirst((__GLSiterList *)(inoutList)) #define __GLS_ITERLIST_LAST(inoutList) \ __GLS_ITERLIST_CHECK(inoutList); \ __glsIterListLast((__GLSiterList *)(inoutList)) #define __GLS_ITERLIST_NEXT(inoutList) \ __GLS_ITERLIST_CHECK(inoutList); \ __glsIterListNext((__GLSiterList *)(inoutList)) #define __GLS_ITERLIST_PREPEND(inoutList, inoutElem) \ __GLS_ITERLIST_CHECK(inoutList); \ __GLS_LIST_ELEM_CHECK(inoutElem); \ __glsIterListPrepend( \ (__GLSiterList *)(inoutList), (__GLSlistElem *)(inoutElem) \ ) #define __GLS_ITERLIST_PREV(inoutList) \ __GLS_ITERLIST_CHECK(inoutList); \ __glsIterListPrev((__GLSiterList *)(inoutList)) #define __GLS_ITERLIST_REMOVE(inoutList, inoutElem) \ __GLS_ITERLIST_CHECK(inoutList); \ __GLS_LIST_ELEM_CHECK(inoutElem); \ __glsIterListRemove( \ (__GLSiterList *)(inoutList), (__GLSlistElem*)(inoutElem) \ ) #define __GLS_ITERLIST_REMOVE_DESTROY(inoutList, inElem, inDestructor) \ __GLS_ITERLIST_CHECK(inoutList); \ __GLS_LIST_ELEM_CHECK(inElem); \ __glsIterListRemoveDestroy( \ (__GLSiterList *)(inoutList), \ (__GLSlistElem *)(inElem), \ (__GLSlistElemDestructor)(inDestructor) \ ) #define __GLS_ITERLIST_SEEK(inoutList, inIndex) \ __GLS_ITERLIST_CHECK(inoutList); \ __glsIterListSeek((__GLSiterList *)(inoutList), inIndex) extern void __glsIterListAppend( __GLSiterList *inoutList, __GLSlistElem *inoutElem ); extern void __glsIterListClearDestroy( __GLSiterList *inoutList, __GLSlistElemDestructor inDestructor ); extern void __glsIterListFirst(__GLSiterList *inoutList); extern void __glsIterListLast(__GLSiterList *inoutList); extern void __glsIterListNext(__GLSiterList *inoutList); extern void __glsIterListPrepend( __GLSiterList *inoutList, __GLSlistElem *inoutElem ); extern void __glsIterListPrev(__GLSiterList *inoutList); extern void __glsIterListRemove( __GLSiterList *inoutList, __GLSlistElem *inoutElem ); extern void __glsIterListRemoveDestroy( __GLSiterList *inoutList, __GLSlistElem *inElem, __GLSlistElemDestructor inDestructor ); extern void __glsIterListSeek(__GLSiterList *inoutList, size_t inIndex); /****************************************************************************** Memory ******************************************************************************/ extern GLvoid* __glsCalloc(size_t inCount, size_t inSize); extern GLvoid* __glsMalloc(size_t inSize); /****************************************************************************** Nop ******************************************************************************/ #define __GLS_NULL extern void __glsNop(void); /****************************************************************************** Number ******************************************************************************/ #define __GLS_MAX(in1, in2) ((in1) > (in2) ? (in1) : (in2)) #define __GLS_MIN(in1, in2) ((in1) < (in2) ? (in1) : (in2)) #define __GLS_SWAP_DECLARE \ GLubyte __swapSave #define __GLS_SWAP(inPtr, in1, in2) \ __swapSave = ((GLubyte*)(inPtr))[in1]; \ ((GLubyte *)(inPtr))[in1] = ((GLubyte *)(inPtr))[in2]; \ ((GLubyte *)(inPtr))[in2] = __swapSave; #define __GLS_SWAP1(inPtr) #define __GLS_SWAP2(inPtr) \ __GLS_SWAP(inPtr, 0, 1); #define __GLS_SWAP4(inPtr) \ __GLS_SWAP(inPtr, 0, 3); \ __GLS_SWAP(inPtr, 1, 2); #define __GLS_SWAP8(inPtr) \ __GLS_SWAP(inPtr, 0, 7); \ __GLS_SWAP(inPtr, 1, 6); \ __GLS_SWAP(inPtr, 2, 5); \ __GLS_SWAP(inPtr, 3, 4); extern const GLubyte __glsBitReverse[256]; extern const GLubyte __glsQuietNaN[8]; extern size_t __glsCeilBase2(size_t inVal); extern size_t __glsLogBase2(size_t inVal); GLulong __glsPtrToULong(const GLvoid *inPtr); GLlong __glsSizeToLong(size_t inSize); #define __glsSwap1(inoutVec) extern void __glsSwap2(GLvoid *inoutVec); extern void __glsSwap2v(size_t inCount, GLvoid *inoutVec); extern void __glsSwap4(GLvoid *inoutVec); extern void __glsSwap4v(size_t inCount, GLvoid *inoutVec); extern void __glsSwap8(GLvoid *inoutVec); extern void __glsSwap8v(size_t inCount, GLvoid *inoutVec); extern GLint __glsSwapi(GLint inVal); extern GLshort __glsSwaps(GLshort inVal); extern void __glsSwapv(GLenum inType, size_t inBytes, GLvoid *inoutVec); /****************************************************************************** String ******************************************************************************/ #define __GLS_STRING_BUF_BYTES 32 typedef GLubyte __GLSstringBuf[__GLS_STRING_BUF_BYTES]; typedef struct { GLubyte *head; GLubyte *tail; GLubyte *bufTail; __GLSstringBuf buf; } __GLSstring; extern GLboolean __glsString_append( __GLSstring *inoutString, const GLubyte* inAppend ); extern GLboolean __glsString_appendChar( __GLSstring *inoutString, GLubyte inAppend ); extern GLboolean __glsString_appendCounted( __GLSstring *inoutString, const GLubyte* inAppend, size_t inCount ); extern GLboolean __glsString_appendInt( __GLSstring *inoutString, const GLubyte *inFormat, GLint inVal ); extern GLboolean __glsString_assign( __GLSstring *inoutString, const GLubyte *inAssign ); extern GLboolean __glsString_assignCounted( __GLSstring *inoutString, const GLubyte *inAssign, size_t inCount ); extern void __glsString_final(__GLSstring *inoutString); extern void __glsString_init(__GLSstring *outString); extern size_t __glsString_length(const __GLSstring *inString); extern void __glsString_reset(__GLSstring *inoutString); extern const GLubyte* __glsUCS1String(const GLubyte *inUTF8String); extern GLboolean __glsValidateString(const GLubyte *inString); /****************************************************************************** Vertex array ******************************************************************************/ #define __GLS_PAD_EIGHT(v) (((v) + 7) & ~7) #define __GLS_EXACT_ARRAY_SIZE(count, size, type) \ ((count) * (size) * __glsTypeSize(type)) #define __GLS_ARRAY_SIZE(count, size, type) \ __GLS_PAD_EIGHT(__GLS_EXACT_ARRAY_SIZE(count, size, type)) typedef struct { GLint size; GLenum type; GLsizei stride; const GLvoid *data; } __GLSsingleArrayState; #define __GLS_VERTEX_ARRAY_ENABLE 0x00000001 #define __GLS_NORMAL_ARRAY_ENABLE 0x00000002 #define __GLS_COLOR_ARRAY_ENABLE 0x00000004 #define __GLS_INDEX_ARRAY_ENABLE 0x00000008 #define __GLS_TEXTURE_COORD_ARRAY_ENABLE 0x00000010 #define __GLS_EDGE_FLAG_ARRAY_ENABLE 0x00000020 #define __GLS_ARRAY_COUNT 6 typedef struct { GLuint enabled; __GLSsingleArrayState vertex; __GLSsingleArrayState normal; __GLSsingleArrayState color; __GLSsingleArrayState index; __GLSsingleArrayState textureCoord; __GLSsingleArrayState edgeFlag; } __GLSarrayState; extern void __glsGetArrayState(struct __GLScontext *ctx, __GLSarrayState *arrayState); extern GLint __glsArrayDataSize(GLsizei count, __GLSarrayState *arrayState); extern void __glsWriteArrayData(struct __GLSwriter *writer, GLint size, GLint first, GLsizei count, GLenum type, const GLvoid *indices, __GLSarrayState *arrayState); extern void __glsSetArrayState(struct __GLScontext *ctx, GLubyte *data); extern GLvoid *__glsSetArrayStateText(struct __GLScontext *ctx, struct __GLSreader *reader, GLuint *enabled, GLsizei *count); extern void __glsDisableArrayState(struct __GLScontext *ctx, GLuint enabled); extern void __glsSwapArrayData(GLubyte *data); typedef struct { void *freePtr; GLuint *indices; GLuint *vertices; GLint vtxCount; } __GLSdrawElementsState; extern GLint __glsDrawElementsDataSize(GLsizei count, GLenum type, const GLvoid *indices, __GLSarrayState *arrayState, __GLSdrawElementsState *deState); extern void __glsWriteDrawElementsData(struct __GLSwriter *writer, GLint size, GLsizei count, __GLSarrayState *arrayState, __GLSdrawElementsState *deState); #if defined(__cplusplus) } #endif #endif /* __glsutil_h_ */