diff --git a/ChangeLog b/ChangeLog index 7b84693d..7e0fd951 100644 --- a/ChangeLog +++ b/ChangeLog @@ -14,6 +14,7 @@ - sharpen restores input colourspace - handle alpha in heifload / heifsave [meyermarcel] - add @interpretation and @format to rawload +- nifti load/save uses double for all floating point metadata 31/8/19 started 8.8.3 - revert sharpen restoring the input colourspace diff --git a/libvips/foreign/niftiload.c b/libvips/foreign/niftiload.c index 11461843..ef49a8fa 100644 --- a/libvips/foreign/niftiload.c +++ b/libvips/foreign/niftiload.c @@ -2,6 +2,9 @@ * * 29/6/18 * - from fitsload.c + * 9/9/19 + * - use double for all floating point scalar metadata, like other loaders + * - remove stray use of "n" property */ /* @@ -207,22 +210,22 @@ static VipsForeignNiftiFields vips_foreign_nifti_fields[] = { { "nv", G_TYPE_INT, G_STRUCT_OFFSET( nifti_image, nv ) }, { "nw", G_TYPE_INT, G_STRUCT_OFFSET( nifti_image, nw ) }, - { "dx", G_TYPE_FLOAT, G_STRUCT_OFFSET( nifti_image, dx ) }, - { "dy", G_TYPE_FLOAT, G_STRUCT_OFFSET( nifti_image, dy ) }, - { "dz", G_TYPE_FLOAT, G_STRUCT_OFFSET( nifti_image, dz ) }, - { "dt", G_TYPE_FLOAT, G_STRUCT_OFFSET( nifti_image, dt ) }, - { "du", G_TYPE_FLOAT, G_STRUCT_OFFSET( nifti_image, du ) }, - { "dv", G_TYPE_FLOAT, G_STRUCT_OFFSET( nifti_image, dv ) }, - { "dw", G_TYPE_FLOAT, G_STRUCT_OFFSET( nifti_image, dw ) }, + { "dx", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, dx ) }, + { "dy", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, dy ) }, + { "dz", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, dz ) }, + { "dt", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, dt ) }, + { "du", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, du ) }, + { "dv", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, dv ) }, + { "dw", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, dw ) }, - { "scl_slope", G_TYPE_FLOAT, + { "scl_slope", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, scl_slope ) }, - { "scl_inter", G_TYPE_FLOAT, + { "scl_inter", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, scl_inter ) }, - { "cal_min", G_TYPE_FLOAT, + { "cal_min", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, cal_min ) }, - { "cal_max", G_TYPE_FLOAT, + { "cal_max", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, cal_max ) }, { "qform_code", G_TYPE_INT, @@ -243,61 +246,61 @@ static VipsForeignNiftiFields vips_foreign_nifti_fields[] = { G_STRUCT_OFFSET( nifti_image, slice_start ) }, { "slice_end", G_TYPE_INT, G_STRUCT_OFFSET( nifti_image, slice_end ) }, - { "slice_duration", G_TYPE_FLOAT, + { "slice_duration", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, slice_duration ) }, - { "quatern_b", G_TYPE_FLOAT, + { "quatern_b", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, quatern_b ) }, - { "quatern_c", G_TYPE_FLOAT, + { "quatern_c", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, quatern_c ) }, - { "quatern_d", G_TYPE_FLOAT, + { "quatern_d", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, quatern_d ) }, - { "qoffset_x", G_TYPE_FLOAT, + { "qoffset_x", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, qoffset_x ) }, - { "qoffset_y", G_TYPE_FLOAT, + { "qoffset_y", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, qoffset_y ) }, - { "qoffset_z", G_TYPE_FLOAT, + { "qoffset_z", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, qoffset_z ) }, - { "qfac", G_TYPE_FLOAT, + { "qfac", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, qfac ) }, - { "sto_xyz00", G_TYPE_FLOAT, + { "sto_xyz00", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, sto_xyz.m[0][0] ) }, - { "sto_xyz01", G_TYPE_FLOAT, + { "sto_xyz01", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, sto_xyz.m[0][1] ) }, - { "sto_xyz02", G_TYPE_FLOAT, + { "sto_xyz02", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, sto_xyz.m[0][2] ) }, - { "sto_xyz03", G_TYPE_FLOAT, + { "sto_xyz03", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, sto_xyz.m[0][3] ) }, - { "sto_xyz10", G_TYPE_FLOAT, + { "sto_xyz10", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, sto_xyz.m[1][0] ) }, - { "sto_xyz11", G_TYPE_FLOAT, + { "sto_xyz11", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, sto_xyz.m[1][1] ) }, - { "sto_xyz12", G_TYPE_FLOAT, + { "sto_xyz12", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, sto_xyz.m[1][2] ) }, - { "sto_xyz13", G_TYPE_FLOAT, + { "sto_xyz13", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, sto_xyz.m[1][3] ) }, - { "sto_xyz20", G_TYPE_FLOAT, + { "sto_xyz20", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, sto_xyz.m[2][0] ) }, - { "sto_xyz21", G_TYPE_FLOAT, + { "sto_xyz21", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, sto_xyz.m[2][1] ) }, - { "sto_xyz22", G_TYPE_FLOAT, + { "sto_xyz22", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, sto_xyz.m[2][2] ) }, - { "sto_xyz23", G_TYPE_FLOAT, + { "sto_xyz23", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, sto_xyz.m[2][3] ) }, - { "sto_xyz30", G_TYPE_FLOAT, + { "sto_xyz30", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, sto_xyz.m[3][0] ) }, - { "sto_xyz31", G_TYPE_FLOAT, + { "sto_xyz31", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, sto_xyz.m[3][1] ) }, - { "sto_xyz32", G_TYPE_FLOAT, + { "sto_xyz32", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, sto_xyz.m[3][2] ) }, - { "sto_xyz33", G_TYPE_FLOAT, + { "sto_xyz33", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, sto_xyz.m[3][3] ) }, - { "toffset", G_TYPE_FLOAT, + { "toffset", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, toffset ) }, { "xyz_units", G_TYPE_INT, @@ -309,11 +312,11 @@ static VipsForeignNiftiFields vips_foreign_nifti_fields[] = { G_STRUCT_OFFSET( nifti_image, nifti_type ) }, { "intent_code", G_TYPE_INT, G_STRUCT_OFFSET( nifti_image, intent_code ) }, - { "intent_p1", G_TYPE_FLOAT, + { "intent_p1", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, intent_p1 ) }, - { "intent_p2", G_TYPE_FLOAT, + { "intent_p2", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, intent_p2 ) }, - { "intent_p3", G_TYPE_FLOAT, + { "intent_p3", G_TYPE_DOUBLE, G_STRUCT_OFFSET( nifti_image, intent_p3 ) }, }; @@ -349,8 +352,11 @@ vips_gvalue_read( GValue *value, void *p ) g_value_set_int( value, *((int *) p) ); break; - case G_TYPE_FLOAT: - g_value_set_float( value, *((float *) p) ); + case G_TYPE_DOUBLE: + /* We set as double rather than float, as things like pyvips + * expect double for metadata items. + */ + g_value_set_double( value, *((float *) p) ); break; default: @@ -505,8 +511,7 @@ vips_foreign_load_nifti_set_header( VipsForeignLoadNifti *nifti, vips_image_set_blob_copy( out, txt, ext->edata, ext->esize ); } - if( vips_object_argument_isset( VIPS_OBJECT( nifti ), "n" ) ) - vips_image_set_int( out, VIPS_META_PAGE_HEIGHT, nim->ny ); + vips_image_set_int( out, VIPS_META_PAGE_HEIGHT, nim->ny ); return( 0 ); } diff --git a/libvips/foreign/niftisave.c b/libvips/foreign/niftisave.c index 89d59243..4de24b87 100644 --- a/libvips/foreign/niftisave.c +++ b/libvips/foreign/niftisave.c @@ -2,6 +2,8 @@ * * 5/7/18 * - from fitssave.c + * 9/9/19 + * - use double for all floating point scalar metadata, like other loaders */ /* @@ -193,8 +195,8 @@ vips_gvalue_write( GValue *value, void *p ) *((int *) p) = g_value_get_int( value ); break; - case G_TYPE_FLOAT: - *((float *) p) = g_value_get_float( value ); + case G_TYPE_DOUBLE: + *((float *) p) = g_value_get_double( value ); break; default: