Commit 16231c1c for libheif

commit 16231c1c88b1eea3e2092df7b3cf5b2e20df8b3c
Author: Dirk Farin <dirk.farin@gmail.com>
Date:   Tue Jan 13 12:03:31 2026 +0100

    prevent writing of double colr boxes

diff --git a/libheif/image-items/grid.cc b/libheif/image-items/grid.cc
index 45a61d60..3eb94cb4 100644
--- a/libheif/image-items/grid.cc
+++ b/libheif/image-items/grid.cc
@@ -773,7 +773,7 @@ Error ImageItem_Grid::add_image_tile(uint32_t tile_x, uint32_t tile_y,
   // copy over extra properties to grid item

   if (tile_x == 0 && tile_y == 0) {
-    auto property_boxes = encoded_image->generate_property_boxes();
+    auto property_boxes = encoded_image->generate_property_boxes(false);
     for (auto& property : property_boxes) {
       add_property(property, is_property_essential(property));
     }
@@ -867,7 +867,7 @@ Result<std::shared_ptr<ImageItem_Grid>> ImageItem_Grid::add_and_encode_full_grid

   // copy over extra properties to grid item

-  auto property_boxes = tiles[0]->generate_property_boxes();
+  auto property_boxes = tiles[0]->generate_property_boxes(true);
   for (auto& property : property_boxes) {
     griditem->add_property(property, griditem->is_property_essential(property));
   }
diff --git a/libheif/image-items/image_item.cc b/libheif/image-items/image_item.cc
index dc16a374..e803107f 100644
--- a/libheif/image-items/image_item.cc
+++ b/libheif/image-items/image_item.cc
@@ -354,7 +354,7 @@ Result<Encoder::CodedImageData> ImageItem::encode_to_bitstream_and_boxes(const s
   // copy over ImageExtraData into image item
   *static_cast<ImageExtraData*>(this) = static_cast<ImageExtraData>(*image);

-  auto extra_data_properties = image->generate_property_boxes();
+  auto extra_data_properties = image->generate_property_boxes(false);
   codedImage.properties.insert(codedImage.properties.end(),
                                extra_data_properties.begin(),
                                extra_data_properties.end());
diff --git a/libheif/pixelimage.cc b/libheif/pixelimage.cc
index 6e2e5bf1..a8ab7397 100644
--- a/libheif/pixelimage.cc
+++ b/libheif/pixelimage.cc
@@ -178,7 +178,7 @@ std::shared_ptr<Box_colr> ImageExtraData::get_colr_box_icc() const
 }


-std::vector<std::shared_ptr<Box>> ImageExtraData::generate_property_boxes() const
+std::vector<std::shared_ptr<Box>> ImageExtraData::generate_property_boxes(bool generate_colr_boxes) const
 {
   std::vector<std::shared_ptr<Box>> properties;

@@ -218,16 +218,18 @@ std::vector<std::shared_ptr<Box>> ImageExtraData::generate_property_boxes() cons
     properties.push_back(itai);
   }

-  // --- colr (nclx)
+  if (generate_colr_boxes) {
+    // --- colr (nclx)

-  if (has_nclx_color_profile()) {
-    properties.push_back(get_colr_box_nclx());
-  }
+    if (has_nclx_color_profile()) {
+      properties.push_back(get_colr_box_nclx());
+    }

-  // --- colr (icc)
+    // --- colr (icc)

-  if (has_icc_color_profile()) {
-    properties.push_back(get_colr_box_icc());
+    if (has_icc_color_profile()) {
+      properties.push_back(get_colr_box_icc());
+    }
   }

   return properties;
diff --git a/libheif/pixelimage.h b/libheif/pixelimage.h
index 7206ca6f..2c0ec507 100644
--- a/libheif/pixelimage.h
+++ b/libheif/pixelimage.h
@@ -77,7 +77,10 @@ class ImageExtraData
 public:
   virtual ~ImageExtraData();

-  std::vector<std::shared_ptr<Box>> generate_property_boxes() const;
+  // TODO: Decide who is responsible for writing the colr boxes.
+  //       Currently it is distributed over various places.
+  //       Either here, in image_item.cc or in grid.cc.
+  std::vector<std::shared_ptr<Box>> generate_property_boxes(bool generate_colr_boxes) const;


   // --- color profile