Example #1
0
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;
}