# HG changeset patch # User magedrifaat # Date 1658436241 -7200 # Node ID e8d1cc309bc9373f56ddc2980654c6e20571e5c7 # Parent 0bcb35909ef41e57347585eae6c25e972416d92d Tiff: added initial implementation of setTag function for scalar tags * __tiff__.cc(F__tiff_set_tag): Added internal function for setTag. * __tiff__.cc(set_field_data): Implemented support for scalar tags only. * Tiff.m(setTag): Added setTag method. diff -r 0bcb35909ef4 -r e8d1cc309bc9 libinterp/dldfcn/__tiff__.cc --- a/libinterp/dldfcn/__tiff__.cc Thu Jul 21 20:03:43 2022 +0200 +++ b/libinterp/dldfcn/__tiff__.cc Thu Jul 21 22:44:01 2022 +0200 @@ -641,6 +641,7 @@ // TODO(maged): test this function vs actual data type size int type_size = TIFFDataWidth (TIFFFieldDataType (fip)); + // TODO(maged): use shared pointer instead of malloc void *data = _TIFFmalloc (type_size); validate_tiff_get_field (TIFFGetField (tif, tag_id, data), data); octave_value tag_data_ov = interpret_tag_data (data, 1, @@ -847,6 +848,18 @@ return tag_data_ov; } + + void + set_field_data (TIFF *tif, const TIFFField *fip, octave_value tag_ov) + { + // TODO(maged): complete the implementation of this function + uint32_t tag_id = TIFFFieldTag (fip); + uint32_t tag_data = tag_ov.double_value (); + + if (! TIFFSetField(tif, tag_id, tag_data)) + error ("Failed to set tag value"); + } + #endif DEFUN_DLD (__open_tiff__, args, nargout, @@ -951,6 +964,52 @@ #endif } + + DEFUN_DLD (__tiff_set_tag__, args, nargout, + "Set the value of a tag in a tiff image") + { +#if defined (HAVE_TIFF) + int nargin = args.length (); + + if (nargin < 2) + error ("Too few arguments provided\n"); + + TIFF *tif = (TIFF *)(args (0).uint64_value ()); + + // TODO(maged): does matlab allow calling this function for images + // opened for reading? + if (args (1).type_name () == "struct") + error ("setTag with struct is not yet supported"); + else + { + const TIFFField *fip; + if (args (1).type_name () == "string") + { + std::string tagName = args (1).string_value (); + fip = TIFFFieldWithName (tif, tagName.c_str ()); + if (! fip) + error ("Tiff tag not found"); + } + else + { + uint32_t tag_id = args (1).int_value (); + fip = TIFFFieldWithTag (tif, tag_id); + if (! fip) + error ("Tiff tag not found"); + } + + if (nargin < 3) + error ("Too few arguments provided"); + + set_field_data (tif, fip, args (2)); + } + + return octave_value_list (); +#else + err_disabled_feature ("setTag", "Tiff"); +#endif + } + DEFUN_DLD (__tiff_read__, args, nargout, "Read the image in the current IFD") { diff -r 0bcb35909ef4 -r e8d1cc309bc9 scripts/io/Tiff.m --- a/scripts/io/Tiff.m Thu Jul 21 20:03:43 2022 +0200 +++ b/scripts/io/Tiff.m Thu Jul 21 22:44:01 2022 +0200 @@ -92,8 +92,12 @@ __close_tiff__(t.tiff_handle); endfunction - function tag = getTag(t, tagName) - tag = __tiff_get_tag__(t.tiff_handle, tagName); + function tag = getTag(t, tag_name) + tag = __tiff_get_tag__(t.tiff_handle, tag_name); + endfunction + + function setTag(t, tag_name, tag_value) + __tiff_set_tag__(t.tiff_handle, tag_name, tag_value); endfunction function argout = read(t)