changeset 31180:ae78937e24d2

__tiff__.cc: refactored repititive code into functions.
author magedrifaat <magedrifaat@gmail.com>
date Thu, 18 Aug 2022 00:11:23 +0200
parents f294b800f002
children 8a4ef572077d
files libinterp/corefcn/__tiff__.cc
diffstat 1 files changed, 66 insertions(+), 164 deletions(-) [+]
line wrap: on
line diff
--- 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 <typename T>
   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 <typename T>
+  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<P *> (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<uint8_t *> (data))[i];
-                }
-              retval = octave_value (arr);
+              retval = make_array<uint8NDArray> (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<uint16_t *> (data))[i];
-                }
-              retval = octave_value (arr);
+              retval = make_array<uint16NDArray> (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<uint32_t *> (data))[i];
-                }
-              retval = octave_value (arr);
+              retval = make_array<uint32NDArray> (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<uint64_t *> (data))[i];
-                }
-              retval = octave_value (arr);
+              retval = make_array<uint64NDArray> (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<float *> (data))[i];
-                }
-              retval = octave_value (arr);
+              retval = make_array<FloatNDArray> (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<int8_t *> (data))[i];
-                }
-              retval = octave_value (arr);
+              retval = make_array<int8NDArray> (data, arr_dims);
               break;
             }
           case TIFF_SSHORT:
             {
-              int16NDArray arr (arr_dims);
-              for (uint32_t i = 0; i < count; i++)
-                {
-                  arr(i) = (reinterpret_cast<int16_t *> (data))[i];
-                }
-              retval = octave_value (arr);
+              retval = make_array<int16NDArray> (data, arr_dims);
               break;
             }
           case TIFF_SLONG:
             {
-              int32NDArray arr (arr_dims);
-              for (uint32_t i = 0; i < count; i++)
-                {
-                  arr(i) = (reinterpret_cast<int32_t *> (data))[i];
-                }
-              retval = octave_value (arr);
+              retval = make_array<int32NDArray> (data, arr_dims);
               break;
             }
           case TIFF_SLONG8:
             {
-              int64NDArray arr (arr_dims);
-              for (uint32_t i = 0; i < count; i++)
-                {
-                  arr(i) = (reinterpret_cast<int64_t *> (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<float *> (data))[i];
-                }
-              retval = octave_value (arr);
+              retval = make_array<int64NDArray> (data, arr_dims);
               break;
             }
           case TIFF_DOUBLE:
             {
-              NDArray arr (arr_dims);
-              for (uint32_t i = 0; i < count; i++)
-              {
-                  arr(i) = (reinterpret_cast<double *> (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<float *> (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<uint32_t *> (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<uint64_t *> (data))[i];
-                }
-              retval = octave_value (arr);
+              retval = make_array<NDArray> (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_vector> 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_vector> 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_vector> 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_vector> 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