# HG changeset patch # User magedrifaat # Date 1660260187 -7200 # Node ID b8b6cc05c8eaa7e399273e2acefe132f191e779a # Parent 48d46f7a640bf77cc7826c241d44f0f8bcf30f6e Tiff setTag: added support for tags with array values. diff -r 48d46f7a640b -r b8b6cc05c8ea libinterp/corefcn/__tiff__.cc --- a/libinterp/corefcn/__tiff__.cc Fri Aug 12 00:04:37 2022 +0200 +++ b/libinterp/corefcn/__tiff__.cc Fri Aug 12 01:23:07 2022 +0200 @@ -1197,6 +1197,9 @@ // TODO(maged): check if matlab errors for long data type/range TIFFSetField (tif, tag_id, tag_ov.uint8_scalar_value ()); break; + case TIFF_ASCII: + TIFFSetField (tif, tag_id, tag_ov.string_value ().c_str ()); + break; case TIFF_SHORT: TIFFSetField (tif, tag_id, tag_ov.uint16_scalar_value ()); break; @@ -1243,6 +1246,65 @@ set_array_field_data (TIFF *tif, const TIFFField *fip, octave_value tag_ov, uint32_t count) { + uint32_t tag_id = TIFFFieldTag (fip); + TIFFDataType tag_datatype = TIFFFieldDataType (fip); + + // TODO(maged): validate count? + octave_unused_parameter (count); + + void *data_ptr; + + switch (tag_datatype) + { + case TIFF_BYTE: + case TIFF_UNDEFINED: + // TODO(maged): check if matlab errors for long data type/dimensions + // TODO(maged): should we resize/reshape? + data_ptr = tag_ov.uint8_array_value ().fortran_vec (); + break; + case TIFF_SHORT: + data_ptr = tag_ov.uint16_array_value ().fortran_vec (); + break; + case TIFF_LONG: + data_ptr = tag_ov.uint32_array_value ().fortran_vec (); + break; + case TIFF_LONG8: + data_ptr = tag_ov.uint64_array_value ().fortran_vec (); + break; + case TIFF_RATIONAL: + data_ptr = tag_ov.float_array_value ().fortran_vec (); + break; + case TIFF_SBYTE: + data_ptr = tag_ov.int8_array_value ().fortran_vec (); + break; + case TIFF_SSHORT: + data_ptr = tag_ov.int16_array_value ().fortran_vec (); + break; + case TIFF_SLONG: + data_ptr = tag_ov.int32_array_value ().fortran_vec (); + break; + case TIFF_SLONG8: + data_ptr = tag_ov.int64_array_value ().fortran_vec (); + break; + case TIFF_FLOAT: + data_ptr = tag_ov.float_array_value ().fortran_vec (); + break; + case TIFF_DOUBLE: + data_ptr = tag_ov.array_value ().fortran_vec (); + break; + case TIFF_SRATIONAL: + data_ptr = tag_ov.float_array_value ().fortran_vec (); + break; + case TIFF_IFD: + case TIFF_IFD8: + error ("Unimplemented IFFD data type"); + break; + default: + error ("Unsupported tag data type"); + } + + if (! TIFFSetField (tif, tag_id, data_ptr)) + error ("Failed to set tag"); } void @@ -1290,10 +1352,18 @@ if (bits_per_sample > 16) error ("Too high bit depth for a palette image"); + // TODO(maged): what is matlab behavior for wrong input dimensions uint32_t count = 1 << bits_per_sample; - // uint16_t *red, *green, *blue; - // validate_tiff_get_field (TIFFGetField (tif, TIFFTAG_COLORMAP, - // &red, &green, &blue)); + NDArray array_data = tag_ov.array_value (); + array_data *= UINT16_MAX; + uint16NDArray u16_array = uint16NDArray (array_data); + uint16_t *data_ptr + = reinterpret_cast (u16_array.fortran_vec ()); + uint16_t *red = data_ptr; + uint16_t *green = red + count; + uint16_t *blue = green + count; + if (! TIFFSetField (tif, tag_id, red, green, blue)) + error ("Failed to set tag"); break; } case TIFFTAG_TRANSFERFUNCTION: @@ -1367,10 +1437,7 @@ default: set_scalar_field_data (tif, fip, tag_ov); } - uint32_t tag_data = tag_ov.double_value (); - - if (! TIFFSetField(tif, tag_id, tag_data)) - error ("Failed to set tag value"); + } template