/**************************************************************************** * PROJECT: Balloon 3D Graphics Subsystem for Squeak * FILE: b3dAlloc.c * CONTENT: Memory allocation for the Balloon 3D rasterizer * * AUTHOR: Andreas Raab (ar) * ADDRESS: Walt Disney Imagineering, Glendale, CA * EMAIL: andreasr@wdi.disney.com * RCSID: $Id: b3dAlloc.c 2 2001-10-24 23:11:49Z rowledge $ * * NOTES: * * *****************************************************************************/ #include #include "b3d.h" #ifdef DEBUG_ALLOC /* DEBUG versions of allocators */ B3DPrimitiveFace *dbg_b3dAllocFace(B3DFaceAllocList *list) { B3DPrimitiveFace *result; if(list->firstFree) { result = list->firstFree; list->firstFree = list->firstFree->nextFree; if(result->flags & B3D_ALLOC_FLAG) b3dAbort("list->firstFree has allocation bit set"); } else { if(list->size < list->max) { result = list->data + list->size; list->size++; } else return NULL; } result->nextFree = NULL; result->flags = B3D_ALLOC_FLAG; list->nFree--; return result; } B3DPrimitiveEdge *dbg_b3dAllocEdge(B3DEdgeAllocList *list) { B3DPrimitiveEdge *result; if(list->firstFree) { result = list->firstFree; list->firstFree = list->firstFree->nextFree; if(result->flags & B3D_ALLOC_FLAG) b3dAbort("list->firstFree has allocation bit set"); } else { if(list->size < list->max) { result = list->data + list->size; list->size++; } else return NULL; } result->nextFree = NULL; result->flags = B3D_ALLOC_FLAG; list->nFree--; return result; } void dbg_b3dFreeFace(B3DFaceAllocList *list, B3DPrimitiveFace *face) { if(face < list->data || face >= (list->data + list->size)) b3dAbort("face to free is not in list"); if( ! (face->flags & B3D_ALLOC_FLAG) ) b3dAbort("face to free has no allocation flag set"); face->flags = 0; face->nextFree = list->firstFree; list->firstFree = face; list->nFree++; } void dbg_b3dFreeEdge(B3DEdgeAllocList *list, B3DPrimitiveEdge *edge) { if(edge < list->data || edge >= (list->data + list->size)) b3dAbort("edge to free is not in list"); if( ! (edge->flags & B3D_ALLOC_FLAG) ) b3dAbort("edge to free has no allocation flag set"); edge->flags = 0; edge->nextFree = list->firstFree; list->firstFree = edge; list->nFree++; } B3DPrimitiveAttribute *dbg_b3dAllocSingleAttr(B3DAttrAllocList *list) { B3DPrimitiveAttribute *result; if(list->firstFree) { result = list->firstFree; list->firstFree = list->firstFree->next; } else { if(list->size < list->max) { result = list->data + list->size; list->size++; } else return NULL; } list->nFree--; return result; } int dbg_b3dAllocAttrib(B3DAttrAllocList *attrList, B3DPrimitiveFace *face) { B3DPrimitiveAttribute *firstAttr, *nextAttr; int i, nAttrs = 0; assert(face->attributes == NULL); if(face->flags & B3D_FACE_RGB) nAttrs += 3; if(face->flags & B3D_FACE_ALPHA) nAttrs += 1; if(face->flags & B3D_FACE_STW) nAttrs += 3; if(!nAttrs) return 1; firstAttr = nextAttr = NULL; for(i=0;inext = firstAttr; firstAttr = nextAttr; } face->attributes = firstAttr; return 1; } void dbg_b3dFreeAttrib(B3DAttrAllocList *list, B3DPrimitiveFace *face) { B3DPrimitiveAttribute *attr, *nextAttr = face->attributes; while(nextAttr) { attr = nextAttr; nextAttr = attr->next; if(attr < list->data || attr >= (list->data + list->size)) b3dAbort("attributes to free are not in list"); attr->next = list->firstFree; list->firstFree = attr; list->nFree++; } } #endif /* DEBUG */