Commit 9b9a4db2 for libheif

commit 9b9a4db26236ae0c62d204b3104f0c189b95b9c0
Author: Dirk Farin <dirk.farin@gmail.com>
Date:   Thu Jun 25 18:31:11 2026 +0200

    Add C++ wrapper getters/setters for CLLI and MDCV HDR boxes (#1825)

    Wrap the existing content-light-level (clli) and mastering-display-colour-volume
    (mdcv) C API functions in the old C++ wrapper, for both Image and ImageHandle.

diff --git a/libheif/api/libheif/heif_cxx.h b/libheif/api/libheif/heif_cxx.h
index ed2420b9..7e83f936 100644
--- a/libheif/api/libheif/heif_cxx.h
+++ b/libheif/api/libheif/heif_cxx.h
@@ -232,6 +232,22 @@ namespace heif {

     int get_ispe_height() const noexcept;

+    // ------------------------- HDR metadata -------------------------
+
+    bool has_content_light_level() const noexcept;
+
+    // Returns a zero-initialized struct if the image has no such information.
+    heif_content_light_level get_content_light_level() const noexcept;
+
+    void set_content_light_level(const heif_content_light_level&) noexcept;
+
+    bool has_mastering_display_colour_volume() const noexcept;
+
+    // Returns a zero-initialized struct if the image has no such information.
+    heif_mastering_display_colour_volume get_mastering_display_colour_volume() const noexcept;
+
+    void set_mastering_display_colour_volume(const heif_mastering_display_colour_volume&) noexcept;
+
     // ------------------------- depth images -------------------------

     // TODO
@@ -368,6 +384,22 @@ namespace heif {
     void set_raw_color_profile(heif_color_profile_type type,
                                const std::vector<uint8_t>& data);

+    // ------------------------- HDR metadata -------------------------
+
+    bool has_content_light_level() const noexcept;
+
+    // Returns a zero-initialized struct if the image has no such information.
+    heif_content_light_level get_content_light_level() const noexcept;
+
+    void set_content_light_level(const heif_content_light_level&) noexcept;
+
+    bool has_mastering_display_colour_volume() const noexcept;
+
+    // Returns a zero-initialized struct if the image has no such information.
+    heif_mastering_display_colour_volume get_mastering_display_colour_volume() const noexcept;
+
+    void set_mastering_display_colour_volume(const heif_mastering_display_colour_volume&) noexcept;
+
     bool is_premultiplied_alpha() const noexcept;

     void set_premultiplied_alpha(bool is_premultiplied_alpha) noexcept;
@@ -722,6 +754,40 @@ namespace heif {
     return heif_image_handle_get_ispe_height(m_image_handle.get());
   }

+  inline bool ImageHandle::has_content_light_level() const noexcept
+  {
+    return heif_image_handle_has_content_light_level(m_image_handle.get()) != 0;
+  }
+
+  inline heif_content_light_level ImageHandle::get_content_light_level() const noexcept
+  {
+    heif_content_light_level clli{};
+    heif_image_handle_get_content_light_level(m_image_handle.get(), &clli);
+    return clli;
+  }
+
+  inline void ImageHandle::set_content_light_level(const heif_content_light_level& clli) noexcept
+  {
+    heif_image_handle_set_content_light_level(m_image_handle.get(), &clli);
+  }
+
+  inline bool ImageHandle::has_mastering_display_colour_volume() const noexcept
+  {
+    return heif_image_handle_has_mastering_display_colour_volume(m_image_handle.get()) != 0;
+  }
+
+  inline heif_mastering_display_colour_volume ImageHandle::get_mastering_display_colour_volume() const noexcept
+  {
+    heif_mastering_display_colour_volume mdcv{};
+    heif_image_handle_get_mastering_display_colour_volume(m_image_handle.get(), &mdcv);
+    return mdcv;
+  }
+
+  inline void ImageHandle::set_mastering_display_colour_volume(const heif_mastering_display_colour_volume& mdcv) noexcept
+  {
+    heif_image_handle_set_mastering_display_colour_volume(m_image_handle.get(), &mdcv);
+  }
+
   // ------------------------- depth images -------------------------

   // TODO
@@ -998,6 +1064,40 @@ namespace heif {
     }
   }

+  inline bool Image::has_content_light_level() const noexcept
+  {
+    return heif_image_has_content_light_level(m_image.get()) != 0;
+  }
+
+  inline heif_content_light_level Image::get_content_light_level() const noexcept
+  {
+    heif_content_light_level clli{};
+    heif_image_get_content_light_level(m_image.get(), &clli);
+    return clli;
+  }
+
+  inline void Image::set_content_light_level(const heif_content_light_level& clli) noexcept
+  {
+    heif_image_set_content_light_level(m_image.get(), &clli);
+  }
+
+  inline bool Image::has_mastering_display_colour_volume() const noexcept
+  {
+    return heif_image_has_mastering_display_colour_volume(m_image.get()) != 0;
+  }
+
+  inline heif_mastering_display_colour_volume Image::get_mastering_display_colour_volume() const noexcept
+  {
+    heif_mastering_display_colour_volume mdcv{};
+    heif_image_get_mastering_display_colour_volume(m_image.get(), &mdcv);
+    return mdcv;
+  }
+
+  inline void Image::set_mastering_display_colour_volume(const heif_mastering_display_colour_volume& mdcv) noexcept
+  {
+    heif_image_set_mastering_display_colour_volume(m_image.get(), &mdcv);
+  }
+
   inline bool Image::is_premultiplied_alpha() const noexcept
   {
     return heif_image_is_premultiplied_alpha(m_image.get()) != 0;