Commit cad7186c for libheif

commit cad7186cb2736e146e8b27dd92a8e4d20f7b0578
Author: Dirk Farin <dirk.farin@gmail.com>
Date:   Mon Apr 13 16:20:25 2026 +0200

    also dump grid and overlay item data

diff --git a/libheif/api/libheif/heif_context.cc b/libheif/api/libheif/heif_context.cc
index 91649e92..862195be 100644
--- a/libheif/api/libheif/heif_context.cc
+++ b/libheif/api/libheif/heif_context.cc
@@ -215,6 +215,13 @@ void heif_context_debug_dump_boxes_to_file(heif_context* ctx, int fd)
   }

   std::string dump = ctx->context->debug_dump_boxes();
+
+  std::string item_dump = ctx->context->debug_dump_item_data();
+  if (!item_dump.empty()) {
+    dump += "\n";
+    dump += item_dump;
+  }
+
   // TODO(fancycode): Should we return an error if writing fails?
 #ifdef _WIN32
   auto written = _write(fd, dump.c_str(), static_cast<unsigned int>(dump.size()));
diff --git a/libheif/context.cc b/libheif/context.cc
index fd6d949d..99165691 100644
--- a/libheif/context.cc
+++ b/libheif/context.cc
@@ -511,6 +511,11 @@ std::string HeifContext::debug_dump_boxes() const
   return m_heif_file->debug_dump_boxes();
 }

+std::string HeifContext::debug_dump_item_data() const
+{
+  return m_heif_file->debug_dump_item_data();
+}
+

 #if ENABLE_EXPERIMENTAL_MINI_FORMAT
 void HeifContext::set_write_mini_format(bool enable)
diff --git a/libheif/context.h b/libheif/context.h
index fbfd408f..18c3aa4b 100644
--- a/libheif/context.h
+++ b/libheif/context.h
@@ -133,6 +133,8 @@ public:

   std::string debug_dump_boxes() const;

+  std::string debug_dump_item_data() const;
+

   // === writing ===

diff --git a/libheif/file.cc b/libheif/file.cc
index b7372ef2..d7786ef3 100644
--- a/libheif/file.cc
+++ b/libheif/file.cc
@@ -23,8 +23,10 @@
 #include "libheif/heif.h"
 #include "libheif/heif_properties.h"
 #include "compression.h"
+#include "image-items/grid.h"
 #include "image-items/jpeg2000.h"
 #include "image-items/jpeg.h"
+#include "image-items/overlay.h"
 #include "image-items/vvc.h"
 #include "codecs/avif_boxes.h"
 #include "codecs/hevc_boxes.h"
@@ -349,6 +351,74 @@ std::string HeifFile::debug_dump_boxes() const
 }


+std::string HeifFile::debug_dump_item_data() const
+{
+  std::stringstream sstr;
+  bool has_output = false;
+
+  sstr << "=== Item Data ===\n";
+
+  for (const auto& [id, infe] : m_infe_boxes) {
+    uint32_t item_type = infe->get_item_type_4cc();
+
+    if (item_type == fourcc("grid")) {
+      auto dataResult = get_uncompressed_item_data(id);
+      if (!dataResult) {
+        continue;
+      }
+
+      ImageGrid grid;
+      Error err = grid.parse(*dataResult);
+      if (err) {
+        continue;
+      }
+
+      has_output = true;
+      sstr << "\nitem ID " << id << " (grid):\n";
+
+      std::istringstream lines(grid.dump());
+      std::string line;
+      while (std::getline(lines, line)) {
+        sstr << "  " << line << "\n";
+      }
+    }
+    else if (item_type == fourcc("iovl")) {
+      if (!m_iref_box) {
+        continue;
+      }
+
+      auto refs = m_iref_box->get_references(id, fourcc("dimg"));
+
+      auto dataResult = get_uncompressed_item_data(id);
+      if (!dataResult) {
+        continue;
+      }
+
+      ImageOverlay overlay;
+      Error err = overlay.parse(refs.size(), *dataResult);
+      if (err) {
+        continue;
+      }
+
+      has_output = true;
+      sstr << "\nitem ID " << id << " (iovl):\n";
+
+      std::istringstream lines(overlay.dump());
+      std::string line;
+      while (std::getline(lines, line)) {
+        sstr << "  " << line << "\n";
+      }
+    }
+  }
+
+  if (has_output) {
+    return sstr.str();
+  }
+
+  return {};
+}
+
+
 Error HeifFile::parse_heif_file()
 {
   // --- read all top-level boxes
diff --git a/libheif/file.h b/libheif/file.h
index 304c6a6b..87e8b95a 100644
--- a/libheif/file.h
+++ b/libheif/file.h
@@ -188,6 +188,8 @@ public:

   std::string debug_dump_boxes() const;

+  std::string debug_dump_item_data() const;
+

   // --- writing ---