PCPOINTLIST * pc_pointlist_from_dimensional(const PCPATCH_DIMENSIONAL *pdl) { PCPOINTLIST *pl; PCPATCH_DIMENSIONAL *pdl_uncompressed; const PCSCHEMA *schema = pdl->schema; int i, j, ndims, npoints; assert(pdl); pdl_uncompressed = pc_patch_dimensional_decompress(pdl); ndims = schema->ndims; npoints = pdl->npoints; pl = pc_pointlist_make(npoints); for ( i = 0; i < npoints; i++ ) { PCPOINT *pt = pc_point_make(schema); for ( j = 0; j < ndims; j++ ) { PCDIMENSION *dim = pc_schema_get_dimension(schema, j); uint8_t *in = pdl_uncompressed->bytes[j].bytes + dim->size * i; uint8_t *out = pt->data + dim->byteoffset; memcpy(out, in, dim->size); } pc_pointlist_add_point(pl, pt); } pc_patch_dimensional_free(pdl_uncompressed); return pl; }
PCPATCH_UNCOMPRESSED * pc_patch_uncompressed_from_dimensional(const PCPATCH_DIMENSIONAL *pdl) { int i, j, npoints; PCPATCH_UNCOMPRESSED *patch; PCPATCH_DIMENSIONAL *pdl_uncompressed; const PCSCHEMA *schema; uint8_t *buf; npoints = pdl->npoints; schema = pdl->schema; patch = pcalloc(sizeof(PCPATCH_UNCOMPRESSED)); patch->type = PC_NONE; patch->readonly = PC_FALSE; patch->schema = schema; patch->npoints = npoints; patch->maxpoints = npoints; patch->bounds = pdl->bounds; patch->stats = pc_stats_clone(pdl->stats); patch->datasize = schema->size * pdl->npoints; patch->data = pcalloc(patch->datasize); buf = patch->data; /* Can only read from uncompressed dimensions */ pdl_uncompressed = pc_patch_dimensional_decompress(pdl); for ( i = 0; i < npoints; i++ ) { for ( j = 0; j < schema->ndims; j++ ) { PCDIMENSION *dim = pc_schema_get_dimension(schema, j); uint8_t *in = pdl_uncompressed->bytes[j].bytes + dim->size * i; uint8_t *out = buf + dim->byteoffset; memcpy(out, in, dim->size); } buf += schema->size; } pc_patch_dimensional_free(pdl_uncompressed); return patch; }