# HG changeset patch # User magedrifaat # Date 1660774283 -7200 # Node ID ae78937e24d2f7bb17615690c9103abf2592e955 # Parent f294b800f0026b105ab424280946c6a8616acfb8 __tiff__.cc: refactored repititive code into functions. diff -r f294b800f002 -r ae78937e24d2 libinterp/corefcn/__tiff__.cc --- a/libinterp/corefcn/__tiff__.cc Wed Aug 17 23:27:54 2022 +0200 +++ b/libinterp/corefcn/__tiff__.cc Thu Aug 18 00:11:23 2022 +0200 @@ -165,6 +165,21 @@ return rows_in_strip; } + void + get_tile_dimensions_validated (TIFF *tif, uint32_t& tile_width, + uint32_t& tile_height) + { + if (! TIFFGetField (tif, TIFFTAG_TILELENGTH, &tile_height)) + error ("Filed to read tile length"); + + if (! TIFFGetField (tif, TIFFTAG_TILEWIDTH, &tile_width)) + error ("Filed to read tile length"); + + if (tile_height == 0 || tile_height % 16 != 0 + || tile_width == 0 || tile_width % 16 != 0) + error ("Tile dimesion tags are invalid"); + } + template octave_value read_strip (TIFF *tif, uint32_t strip_no, tiff_image_data * image_data) @@ -265,17 +280,8 @@ // ASSUMES tiled image and tile_no is a valid zero-based tile // index for the tif image - // TODO(maged): refactor into a function? uint32_t tile_width, tile_height; - if (! TIFFGetField (tif, TIFFTAG_TILELENGTH, &tile_height)) - error ("Filed to read tile length"); - - if (! TIFFGetField (tif, TIFFTAG_TILEWIDTH, &tile_width)) - error ("Filed to read tile length"); - - if (tile_height == 0 || tile_height % 16 != 0 - || tile_width == 0 || tile_width % 16 != 0) - error ("Tile dimesion tags are invalid"); + get_tile_dimensions_validated (tif, tile_width, tile_height); dim_vector tile_dims; if (image_data->planar_configuration == PLANARCONFIG_CONTIG) @@ -924,6 +930,20 @@ return octave_value (retval); } + template + octave_value + make_array (void *data, dim_vector& arr_dims) + { + typedef typename T::element_type P; + + T arr (arr_dims); + for (uint32_t i = 0; i < count; i++) + { + arr(i) = (reinterpret_cast

(data))[i]; + } + retval = octave_value (arr); + } + octave_value interpret_tag_data (void *data, uint32_t count, TIFFDataType tag_datatype) { @@ -932,7 +952,7 @@ // but doesn't do the same for arrays // TODO(maged): matlab returns double for array tags as well, except // for a selected set of tags (e.g. StripByteCounts) - // TODO(maged): refactor for loops + if (count == 1 && tag_datatype != TIFF_ASCII) { retval = interpret_scalar_tag_data (data, tag_datatype); @@ -946,12 +966,7 @@ case TIFF_BYTE: case TIFF_UNDEFINED: { - uint8NDArray arr (arr_dims); - for (uint32_t i = 0; i < count; i++) - { - arr(i) = (reinterpret_cast (data))[i]; - } - retval = octave_value (arr); + retval = make_array (data, arr_dims); break; } case TIFF_ASCII: @@ -961,132 +976,51 @@ } case TIFF_SHORT: { - uint16NDArray arr (arr_dims); - for (uint32_t i = 0; i < count; i++) - { - arr(i) = (reinterpret_cast (data))[i]; - } - retval = octave_value (arr); + retval = make_array (data, arr_dims); break; } case TIFF_LONG: + case TIFF_IFD: { - uint32NDArray arr (arr_dims); - for (uint32_t i = 0; i < count; i++) - { - arr(i) = (reinterpret_cast (data))[i]; - } - retval = octave_value (arr); + retval = make_array (data, arr_dims); break; } case TIFF_LONG8: + case TIFF_IFD8: { - uint64NDArray arr (arr_dims); - for (uint32_t i = 0; i < count; i++) - { - arr(i) = (reinterpret_cast (data))[i]; - } - retval = octave_value (arr); + retval = make_array (data, arr_dims); break; } case TIFF_RATIONAL: + case TIFF_SRATIONAL: + case TIFF_FLOAT: { - NDArray arr (arr_dims); - for (uint32_t i = 0; i < count; i++) - { - arr(i) = (reinterpret_cast (data))[i]; - } - retval = octave_value (arr); + retval = make_array (data, arr_dims).as_double (); break; } case TIFF_SBYTE: { - int8NDArray arr (arr_dims); - for (uint32_t i = 0; i < count; i++) - { - arr(i) = (reinterpret_cast (data))[i]; - } - retval = octave_value (arr); + retval = make_array (data, arr_dims); break; } case TIFF_SSHORT: { - int16NDArray arr (arr_dims); - for (uint32_t i = 0; i < count; i++) - { - arr(i) = (reinterpret_cast (data))[i]; - } - retval = octave_value (arr); + retval = make_array (data, arr_dims); break; } case TIFF_SLONG: { - int32NDArray arr (arr_dims); - for (uint32_t i = 0; i < count; i++) - { - arr(i) = (reinterpret_cast (data))[i]; - } - retval = octave_value (arr); + retval = make_array (data, arr_dims); break; } case TIFF_SLONG8: { - int64NDArray arr (arr_dims); - for (uint32_t i = 0; i < count; i++) - { - arr(i) = (reinterpret_cast (data))[i]; - } - retval = octave_value (arr); - break; - } - case TIFF_FLOAT: - { - NDArray arr (arr_dims); - for (uint32_t i = 0; i < count; i++) - { - arr(i) = (reinterpret_cast (data))[i]; - } - retval = octave_value (arr); + retval = make_array (data, arr_dims); break; } case TIFF_DOUBLE: { - NDArray arr (arr_dims); - for (uint32_t i = 0; i < count; i++) - { - arr(i) = (reinterpret_cast (data))[i]; - } - retval = octave_value (arr); - break; - } - case TIFF_SRATIONAL: - { - NDArray arr (arr_dims); - for (uint32_t i = 0; i < count; i++) - { - arr(i) = (reinterpret_cast (data))[i]; - } - retval = octave_value (arr); - break; - } - case TIFF_IFD: - { - uint32NDArray arr (arr_dims); - for (uint32_t i = 0; i < count; i++) - { - arr(i) = (reinterpret_cast (data))[i]; - } - retval = octave_value (arr); - break; - } - case TIFF_IFD8: - { - uint64NDArray arr (arr_dims); - for (uint32_t i = 0; i < count; i++) - { - arr(i) = (reinterpret_cast (data))[i]; - } - retval = octave_value (arr); + retval = make_array (data, arr_dims); break; } default: @@ -1769,14 +1703,7 @@ tiff_image_data *image_data) { uint32_t tile_width, tile_height; - if (! TIFFGetField (tif, TIFFTAG_TILEWIDTH, &tile_width)) - error ("Failed to get the tile width"); - if (! TIFFGetField (tif, TIFFTAG_TILELENGTH, &tile_height)) - error ("Failed to get the tile length"); - - if (tile_height == 0 || tile_height % 16 != 0 - || tile_width == 0 || tile_width % 16 != 0) - error ("Tile dimesion tags are invalid"); + get_tile_dimensions_validated (tif, tile_width, tile_height); if (tile_no < 1 || tile_no > TIFFNumberOfTiles (tif)) error ("Tile number out of bounds"); @@ -2121,14 +2048,7 @@ // ASSUMES pixel data dimensions are already validated uint32_t tile_width, tile_height; - if (! TIFFGetField (tif, TIFFTAG_TILEWIDTH, &tile_width)) - error ("Failed to get the tile width"); - if (! TIFFGetField (tif, TIFFTAG_TILELENGTH, &tile_height)) - error ("Failed to get the tile length"); - - if (tile_height == 0 || tile_height % 16 != 0 - || tile_width == 0 || tile_width % 16 != 0) - error ("Tile dimesion tags are invalid"); + get_tile_dimensions_validated (tif, tile_width, tile_height); uint32_t tiles_across = (image_data->width + tile_width - 1) / tile_width; @@ -2380,6 +2300,22 @@ } } + octave_value_list + slice_rgba (uint8NDArray rgba_data) + { + Array idx (dim_vector (3, 1)); + idx(0) = idx_vector (':'); + idx(1) = idx_vector (':'); + idx(2) = idx_vector (0, 3); + uint8NDArray rgb = uint8NDArray (rgba_data.index (idx)); + idx(2) = idx_vector (3); + uint8NDArray alpha = uint8NDArray (rgba_data.index (idx)); + + octave_value_list retval (2); + retval(0) = octave_value (rgb); + retval(1) = octave_value (alpha); + return retval; + } #endif DEFUN (__open_tiff__, args, , @@ -2758,18 +2694,7 @@ img = img.permute (perm); // Slice the data into RGB and alpha - Array idx (dim_vector (3, 1)); - idx(0) = idx_vector (':'); - idx(1) = idx_vector (':'); - idx(2) = idx_vector (0, 3); - uint8NDArray rgb = uint8NDArray (img.index (idx)); - idx(2) = idx_vector (3); - uint8NDArray alpha = uint8NDArray (img.index (idx)); - - octave_value_list retval (2); - retval(0) = octave_value (rgb); - retval(1) = octave_value (alpha); - return retval; + return slice_rgba (img); #else err_disabled_feature ("readRGBAImage", "Tiff"); #endif @@ -2859,19 +2784,7 @@ strip_data = strip_data.permute (perm); // Slice the data into RGB and alpha - // TODO(maged): refactor into a function - Array idx (dim_vector (3, 1)); - idx(0) = idx_vector (':'); - idx(1) = idx_vector (':'); - idx(2) = idx_vector (0, 3); - uint8NDArray rgb = uint8NDArray (strip_data.index (idx)); - idx(2) = idx_vector (3); - uint8NDArray alpha = uint8NDArray (strip_data.index (idx)); - - octave_value_list retval (2); - retval(0) = octave_value (rgb); - retval(1) = octave_value (alpha); - return retval; + return slice_rgba (strip_data); #else err_disabled_feature ("readRGBAStrip", "Tiff"); #endif @@ -2970,18 +2883,7 @@ tile_data = tile_data.permute (perm); // Slice the data into RGB and alpha - Array idx (dim_vector (3, 1)); - idx(0) = idx_vector (':'); - idx(1) = idx_vector (':'); - idx(2) = idx_vector (0, 3); - uint8NDArray rgb = uint8NDArray (tile_data.index (idx)); - idx(2) = idx_vector (3); - uint8NDArray alpha = uint8NDArray (tile_data.index (idx)); - - octave_value_list retval (2); - retval(0) = octave_value (rgb); - retval(1) = octave_value (alpha); - return retval; + return slice_rgba (tile_data); #else err_disabled_feature ("readRGBATile", "Tiff"); #endif