# HG changeset patch # User magedrifaat # Date 1660836223 -7200 # Node ID a1145ac2ce9b8cac9761bf22b3224e3924a81609 # Parent 86f91ea7a64288ef6ac1ad3752bff198a9c2000f Tiff: populated TagID from the C++ map to avoid having two copies * __tiff__.cc (F__tiff_make_tagid__): implemented internal function as initializer for TagID. * Tiff.m: changed the initialization for TagID to use the internal function. diff -r 86f91ea7a642 -r a1145ac2ce9b libinterp/corefcn/__tiff__.cc --- a/libinterp/corefcn/__tiff__.cc Thu Aug 18 16:39:56 2022 +0200 +++ b/libinterp/corefcn/__tiff__.cc Thu Aug 18 17:23:43 2022 +0200 @@ -93,12 +93,13 @@ &bits_per_sample)) error ("Failed to read the BitsPerSample tag"); - // TODO(maged): this doesn't really work for writing as LibTIFF will - // refuse to write unless the tag is set if (! TIFFGetField (tif, TIFFTAG_PLANARCONFIG, &planar_configuration)) // LibTIFF has a bug where it incorrectly returns 0 as a default // value for PlanarConfiguration although the default value is 1 + // This doesn't completely solve the issue as LibTIFF will refuse + // to write data to images of the tag is not set. + // see: https://www.asmail.be/msg0054918184.html planar_configuration = 1; is_tiled = TIFFIsTiled(tif); @@ -107,7 +108,6 @@ // A map of tag names supported by matlab, there are some differences // than LibTIFF's names (e.g. Photometric vs PhotometricInerpretation) - // TODO(maged): use this to initialize TagID to avoid having two copies static const std::map tag_name_map = { {"SubFileType", 254}, {"ImageWidth", 256}, @@ -1073,6 +1073,7 @@ { // Workaround for a bug in LibTIFF where it incorrectly returns // zero as the default value for PlanaConfiguration + // See: https://www.asmail.be/msg0054918184.html if (! TIFFGetField(tif, tag_id, data_ptr)) *reinterpret_cast (data_ptr) = 1; } @@ -3471,4 +3472,12 @@ #endif } + DEFUN (__tiff_make_tagid__, , , + "Create the TagID structure from the internal map") + { + std::map tag_ov_map; + for (auto it = tag_name_map.cbegin (); it != tag_name_map.cend (); it++) + tag_ov_map[it->first] = octave_value (it->second); + return octave_value_list(octave_scalar_map (tag_ov_map)); + } } diff -r 86f91ea7a642 -r a1145ac2ce9b scripts/io/Tiff.m --- a/scripts/io/Tiff.m Thu Aug 18 16:39:56 2022 +0200 +++ b/scripts/io/Tiff.m Thu Aug 18 17:23:43 2022 +0200 @@ -2,77 +2,7 @@ classdef Tiff properties (Constant = true) - TagID = struct ( - "SubFileType", 254, - "ImageWidth", 256, - "ImageLength", 257, - "BitsPerSample", 258, - "Compression", 259, - "Photometric", 262, - "Thresholding", 263, - "FillOrder", 266, - "DocumentName", 269, - "ImageDescription", 270, - "Make", 271, - "Model", 272, - "StripOffsets", 273, - "Orientation", 274, - "SamplesPerPixel", 277, - "RowsPerStrip", 278, - "StripByteCounts", 279, - "MinSampleValue", 280, - "MaxSampleValue", 281, - "XResolution", 282, - "YResolution", 283, - "PlanarConfiguration", 284, - "PageName", 285, - "XPosition", 286, - "YPosition", 287, - "GrayResponseUnit", 290, - 'GrayResponseCurve', 291, - "Group3Options", 292, - "Group4Options", 293, - "ResolutionUnit", 296, - "PageNumber", 297, - "TransferFunction", 301, - "Software", 305, - "DateTime", 306, - "Artist", 315, - "HostComputer", 316, - "WhitePoint", 318, - "PrimaryChromaticities", 319, - "ColorMap", 320, - "HalfToneHints", 321, - "TileWidth", 322, - "TileLength", 323, - "TileOffsets", 324, - "TileByteCounts", 325, - "SubIFD", 330, - "InkSet", 332, - "InkNames", 333, - "NumberOfInks", 334, - "DotRange", 336, - "TargetPrinter", 337, - "ExtraSamples", 338, - "SampleFormat", 339, - "SMinSampleValue", 340, - "SMaxSampleValue", 341, - "YCbCrCoefficients", 529, - "YCbCrSubSampling", 530, - "YCbCrPositioning", 531, - "ReferenceBlackWhite", 532, - "XMP", 700, - "ImageDepth", 32997, - "Copyright", 33432, - "RichTIFFIPTC", 33723, - "Photoshop", 34377, - "ICCProfile", 34675, - "SToNits", 37439, - "JPEGQuality", 65537, - "JPEGColorMode", 65538, - "ZipQuality", 65557, - "SGILogDataFmt", 65560 - ); + TagID = __tiff_make_tagid__ (); Compression = struct ( "None", 1,