# HG changeset patch # User magedrifaat # Date 1660848246 -7200 # Node ID 90eccc78d9583a59fd99d4a7f08f481f3f944892 # Parent a1145ac2ce9b8cac9761bf22b3224e3924a81609 __tiff__.cc (get_field_data, set_field_data): added support for complex tags. diff -r a1145ac2ce9b -r 90eccc78d958 libinterp/corefcn/__tiff__.cc --- a/libinterp/corefcn/__tiff__.cc Thu Aug 18 17:23:43 2022 +0200 +++ b/libinterp/corefcn/__tiff__.cc Thu Aug 18 20:44:06 2022 +0200 @@ -1105,7 +1105,6 @@ octave_value tag_data_ov; uint32_t tag_id = TIFFFieldTag (fip); - // TODO(maged): find/create images to test the special tags switch (tag_id) { case TIFFTAG_STRIPBYTECOUNTS: @@ -1267,14 +1266,19 @@ TIFFFieldDataType (fip)); break; } - // TODO(maged): These tags are more complex to implement - // will be implemented and tested later. case TIFFTAG_XMLPACKET: case TIFFTAG_RICHTIFFIPTC: case TIFFTAG_PHOTOSHOP: case TIFFTAG_ICCPROFILE: { - error ("Complex Tags not implemented"); + uint32_t count; + uint8_t *data; + validate_tiff_get_field (TIFFGetField (tif, tag_id, + &count, &data)); + tag_data_ov = interpret_tag_data (data, count, TIFF_BYTE); + // Matlab returns XMP tag as char array not byte array + if (tag_id == TIFFTAG_XMLPACKET) + tag_data_ov = octave_value (tag_data_ov.char_array_value ()); break; } // These tags are not mentioned in the LibTIFF documentation @@ -1456,7 +1460,6 @@ { uint32_t tag_id = TIFFFieldTag (fip); - // TODO(maged): find/create images to test the special tags switch (tag_id) { case TIFFTAG_YCBCRCOEFFICIENTS: @@ -1588,14 +1591,15 @@ error ("Failed to set field"); break; } - // TODO(maged): These tags are more complex to implement - // will be implemented and tested later. case TIFFTAG_XMLPACKET: case TIFFTAG_RICHTIFFIPTC: case TIFFTAG_PHOTOSHOP: case TIFFTAG_ICCPROFILE: { - error ("Complex Tags not implemented"); + uint8NDArray data_array = tag_ov.uint8_array_value (); + uint32_t count = data_array.numel (); + if (! TIFFSetField (tif, tag_id, count, data_array.data ())) + error ("Failed to set field"); break; } // These tags are not mentioned in the LibTIFF documentation @@ -2035,8 +2039,8 @@ strip_size = rows_in_strip * image_data->width * sizeof (P); if (image_data->planar_configuration == PLANARCONFIG_CONTIG) strip_size *= image_data->samples_per_pixel; - if (! TIFFWriteEncodedStrip (tif, strip, pixel_fvec, strip_size)) - error ("Failed to rite strip data"); + if (TIFFWriteEncodedStrip (tif, strip, pixel_fvec, strip_size) == -1) + error ("Failed to write strip data"); pixel_fvec += strip_size; } else if (image_data->bits_per_sample == 1) @@ -2149,7 +2153,7 @@ || image_data->bits_per_sample == 32 || image_data->bits_per_sample == 64) { - if (! TIFFWriteEncodedTile (tif, tile, pixel_fvec, tile_size)) + if (TIFFWriteEncodedTile (tif, tile, pixel_fvec, tile_size) == -1) error ("Failed to write tile data"); pixel_fvec += tile_size; } diff -r a1145ac2ce9b -r 90eccc78d958 scripts/io/Tiff.m --- a/scripts/io/Tiff.m Thu Aug 18 17:23:43 2022 +0200 +++ b/scripts/io/Tiff.m Thu Aug 18 20:44:06 2022 +0200 @@ -28,9 +28,8 @@ "JBIG", 34661, "SGILog", 34676, "SGILog24", 34677, + # Not implemented in LibTIFF "JPEG2000", 34712, - # Not defined in LibTIFF, only in matlab - # TODO(maged): test these compression methods "JPEG2000_SVS_YCbCr", 33003, "JPEG2000_SVS_RGB", 33005 );