void lwFreeLayer( lwLayer *layer ) { if ( layer ) { if ( layer->name ) free( layer->name ); lwFreePoints( &layer->point ); lwFreePolygons( &layer->polygon ); lwListFree( layer->vmap, lwFreeVMap ); free( layer ); } }
void lwFreeLayer( lwLayer *layer ) { if ( layer ) { if ( layer->name ) _pico_free( layer->name ); lwFreePoints( &layer->point ); lwFreePolygons( &layer->polygon ); lwListFree( layer->vmap, (void *) lwFreeVMap ); _pico_free( layer ); } }
int lwGetPolygons5( picoMemStream_t *fp, int cksize, lwPolygonList *plist, int ptoffset ) { lwPolygon *pp; lwPolVert *pv; unsigned char *buf, *bp; int i, j, nv, nverts, npols; if ( cksize == 0 ) return 1; /* read the whole chunk */ set_flen( 0 ); buf = getbytes( fp, cksize ); if ( !buf ) goto Fail; /* count the polygons and vertices */ nverts = 0; npols = 0; bp = buf; while ( bp < buf + cksize ) { nv = sgetU2( &bp ); nverts += nv; npols++; bp += 2 * nv; i = sgetI2( &bp ); if ( i < 0 ) bp += 2; /* detail polygons */ } if ( !lwAllocPolygons( plist, npols, nverts )) goto Fail; /* fill in the new polygons */ bp = buf; pp = plist->pol + plist->offset; pv = plist->pol[ 0 ].v + plist->voffset; for ( i = 0; i < npols; i++ ) { nv = sgetU2( &bp ); pp->nverts = nv; pp->type = ID_FACE; if ( !pp->v ) pp->v = pv; for ( j = 0; j < nv; j++ ) pv[ j ].index = sgetU2( &bp ) + ptoffset; j = sgetI2( &bp ); if ( j < 0 ) { j = -j; bp += 2; } j -= 1; pp->surf = ( lwSurface * ) j; pp++; pv += nv; } _pico_free( buf ); return 1; Fail: if ( buf ) _pico_free( buf ); lwFreePolygons( plist ); return 0; }
int lwGetPolygons( picoMemStream_t *fp, int cksize, lwPolygonList *plist, int ptoffset ){ lwPolygon *pp; lwPolVert *pv; unsigned char *buf, *bp; int i, j, flags, nv, nverts, npols; unsigned int type; if ( cksize == 0 ) { return 1; } /* read the whole chunk */ set_flen( 0 ); type = getU4( fp ); buf = getbytes( fp, cksize - 4 ); if ( cksize != get_flen() ) { goto Fail; } /* count the polygons and vertices */ nverts = 0; npols = 0; bp = buf; while ( bp < buf + cksize - 4 ) { nv = sgetU2( &bp ); nv &= 0x03FF; nverts += nv; npols++; for ( i = 0; i < nv; i++ ) j = sgetVX( &bp ); } if ( !lwAllocPolygons( plist, npols, nverts ) ) { goto Fail; } /* fill in the new polygons */ bp = buf; pp = plist->pol + plist->offset; pv = plist->pol[ 0 ].v + plist->voffset; for ( i = 0; i < npols; i++ ) { nv = sgetU2( &bp ); flags = nv & 0xFC00; nv &= 0x03FF; pp->nverts = nv; pp->flags = flags; pp->type = type; if ( !pp->v ) { pp->v = pv; } for ( j = 0; j < nv; j++ ) pp->v[ j ].index = sgetVX( &bp ) + ptoffset; pp++; pv += nv; } _pico_free( buf ); return 1; Fail: if ( buf ) { _pico_free( buf ); } lwFreePolygons( plist ); return 0; }