changeset 31184:86f91ea7a642

__tiff__.cc (get_field_data): fixed return type for some tags.
author magedrifaat <magedrifaat@gmail.com>
date Thu, 18 Aug 2022 16:39:56 +0200
parents 6ab628dfe2a0
children a1145ac2ce9b
files libinterp/corefcn/__tiff__.cc
diffstat 1 files changed, 85 insertions(+), 148 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/__tiff__.cc	Thu Aug 18 15:59:33 2022 +0200
+++ b/libinterp/corefcn/__tiff__.cc	Thu Aug 18 16:39:56 2022 +0200
@@ -962,63 +962,6 @@
       }
   }
 
-  octave_value
-  interpret_scalar_tag_data (void *data, TIFFDataType tag_datatype)
-  {
-    double retval;
-
-    switch (tag_datatype)
-      {
-      case TIFF_BYTE:
-      case TIFF_UNDEFINED:
-        retval = static_cast<double> (*(reinterpret_cast<uint8_t *> (data)));
-        break;
-      case TIFF_SHORT:
-        retval = static_cast<double> (*(reinterpret_cast<uint16_t *> (data)));
-        break;
-      case TIFF_LONG:
-        retval = static_cast<double> (*(reinterpret_cast<uint32_t *> (data)));
-        break;
-      case TIFF_LONG8:
-        retval = static_cast<double> (*(reinterpret_cast<uint64_t *> (data)));
-        break;
-      case TIFF_RATIONAL:
-        retval = *(reinterpret_cast<float *> (data));
-        break;
-      case TIFF_SBYTE:
-        retval = static_cast<double> (*(reinterpret_cast<int8_t *> (data)));
-        break;
-      case TIFF_SSHORT:
-        retval = static_cast<double> (*(reinterpret_cast<int16_t *> (data)));
-        break;
-      case TIFF_SLONG:
-        retval = static_cast<double> (*(reinterpret_cast<int32_t *> (data)));
-        break;
-      case TIFF_SLONG8:
-        retval = static_cast<double> (*(reinterpret_cast<int64_t *> (data)));
-        break;
-      case TIFF_FLOAT:
-        retval = *(reinterpret_cast<float *> (data));
-        break;
-      case TIFF_DOUBLE:
-        retval = *(reinterpret_cast<double *> (data));
-        break;
-      case TIFF_SRATIONAL:
-        retval = *(reinterpret_cast<float *> (data));
-        break;
-      case TIFF_IFD:
-        retval = static_cast<double> (*(reinterpret_cast<uint32_t *> (data)));
-        break;
-      case TIFF_IFD8:
-        retval = static_cast<double> (*(reinterpret_cast<uint64_t *> (data)));
-        break;
-      default:
-        error ("Unsupported tag data type");
-      }
-
-    return octave_value (retval);
-  }
-
   template <typename T>
   octave_value
   make_array (void *data, dim_vector& arr_dims)
@@ -1034,89 +977,78 @@
   }
 
   octave_value
-  interpret_tag_data (void *data, uint32_t count, TIFFDataType tag_datatype)
+  interpret_tag_data (void *data, uint32_t count, TIFFDataType tag_datatype,
+                      bool convert_to_double = false)
   {
-    octave_value retval;
-    // Apparently matlab converts scalar numerical values into double
-    // 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)
-    
-    if (count == 1 && tag_datatype != TIFF_ASCII)
-      {
-        retval = interpret_scalar_tag_data (data, tag_datatype);
-      }
-    else
+    octave_value retval;dim_vector arr_dims (1, count);
+    switch (tag_datatype)
       {
-        dim_vector arr_dims (1, count);
-
-        switch (tag_datatype)
-          {
-          case TIFF_BYTE:
-          case TIFF_UNDEFINED:
-            {
-              retval = make_array<uint8NDArray> (data, arr_dims);
-              break;
-            }
-          case TIFF_ASCII:
-            {
-              retval = octave_value (*(reinterpret_cast<char **> (data)));
-              break;
-            }
-          case TIFF_SHORT:
-            {
-              retval = make_array<uint16NDArray> (data, arr_dims);
-              break;
-            }
-          case TIFF_LONG:
-          case TIFF_IFD:
-            {
-              retval = make_array<uint32NDArray> (data, arr_dims);
-              break;
-            }
-          case TIFF_LONG8:
-          case TIFF_IFD8:
-            {
-              retval = make_array<uint64NDArray> (data, arr_dims);
-              break;
-            }
-          case TIFF_RATIONAL:
-          case TIFF_SRATIONAL:
-          case TIFF_FLOAT:
-            {
-              retval = make_array<FloatNDArray> (data, arr_dims).as_double ();
-              break;
-            }
-          case TIFF_SBYTE:
-            {
-              retval = make_array<int8NDArray> (data, arr_dims);
-              break;
-            }
-          case TIFF_SSHORT:
-            {
-              retval = make_array<int16NDArray> (data, arr_dims);
-              break;
-            }
-          case TIFF_SLONG:
-            {
-              retval = make_array<int32NDArray> (data, arr_dims);
-              break;
-            }
-          case TIFF_SLONG8:
-            {
-              retval = make_array<int64NDArray> (data, arr_dims);
-              break;
-            }
-          case TIFF_DOUBLE:
-            {
-              retval = make_array<NDArray> (data, arr_dims);
-              break;
-            }
-          default:
-            error ("Unsupported tag data type");
-          }
+      case TIFF_BYTE:
+      case TIFF_UNDEFINED:
+        {
+          retval = make_array<uint8NDArray> (data, arr_dims);
+          break;
+        }
+      case TIFF_ASCII:
+        {
+          retval = octave_value (*(reinterpret_cast<char **> (data)));
+          break;
+        }
+      case TIFF_SHORT:
+        {
+          retval = make_array<uint16NDArray> (data, arr_dims);
+          break;
+        }
+      case TIFF_LONG:
+      case TIFF_IFD:
+        {
+          retval = make_array<uint32NDArray> (data, arr_dims);
+          break;
+        }
+      case TIFF_LONG8:
+      case TIFF_IFD8:
+        {
+          retval = make_array<uint64NDArray> (data, arr_dims);
+          break;
+        }
+      case TIFF_RATIONAL:
+      case TIFF_SRATIONAL:
+      case TIFF_FLOAT:
+        {
+          retval = make_array<FloatNDArray> (data, arr_dims);
+          break;
+        }
+      case TIFF_SBYTE:
+        {
+          retval = make_array<int8NDArray> (data, arr_dims);
+          break;
+        }
+      case TIFF_SSHORT:
+        {
+          retval = make_array<int16NDArray> (data, arr_dims);
+          break;
+        }
+      case TIFF_SLONG:
+        {
+          retval = make_array<int32NDArray> (data, arr_dims);
+          break;
+        }
+      case TIFF_SLONG8:
+        {
+          retval = make_array<int64NDArray> (data, arr_dims);
+          break;
+        }
+      case TIFF_DOUBLE:
+        {
+          retval = make_array<NDArray> (data, arr_dims);
+          break;
+        }
+      default:
+        error ("Unsupported tag data type");
       }
 
+    if (tag_datatype != TIFF_ASCII && convert_to_double)
+      retval = retval.as_double ();
     return retval;
   }
 
@@ -1147,19 +1079,23 @@
     else
       validate_tiff_get_field (TIFFGetFieldDefaulted (tif, tag_id, data_ptr));
     
+    // All scalar tags are returned as double
     octave_value tag_data_ov = interpret_tag_data (data_ptr, 1,
-                                                   TIFFFieldDataType (fip));
+                                                   TIFFFieldDataType (fip),
+                                                   true);
 
     return tag_data_ov;
   }
 
   octave_value
-  get_array_field_data (TIFF *tif, const TIFFField *fip, uint32_t array_size)
+  get_array_field_data (TIFF *tif, const TIFFField *fip, uint32_t array_size,
+                        bool convert_to_double = false)
   {
     void *data;
     validate_tiff_get_field (TIFFGetField (tif, TIFFFieldTag (fip), &data));
       
-    return interpret_tag_data (data, array_size, TIFFFieldDataType (fip));
+    return interpret_tag_data (data, array_size, TIFFFieldDataType (fip),
+                               convert_to_double);
   }
 
   octave_value
@@ -1182,10 +1118,10 @@
           = get_array_field_data (tif, fip, TIFFNumberOfTiles (tif));
         break;
       case TIFFTAG_YCBCRCOEFFICIENTS:
-        tag_data_ov = get_array_field_data (tif, fip, 3);
+        tag_data_ov = get_array_field_data (tif, fip, 3, true);
         break;
       case TIFFTAG_REFERENCEBLACKWHITE:
-        tag_data_ov = get_array_field_data (tif, fip, 6);
+        tag_data_ov = get_array_field_data (tif, fip, 6, true);
         break;
       case TIFFTAG_GRAYRESPONSECURVE:
         {
@@ -1194,7 +1130,8 @@
                                             &bits_per_sample))
             error ("Failed to obtain the bit depth");
           
-          tag_data_ov = get_array_field_data (tif, fip, 1<<bits_per_sample);
+          tag_data_ov = get_array_field_data (tif, fip,
+                                              1<<bits_per_sample, true);
           break;
         }
       case TIFFTAG_COLORMAP:
@@ -1262,30 +1199,30 @@
                                                  &ch1, &ch2, &ch3));
           if (ch2 == NULL)
             tag_data_ov = interpret_tag_data (ch1, count,
-                                              TIFFFieldDataType (fip));
+                                              TIFFFieldDataType (fip), true);
           else
             {
               // Concatenate the channels into an n by 3 array
-              OCTAVE_LOCAL_BUFFER (uint16NDArray, array_list, 3);
+              OCTAVE_LOCAL_BUFFER (NDArray, array_list, 3);
               dim_vector col_dims(count, 1);
               array_list[0] = interpret_tag_data (ch1,
                                                   count,
                                                   TIFFFieldDataType (fip))
-                                                  .uint16_array_value ()
+                                                  .array_value ()
                                                   .reshape (col_dims);
               array_list[1] = interpret_tag_data (ch2,
                                                   count,
                                                   TIFFFieldDataType (fip))
-                                                  .uint16_array_value ()
+                                                  .array_value ()
                                                   .reshape (col_dims);
               array_list[2] = interpret_tag_data (ch3,
                                                   count,
                                                   TIFFFieldDataType (fip))
-                                                  .uint16_array_value ()
+                                                  .array_value ()
                                                   .reshape (col_dims);
               
               tag_data_ov
-                = octave_value (uint16NDArray::cat (1, 3, array_list));
+                = octave_value (NDArray::cat (1, 3, array_list));
             }
           break;
         }