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