diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/H5Zscaleoffset.c | 88 |
1 files changed, 38 insertions, 50 deletions
diff --git a/src/H5Zscaleoffset.c b/src/H5Zscaleoffset.c index 81e5eb5..b8f698b 100644 --- a/src/H5Zscaleoffset.c +++ b/src/H5Zscaleoffset.c @@ -321,7 +321,6 @@ H5Z_class_t H5Z_SCALEOFFSET[1] = {{ *minbits = H5Z_scaleoffset_log2(span+1); \ } else /* minbits already set, only calculate min */ \ H5Z_scaleoffset_min_1(i, d_nelmts, buf, filval, min) \ - *minval = min; \ if(*minbits != sizeof(type)*8) /* change values if minbits != full precision */ \ for(i = 0; i < d_nelmts; i++) \ buf[i] = (buf[i] == filval)?(((type)1 << *minbits) - 1):(buf[i] - min); \ @@ -333,10 +332,10 @@ H5Z_class_t H5Z_SCALEOFFSET[1] = {{ *minbits = H5Z_scaleoffset_log2(span); \ } else /* minbits already set, only calculate min */ \ H5Z_scaleoffset_min_2(i, d_nelmts, buf, min) \ - *minval = min; \ if(*minbits != sizeof(type)*8) /* change values if minbits != full precision */ \ for(i = 0; i < d_nelmts; i++) buf[i] -= min; \ } \ + *minval = min; \ } /* Precompress for signed integer type */ @@ -354,7 +353,6 @@ H5Z_class_t H5Z_SCALEOFFSET[1] = {{ *minbits = H5Z_scaleoffset_log2(span+1); \ } else /* minbits already set, only calculate min */ \ H5Z_scaleoffset_min_1(i, d_nelmts, buf, filval, min) \ - *minval = min; \ if(*minbits != sizeof(type)*8) /* change values if minbits != full precision */ \ for(i = 0; i < d_nelmts; i++) \ buf[i] = (buf[i] == filval)?(((unsigned type)1 << *minbits) - 1):(buf[i] - min); \ @@ -366,23 +364,10 @@ H5Z_class_t H5Z_SCALEOFFSET[1] = {{ *minbits = H5Z_scaleoffset_log2(span); \ } else /* minbits already set, only calculate min */ \ H5Z_scaleoffset_min_2(i, d_nelmts, buf, min) \ - *minval = min; \ if(*minbits != sizeof(type)*8) /* change values if minbits != full precision */ \ for(i = 0; i < d_nelmts; i++) buf[i] -= min; \ } \ -} - -/* Calculate the span for floating-point type */ -#define H5Z_scaleoffset_calc_span(type, span, max, min, D_val) \ -{ \ - if(sizeof(type)==sizeof(int)) \ - span = (unsigned int)H5Z_scaleoffset_rnd(max*HDpow(10,D_val)-min*HDpow(10,D_val)) + 1; \ - else if(sizeof(type)==sizeof(long)) \ - span = (unsigned long)H5Z_scaleoffset_rnd(max*HDpow(10,D_val)-min*HDpow(10,D_val)) + 1;\ - else if(sizeof(type)==sizeof(long_long)) \ - span = (unsigned long_long)H5Z_scaleoffset_rnd(max*HDpow(10,D_val)-min*HDpow(10,D_val)) + 1;\ - else \ - HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "cannot find matched integer dataype") \ + *minval = min; \ } /* Modify values of data in precompression if fill value defined for floating-point type */ @@ -391,56 +376,62 @@ H5Z_class_t H5Z_SCALEOFFSET[1] = {{ if(sizeof(type)==sizeof(int)) \ for(i = 0; i < d_nelmts; i++) { \ if(HDfabs(buf[i] - filval) < HDpow(10, -D_val)) \ - buf[i] = ((unsigned int)1 << *minbits) - 1; \ + *(int *)&buf[i] = ((unsigned int)1 << *minbits) - 1; \ else \ - buf[i] = buf[i]*HDpow(10, D_val) - min*HDpow(10, D_val); \ + *(int *)&buf[i] = H5Z_scaleoffset_rnd( \ + buf[i]*HDpow(10, D_val) - min*HDpow(10, D_val)); \ } \ else if(sizeof(type)==sizeof(long)) \ for(i = 0; i < d_nelmts; i++) { \ if(HDfabs(buf[i] - filval) < HDpow(10, -D_val)) \ - buf[i] = ((unsigned long)1 << *minbits) - 1; \ + *(long *)&buf[i] = ((unsigned long)1 << *minbits) - 1; \ else \ - buf[i] = buf[i]*HDpow(10, D_val) - min*HDpow(10, D_val); \ + *(long *)&buf[i] = H5Z_scaleoffset_rnd( \ + buf[i]*HDpow(10, D_val) - min*HDpow(10, D_val)); \ } \ else if(sizeof(type)==sizeof(long_long)) \ for(i = 0; i < d_nelmts; i++) { \ if(HDfabs(buf[i] - filval) < HDpow(10, -D_val)) \ - buf[i] = ((unsigned long_long)1 << *minbits) - 1; \ + *(long_long *)&buf[i] = ((unsigned long_long)1 << *minbits) - 1; \ else \ - buf[i] = buf[i]*HDpow(10, D_val) - min*HDpow(10, D_val); \ + *(long_long *)&buf[i] = H5Z_scaleoffset_rnd( \ + buf[i]*HDpow(10, D_val) - min*HDpow(10, D_val)); \ } \ else \ HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "cannot find matched integer dataype")\ } -/* Save the minimum value for floating-point type */ -#define H5Z_scaleoffset_save_min(i, type, minval, min) \ +/* Modify values of data in precompression if fill value undefined for floating-point type */ +#define H5Z_scaleoffset_modify_2(i, type, buf, d_nelmts, min, D_val) \ { \ if(sizeof(type)==sizeof(int)) \ - for(i = 0; i < sizeof(int); i++) \ - ((unsigned char *)minval)[i] = (*(int *)&min & ((int)0xff << i*8)) >> i*8; \ + for(i = 0; i < d_nelmts; i++) \ + *(int *)&buf[i] = H5Z_scaleoffset_rnd( \ + buf[i]*HDpow(10, D_val) - min*HDpow(10, D_val)); \ else if(sizeof(type)==sizeof(long)) \ - for(i = 0; i < sizeof(long); i++) \ - ((unsigned char *)minval)[i] = (*(long *)&min & ((long)0xff << i*8)) >> i*8; \ + for(i = 0; i < d_nelmts; i++) \ + *(long *)&buf[i] = H5Z_scaleoffset_rnd( \ + buf[i]*HDpow(10, D_val) - min*HDpow(10, D_val)); \ else if(sizeof(type)==sizeof(long_long)) \ - for(i = 0; i < sizeof(long_long); i++) \ - ((unsigned char *)minval)[i] = (*(long_long *)&min & ((long_long)0xff << i*8)) >> i*8;\ + for(i = 0; i < d_nelmts; i++) \ + *(long_long *)&buf[i] = H5Z_scaleoffset_rnd( \ + buf[i]*HDpow(10, D_val) - min*HDpow(10, D_val)); \ else \ HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "cannot find matched integer dataype")\ } -/* Round floating-point values to integers */ -#define H5Z_scaleoffset_round(i, type, d_nelmts, buf) \ +/* Save the minimum value for floating-point type */ +#define H5Z_scaleoffset_save_min(i, type, minval, min) \ { \ if(sizeof(type)==sizeof(int)) \ - for(i = 0; i < d_nelmts; i++) \ - *(int *)&buf[i] = (int)H5Z_scaleoffset_rnd(buf[i]); \ + for(i = 0; i < sizeof(int); i++) \ + ((unsigned char *)minval)[i] = (*(int *)&min & ((int)0xff << i*8)) >> i*8; \ else if(sizeof(type)==sizeof(long)) \ - for(i = 0; i < d_nelmts; i++) \ - *(long *)&buf[i] = (long)H5Z_scaleoffset_rnd(buf[i]); \ + for(i = 0; i < sizeof(long); i++) \ + ((unsigned char *)minval)[i] = (*(long *)&min & ((long)0xff << i*8)) >> i*8; \ else if(sizeof(type)==sizeof(long_long)) \ - for(i = 0; i < d_nelmts; i++) \ - *(long_long *)&buf[i] = (long_long)H5Z_scaleoffset_rnd(buf[i]); \ + for(i = 0; i < sizeof(long_long); i++) \ + ((unsigned char *)minval)[i] = (*(long_long *)&min & ((long_long)0xff << i*8)) >> i*8;\ else \ HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "cannot find matched integer dataype")\ } @@ -456,21 +447,19 @@ H5Z_class_t H5Z_SCALEOFFSET[1] = {{ H5Z_scaleoffset_get_filval_2(i, type, filval_buf, filval) \ H5Z_scaleoffset_max_min_3(i, d_nelmts, buf, filval, max, min, D_val) \ H5Z_scaleoffset_check_3(i, type, max, min, minbits, D_val) \ - H5Z_scaleoffset_calc_span(type, span, max, min, D_val) \ + span = H5Z_scaleoffset_rnd(max*HDpow(10,D_val) - min*HDpow(10,D_val)) + 1; \ *minbits = H5Z_scaleoffset_log2(span+1); \ if(*minbits != sizeof(type)*8) /* change values if minbits != full precision */ \ H5Z_scaleoffset_modify_1(i, type, buf, d_nelmts, filval, minbits, min, D_val) \ } else { /* fill value undefined */ \ H5Z_scaleoffset_max_min_2(i, d_nelmts, buf, max, min) \ H5Z_scaleoffset_check_3(i, type, max, min, minbits, D_val) \ - H5Z_scaleoffset_calc_span(type, span, max, min, D_val) \ + span = H5Z_scaleoffset_rnd(max*HDpow(10,D_val) - min*HDpow(10,D_val)) + 1; \ *minbits = H5Z_scaleoffset_log2(span); \ if(*minbits != sizeof(type)*8) /* change values if minbits != full precision */ \ - for(i = 0; i < d_nelmts; i++) \ - buf[i] = buf[i]*HDpow(10, D_val) - min*HDpow(10, D_val); \ + H5Z_scaleoffset_modify_2(i, type, buf, d_nelmts, min, D_val) \ } \ H5Z_scaleoffset_save_min(i, type, minval, min) \ - H5Z_scaleoffset_round(i, type, d_nelmts, buf) \ } /* Postdecompress for unsigned integer type */ @@ -522,7 +511,7 @@ H5Z_class_t H5Z_SCALEOFFSET[1] = {{ } /* Modify values of data in postdecompression if fill value defined for floating-point type */ -#define H5Z_scaleoffset_modify_2(i, type, buf, d_nelmts, filval, minbits, min, D_val) \ +#define H5Z_scaleoffset_modify_3(i, type, buf, d_nelmts, filval, minbits, min, D_val) \ { \ if(sizeof(type)==sizeof(int)) \ for(i = 0; i < d_nelmts; i++) \ @@ -541,7 +530,7 @@ H5Z_class_t H5Z_SCALEOFFSET[1] = {{ } /* Modify values of data in postdecompression if fill value undefined for floating-point type */ -#define H5Z_scaleoffset_modify_3(i, type, buf, d_nelmts, min, D_val) \ +#define H5Z_scaleoffset_modify_4(i, type, buf, d_nelmts, min, D_val) \ { \ if(sizeof(type)==sizeof(int)) \ for(i = 0; i < d_nelmts; i++) \ @@ -566,9 +555,9 @@ H5Z_class_t H5Z_SCALEOFFSET[1] = {{ \ if(filavail == H5Z_SCALEOFFSET_FILL_DEFINED) { /* fill value defined */ \ H5Z_scaleoffset_get_filval_2(i, type, filval_buf, filval) \ - H5Z_scaleoffset_modify_2(i, type, buf, d_nelmts, filval, minbits, min, D_val) \ + H5Z_scaleoffset_modify_3(i, type, buf, d_nelmts, filval, minbits, min, D_val) \ } else /* fill value undefined */ \ - H5Z_scaleoffset_modify_3(i, type, buf, d_nelmts, min, D_val) \ + H5Z_scaleoffset_modify_4(i, type, buf, d_nelmts, min, D_val) \ } @@ -1264,7 +1253,6 @@ H5Z_scaleoffset_precompress_i(void *data, unsigned d_nelmts, enum H5Z_scaleoffse *minbits = H5Z_scaleoffset_log2(span+1); } else /* minbits already set, only calculate min */ H5Z_scaleoffset_min_1(i, d_nelmts, buf, filval, min) - *minval = min; if(*minbits != sizeof(signed char)*8) /* change values if minbits != full precision */ for(i = 0; i < d_nelmts; i++) buf[i] = (buf[i] == filval)?(((unsigned char)1 << *minbits) - 1):(buf[i] - min); @@ -1279,10 +1267,10 @@ H5Z_scaleoffset_precompress_i(void *data, unsigned d_nelmts, enum H5Z_scaleoffse *minbits = H5Z_scaleoffset_log2(span); } else /* minbits already set, only calculate min */ H5Z_scaleoffset_min_2(i, d_nelmts, buf, min) - *minval = min; if(*minbits != sizeof(signed char)*8) /* change values if minbits != full precision */ for(i = 0; i < d_nelmts; i++) buf[i] -= min; } + *minval = min; } else if(type == t_short) H5Z_scaleoffset_precompress_2(short, data, d_nelmts, |