Mercurial > hg > minc-tools
changeset 1584:b63401028a94
Added int-to-double and double-to-int conversion functions
author | bert <bert> |
---|---|
date | Wed, 19 Nov 2003 16:08:18 +0000 |
parents | f85953916d10 |
children | 91a864d9ff7c |
files | libsrc2/m2util.c |
diffstat | 1 files changed, 169 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/libsrc2/m2util.c +++ b/libsrc2/m2util.c @@ -364,3 +364,172 @@ out_coord[i] = out_homogeneous[i]; } } + +/** Generic HDF5 integer-to-double converter. + */ +static herr_t +mi2_int_to_dbl(hid_t src_id, + hid_t dst_id, + H5T_cdata_t *cdata, + hsize_t nelements, + size_t buf_stride, + size_t bkg_stride, + void *buf_ptr, + void *bkg_ptr, + hid_t dset_xfer_plist) +{ + double *dptr; + unsigned char *sptr; + int i; + int nb; + H5T_sign_t sg; + double t; + + switch (cdata->command) { + case H5T_CONV_INIT: + nb = H5Tget_size(src_id); + if (nb != 1 && nb != 2 && nb != 4) { + return (-1); + } + break; + + case H5T_CONV_CONV: + nb = H5Tget_size(src_id); + sg = H5Tget_sign(src_id); + + /* Convert starting from "far side" of buffer... (Hope this works!) + */ + dptr = ((double *) buf_ptr) + nelements; + sptr = ((unsigned char *) buf_ptr) + (nelements * nb); + + if (sg == H5T_SGN_2) { + for (i = 0; i < nelements; i++) { + sptr -= nb; + if (nb == 4) { + t = *((int *)sptr); + } + else if (nb == 2) { + t = *((short *)sptr); + } + else if (nb == 1) { + t = *((char *)sptr); + } + *--dptr = t; + } + } + else { + for (i = 0; i < nelements; i++) { + sptr -= nb; + if (nb == 4) { + t = *((unsigned int *)sptr); + } + else if (nb == 2) { + t = *((unsigned short *)sptr); + } + else if (nb == 1) { + t = *((unsigned char *)sptr); + } + *--dptr = t; + } + } + break; + + case H5T_CONV_FREE: + break; + + default: + /* Unknown command */ + return (-1); + } + return (0); +} + +/** Generic HDF5 double-to-integer converter. + */ +static herr_t +mi2_dbl_to_int(hid_t src_id, + hid_t dst_id, + H5T_cdata_t *cdata, + hsize_t nelements, + size_t buf_stride, + size_t bkg_stride, + void *buf_ptr, + void *bkg_ptr, + hid_t dset_xfer_plist) +{ + unsigned char *uptr; + double *dptr; + int i; + int nb; + H5T_sign_t sg; + double t; /* Signed data */ + + switch (cdata->command) { + case H5T_CONV_INIT: + nb = H5Tget_size(src_id); + fprintf(stderr, "d2i(INIT): %d\n", nb); + if (nb != 8) { + return (-1); + } + break; + + case H5T_CONV_CONV: + nb = H5Tget_size(dst_id); + sg = H5Tget_sign(dst_id); + uptr = (unsigned char *) buf_ptr; + dptr = (double *) buf_ptr; + + if (sg == H5T_SGN_2) { + for (i = 0; i < nelements; i++) { + t = rint(*dptr++); + if (nb == 4) { + *((int *)uptr) = (int) t; + } + else if (nb == 2) { + *((short *)uptr) = (short) t; + } + else if (nb == 1) { + *((char *)uptr) = (char) t; + } + uptr += nb; + } + } + else { + for (i = 0; i < nelements; i++) { + t = rint(*dptr++); + if (nb == 4) { + *((unsigned int *)uptr) = (unsigned int) t; + } + else if (nb == 2) { + *((unsigned short *)uptr) = (unsigned short) t; + } + else if (nb == 1) { + *((unsigned char *)uptr) = (unsigned char) t; + } + uptr += nb; + } + } + break; + + case H5T_CONV_FREE: + break; + + default: + /* Unknown command */ + return (-1); + } + return (0); +} + +/** Initialize some critical pieces of the library. + */ +void +miinit(void) +{ + H5Tregister(H5T_PERS_SOFT, "i2d", H5T_NATIVE_INT, H5T_NATIVE_DOUBLE, + mi2_int_to_dbl); + + H5Tregister(H5T_PERS_SOFT, "d2i", H5T_NATIVE_DOUBLE, H5T_NATIVE_INT, + mi2_dbl_to_int); +} +