# HG changeset patch # User magedrifaat # Date 1656985481 -7200 # Node ID 7c5b8a294f6029224822ec67086bb899320c55bd # Parent b5d59c115e52488bc492e14452fde8c18d3c0150 getTag returns double for scalar values * __tiff__.cc: modified getTag to return double in case of scalar values diff -r b5d59c115e52 -r 7c5b8a294f60 libinterp/dldfcn/__tiff__.cc --- a/libinterp/dldfcn/__tiff__.cc Sun Jul 03 23:53:44 2022 +0200 +++ b/libinterp/dldfcn/__tiff__.cc Tue Jul 05 03:44:41 2022 +0200 @@ -33,6 +33,85 @@ } } + octave_value_list + interpret_scalar(void *data, TIFFDataType tag_datatype) + { + double retval; + + switch (tag_datatype) + { + case TIFF_BYTE: + case TIFF_UNDEFINED: + { + retval = (double)(*((uint8_t *)data)); + break; + } + case TIFF_SHORT: + { + retval = (double)(*((uint16_t *)data)); + break; + } + case TIFF_LONG: + { + retval = (double)(*((uint32_t *)data)); + break; + } + case TIFF_LONG8: + { + retval = (double)(*((uint64_t *)data)); + break; + } + case TIFF_RATIONAL: + { + error ("TIFF_RATIONAL should have at least 2 elements but got only 1"); + break; + } + case TIFF_SBYTE: + { + retval = (double)(*((int8_t *)data)); + break; + } + case TIFF_SSHORT: + { + retval = (double)(*((int16_t *)data)); + break; + } + case TIFF_SLONG: + { + retval = (double)(*((int32_t *)data)); + break; + } + case TIFF_SLONG8: + { + retval = (double)(*((int64_t *)data)); + break; + } + case TIFF_FLOAT: + { + retval = *((float *)data); + break; + } + case TIFF_DOUBLE: + { + retval = *((double *)data); + break; + } + case TIFF_SRATIONAL: + { + error ("TIFF_SRATIONAL should have at least 2 elements but got only 1"); + break; + } + case TIFF_IFD: + case TIFF_IFD8: + error ("Unimplemented IFFD data type"); + break; + default: + error ("Unsupported tag data type"); + } + + return octave_value_list(octave_value(retval)); + } + // Convert memory buffer into suitable octave values // depending on tag_datatype octave_value_list @@ -40,145 +119,154 @@ { // TODO(maged): Find the correct way fo returning multivalues octave_value_list ovl_data; - dim_vector arr_dims (1, count); - - switch (tag_datatype) + // Apparently matlab converts scalar numerical values into double + // but doesn't do the same for arrays + if (count == 1 && tag_datatype != TIFF_ASCII) + { + ovl_data = interpret_scalar (data, tag_datatype); + } + else { - case TIFF_BYTE: - case TIFF_UNDEFINED: - { - uint8NDArray arr (arr_dims); - for (uint32_t i = 0; i < count; i++) + dim_vector arr_dims (1, count); + + switch (tag_datatype) + { + case TIFF_BYTE: + case TIFF_UNDEFINED: { - arr(i) = ((uint8_t *)data)[i]; + uint8NDArray arr (arr_dims); + for (uint32_t i = 0; i < count; i++) + { + arr(i) = ((uint8_t *)data)[i]; + } + ovl_data(0) = arr; + break; } - ovl_data(0) = arr; - break; - } - case TIFF_ASCII: - { - ovl_data(0) = *(char **)data; - break; - } - case TIFF_SHORT: - { - uint16NDArray arr (arr_dims); - for (uint32_t i = 0; i < count; i++) + case TIFF_ASCII: { - arr(i) = ((uint16_t *)data)[i]; + ovl_data(0) = octave_value(*(char **)data); + break; } - ovl_data(0) = arr; - break; - } - case TIFF_LONG: - { - uint32NDArray arr (arr_dims); - for (uint32_t i = 0; i < count; i++) + case TIFF_SHORT: { - arr(i) = ((uint32_t *)data)[i]; + uint16NDArray arr (arr_dims); + for (uint32_t i = 0; i < count; i++) + { + arr(i) = ((uint16_t *)data)[i]; + } + ovl_data(0) = arr; + break; } - ovl_data(0) = arr; - break; - } - case TIFF_LONG8: - { - uint64NDArray arr (arr_dims); - for (uint32_t i = 0; i < count; i++) + case TIFF_LONG: { - arr(i) = ((uint64_t *)data)[i]; + uint32NDArray arr (arr_dims); + for (uint32_t i = 0; i < count; i++) + { + arr(i) = ((uint32_t *)data)[i]; + } + ovl_data(0) = arr; + break; } - ovl_data(0) = arr; - break; - } - case TIFF_RATIONAL: - { - NDArray arr (arr_dims); - for (uint32_t i = 0; i < count; i+=2) + case TIFF_LONG8: { - arr(i / 2) = (float)((uint32_t *)data)[i] - / (float)((uint32_t *)data)[i+1]; + uint64NDArray arr (arr_dims); + for (uint32_t i = 0; i < count; i++) + { + arr(i) = ((uint64_t *)data)[i]; + } + ovl_data(0) = arr; + break; } - ovl_data(0) = arr; - break; - } - case TIFF_SBYTE: - { - int8NDArray arr (arr_dims); - for (uint32_t i = 0; i < count; i++) + case TIFF_RATIONAL: { - arr(i) = ((int8_t *)data)[i]; + NDArray arr (arr_dims); + for (uint32_t i = 0; i < count; i+=2) + { + arr(i / 2) = (float)((uint32_t *)data)[i] + / (float)((uint32_t *)data)[i+1]; + } + ovl_data(0) = arr; + break; } - ovl_data(0) = arr; - break; - } - case TIFF_SSHORT: - { - int16NDArray arr (arr_dims); - for (uint32_t i = 0; i < count; i++) + case TIFF_SBYTE: { - arr(i) = ((int16_t *)data)[i]; + int8NDArray arr (arr_dims); + for (uint32_t i = 0; i < count; i++) + { + arr(i) = ((int8_t *)data)[i]; + } + ovl_data(0) = arr; + break; + } + case TIFF_SSHORT: + { + int16NDArray arr (arr_dims); + for (uint32_t i = 0; i < count; i++) + { + arr(i) = ((int16_t *)data)[i]; + } + ovl_data(0) = arr; + break; } - ovl_data(0) = arr; - break; - } - case TIFF_SLONG: - { - int32NDArray arr (arr_dims); - for (uint32_t i = 0; i < count; i++) + case TIFF_SLONG: { - arr(i) = ((int32_t *)data)[i]; + int32NDArray arr (arr_dims); + for (uint32_t i = 0; i < count; i++) + { + arr(i) = ((int32_t *)data)[i]; + } + ovl_data(0) = arr; + break; } - ovl_data(0) = arr; - break; - } - case TIFF_SLONG8: - { - int64NDArray arr (arr_dims); - for (uint32_t i = 0; i < count; i++) + case TIFF_SLONG8: { - arr(i) = ((int64_t *)data)[i]; + int64NDArray arr (arr_dims); + for (uint32_t i = 0; i < count; i++) + { + arr(i) = ((int64_t *)data)[i]; + } + ovl_data(0) = arr; + break; } - ovl_data(0) = arr; - break; - } - case TIFF_FLOAT: - { - NDArray arr (arr_dims); - for (uint32_t i = 0; i < count; i++) + case TIFF_FLOAT: { - arr(i) = ((float *)data)[i]; + NDArray arr (arr_dims); + for (uint32_t i = 0; i < count; i++) + { + arr(i) = ((float *)data)[i]; + } + ovl_data(0) = arr; + break; } - ovl_data(0) = arr; - break; - } - case TIFF_DOUBLE: - { - NDArray arr (arr_dims); - for (uint32_t i = 0; i < count; i++) - { - arr(i) = ((double *)data)[i]; + case TIFF_DOUBLE: + { + NDArray arr (arr_dims); + for (uint32_t i = 0; i < count; i++) + { + arr(i) = ((double *)data)[i]; + } + ovl_data(0) = arr; + break; + } + case TIFF_SRATIONAL: + { + NDArray arr (arr_dims); + for (uint32_t i = 0; i < count; i+=2) + { + arr(i / 2) = (float)((int32_t *)data)[i] + / (float)((int32_t *)data)[i+1]; + } + ovl_data(0) = arr; + break; + } + case TIFF_IFD: + case TIFF_IFD8: + // TODO(maged): implement IFD datatype? + error ("Unimplemented IFFD data type"); + break; + default: + error ("Unsupported tag data type"); } - ovl_data(0) = arr; - break; - } - case TIFF_SRATIONAL: - { - NDArray arr (arr_dims); - for (uint32_t i = 0; i < count; i+=2) - { - arr(i / 2) = (float)((int32_t *)data)[i] - / (float)((int32_t *)data)[i+1]; - } - ovl_data(0) = arr; - break; - } - case TIFF_IFD: - case TIFF_IFD8: - // TODO(maged): implement IFD datatype? - error ("Unimplemented IFFD data type"); - break; - default: - error ("Unsupported tag data type"); } return ovl_data;