changeset 31105:7c5b8a294f60

getTag returns double for scalar values * __tiff__.cc: modified getTag to return double in case of scalar values
author magedrifaat <magedrifaat@gmail.com>
date Tue, 05 Jul 2022 03:44:41 +0200
parents b5d59c115e52
children f5a88c0a61ab
files libinterp/dldfcn/__tiff__.cc
diffstat 1 files changed, 205 insertions(+), 117 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/dldfcn/__tiff__.cc	Sun Jul 03 23:53:44 2022 +0200
+++ b/libinterp/dldfcn/__tiff__.cc	Tue Jul 05 03:44:41 2022 +0200
@@ -33,6 +33,85 @@
         }
   }
 
+  octave_value_list
+  interpret_scalar(void *data, TIFFDataType tag_datatype)
+  {
+    double retval;
+
+    switch (tag_datatype)
+      {
+      case TIFF_BYTE:
+      case TIFF_UNDEFINED:
+        {
+          retval = (double)(*((uint8_t *)data));
+          break;
+        }
+      case TIFF_SHORT:
+        {
+          retval = (double)(*((uint16_t *)data));
+          break;
+        }
+      case TIFF_LONG:
+        {
+          retval = (double)(*((uint32_t *)data));
+          break;
+        }
+      case TIFF_LONG8:
+        {
+          retval = (double)(*((uint64_t *)data));
+          break;
+        }
+      case TIFF_RATIONAL:
+        {
+          error ("TIFF_RATIONAL should have at least 2 elements but got only 1");
+          break;
+        }
+      case TIFF_SBYTE:
+        {
+          retval = (double)(*((int8_t *)data));
+          break;
+        }
+      case TIFF_SSHORT:
+        {
+          retval = (double)(*((int16_t *)data));
+          break;
+        }
+      case TIFF_SLONG:
+        {
+          retval = (double)(*((int32_t *)data));
+          break;
+        }
+      case TIFF_SLONG8:
+        {
+          retval = (double)(*((int64_t *)data));
+          break;
+        }
+      case TIFF_FLOAT:
+        {
+          retval = *((float *)data);
+          break;
+        }
+      case TIFF_DOUBLE:
+        {
+          retval = *((double *)data);
+          break;
+        }
+      case TIFF_SRATIONAL:
+        {
+          error ("TIFF_SRATIONAL should have at least 2 elements but got only 1");
+          break;
+        }
+      case TIFF_IFD:
+      case TIFF_IFD8:
+        error ("Unimplemented IFFD data type");
+        break;
+      default:
+        error ("Unsupported tag data type");
+      }
+
+    return octave_value_list(octave_value(retval));
+  }
+
   // Convert memory buffer into suitable octave values
   // depending on tag_datatype
   octave_value_list
@@ -40,145 +119,154 @@
   {
     // TODO(maged): Find the correct way fo returning multivalues
     octave_value_list ovl_data;
-    dim_vector arr_dims (1, count);
-
-    switch (tag_datatype)
+    // Apparently matlab converts scalar numerical values into double
+    // but doesn't do the same for arrays
+    if (count == 1 && tag_datatype != TIFF_ASCII)
+      {
+        ovl_data = interpret_scalar (data, tag_datatype);
+      }
+    else
       {
-      case TIFF_BYTE:
-      case TIFF_UNDEFINED:
-        {
-          uint8NDArray arr (arr_dims);
-          for (uint32_t i = 0; i < count; i++)
+        dim_vector arr_dims (1, count);
+
+        switch (tag_datatype)
+          {
+          case TIFF_BYTE:
+          case TIFF_UNDEFINED:
             {
-              arr(i) = ((uint8_t *)data)[i];
+              uint8NDArray arr (arr_dims);
+              for (uint32_t i = 0; i < count; i++)
+                {
+                  arr(i) = ((uint8_t *)data)[i];
+                }
+              ovl_data(0) = arr;
+              break;
             }
-          ovl_data(0) = arr;
-          break;
-        }
-      case TIFF_ASCII:
-        {
-          ovl_data(0) = *(char **)data;
-          break;
-        }
-      case TIFF_SHORT:
-        {
-          uint16NDArray arr (arr_dims);
-          for (uint32_t i = 0; i < count; i++)
+          case TIFF_ASCII:
             {
-              arr(i) = ((uint16_t *)data)[i];
+              ovl_data(0) = octave_value(*(char **)data);
+              break;
             }
-          ovl_data(0) = arr;
-          break;
-        }
-      case TIFF_LONG:
-        {
-          uint32NDArray arr (arr_dims);
-          for (uint32_t i = 0; i < count; i++)
+          case TIFF_SHORT:
             {
-              arr(i) = ((uint32_t *)data)[i];
+              uint16NDArray arr (arr_dims);
+              for (uint32_t i = 0; i < count; i++)
+                {
+                  arr(i) = ((uint16_t *)data)[i];
+                }
+              ovl_data(0) = arr;
+              break;
             }
-          ovl_data(0) = arr;
-          break;
-        }
-      case TIFF_LONG8:
-        {
-          uint64NDArray arr (arr_dims);
-          for (uint32_t i = 0; i < count; i++)
+          case TIFF_LONG:
             {
-              arr(i) = ((uint64_t *)data)[i];
+              uint32NDArray arr (arr_dims);
+              for (uint32_t i = 0; i < count; i++)
+                {
+                  arr(i) = ((uint32_t *)data)[i];
+                }
+              ovl_data(0) = arr;
+              break;
             }
-          ovl_data(0) = arr;
-          break;
-        }
-      case TIFF_RATIONAL:
-        {
-          NDArray arr (arr_dims);
-          for (uint32_t i = 0; i < count; i+=2)
+          case TIFF_LONG8:
             {
-              arr(i / 2) = (float)((uint32_t *)data)[i] 
-                            / (float)((uint32_t *)data)[i+1];
+              uint64NDArray arr (arr_dims);
+              for (uint32_t i = 0; i < count; i++)
+                {
+                  arr(i) = ((uint64_t *)data)[i];
+                }
+              ovl_data(0) = arr;
+              break;
             }
-          ovl_data(0) = arr;
-          break;
-        }
-      case TIFF_SBYTE:
-        {
-          int8NDArray arr (arr_dims);
-          for (uint32_t i = 0; i < count; i++)
+          case TIFF_RATIONAL:
             {
-              arr(i) = ((int8_t *)data)[i];
+              NDArray arr (arr_dims);
+              for (uint32_t i = 0; i < count; i+=2)
+                {
+                  arr(i / 2) = (float)((uint32_t *)data)[i] 
+                                / (float)((uint32_t *)data)[i+1];
+                }
+              ovl_data(0) = arr;
+              break;
             }
-          ovl_data(0) = arr;
-          break;
-        }
-      case TIFF_SSHORT:
-        {
-          int16NDArray arr (arr_dims);
-          for (uint32_t i = 0; i < count; i++)
+          case TIFF_SBYTE:
             {
-              arr(i) = ((int16_t *)data)[i];
+              int8NDArray arr (arr_dims);
+              for (uint32_t i = 0; i < count; i++)
+                {
+                  arr(i) = ((int8_t *)data)[i];
+                }
+              ovl_data(0) = arr;
+              break;
+            }
+          case TIFF_SSHORT:
+            {
+              int16NDArray arr (arr_dims);
+              for (uint32_t i = 0; i < count; i++)
+                {
+                  arr(i) = ((int16_t *)data)[i];
+                }
+              ovl_data(0) = arr;
+              break;
             }
-          ovl_data(0) = arr;
-          break;
-        }
-      case TIFF_SLONG:
-        {
-          int32NDArray arr (arr_dims);
-          for (uint32_t i = 0; i < count; i++)
+          case TIFF_SLONG:
             {
-              arr(i) = ((int32_t *)data)[i];
+              int32NDArray arr (arr_dims);
+              for (uint32_t i = 0; i < count; i++)
+                {
+                  arr(i) = ((int32_t *)data)[i];
+                }
+              ovl_data(0) = arr;
+              break;
             }
-          ovl_data(0) = arr;
-          break;
-        }
-      case TIFF_SLONG8:
-        {
-          int64NDArray arr (arr_dims);
-          for (uint32_t i = 0; i < count; i++)
+          case TIFF_SLONG8:
             {
-              arr(i) = ((int64_t *)data)[i];
+              int64NDArray arr (arr_dims);
+              for (uint32_t i = 0; i < count; i++)
+                {
+                  arr(i) = ((int64_t *)data)[i];
+                }
+              ovl_data(0) = arr;
+              break;
             }
-          ovl_data(0) = arr;
-          break;
-        }
-      case TIFF_FLOAT:
-        {
-          NDArray arr (arr_dims);
-          for (uint32_t i = 0; i < count; i++)
+          case TIFF_FLOAT:
             {
-              arr(i) = ((float *)data)[i];
+              NDArray arr (arr_dims);
+              for (uint32_t i = 0; i < count; i++)
+                {
+                  arr(i) = ((float *)data)[i];
+                }
+              ovl_data(0) = arr;
+              break;
             }
-          ovl_data(0) = arr;
-          break;
-        }
-      case TIFF_DOUBLE:
-        {
-          NDArray arr (arr_dims);
-          for (uint32_t i = 0; i < count; i++)
-          {
-              arr(i) = ((double *)data)[i];
+          case TIFF_DOUBLE:
+            {
+              NDArray arr (arr_dims);
+              for (uint32_t i = 0; i < count; i++)
+              {
+                  arr(i) = ((double *)data)[i];
+              }
+              ovl_data(0) = arr;
+              break;
+            }
+          case TIFF_SRATIONAL:
+            {
+              NDArray arr (arr_dims);
+              for (uint32_t i = 0; i < count; i+=2)
+                {
+                  arr(i / 2) = (float)((int32_t *)data)[i] 
+                                / (float)((int32_t *)data)[i+1];
+                }
+              ovl_data(0) = arr;
+              break;
+            }
+          case TIFF_IFD:
+          case TIFF_IFD8:
+            // TODO(maged): implement IFD datatype?
+            error ("Unimplemented IFFD data type");
+            break;
+          default:
+            error ("Unsupported tag data type");
           }
-          ovl_data(0) = arr;
-          break;
-        }
-      case TIFF_SRATIONAL:
-        {
-          NDArray arr (arr_dims);
-          for (uint32_t i = 0; i < count; i+=2)
-            {
-              arr(i / 2) = (float)((int32_t *)data)[i] 
-                            / (float)((int32_t *)data)[i+1];
-            }
-          ovl_data(0) = arr;
-          break;
-        }
-      case TIFF_IFD:
-      case TIFF_IFD8:
-        // TODO(maged): implement IFD datatype?
-        error ("Unimplemented IFFD data type");
-        break;
-      default:
-        error ("Unsupported tag data type");
       }
 
     return ovl_data;