Commit 5ec43ffd for libheif

commit 5ec43ffdb2940ca0df28504c4174f9cc19d4d2ec
Author: Dirk Farin <dirk.farin@gmail.com>
Date:   Sat Mar 21 00:46:36 2026 +0100

    fix writing tili images with transformation properties (#1730)

diff --git a/libheif/image-items/tiled.cc b/libheif/image-items/tiled.cc
index d2171b09..5eef9af8 100644
--- a/libheif/image-items/tiled.cc
+++ b/libheif/image-items/tiled.cc
@@ -487,20 +487,20 @@ std::string TiledHeader::dump() const
 ImageItem_Tiled::ImageItem_Tiled(HeifContext* ctx)
         : ImageItem(ctx)
 {
-  m_encoding_options = heif_encoding_options_alloc();
+  m_tile_encoding_options = heif_encoding_options_alloc();
 }


 ImageItem_Tiled::ImageItem_Tiled(HeifContext* ctx, heif_item_id id)
         : ImageItem(ctx, id)
 {
-  m_encoding_options = heif_encoding_options_alloc();
+  m_tile_encoding_options = heif_encoding_options_alloc();
 }


 ImageItem_Tiled::~ImageItem_Tiled()
 {
-  heif_encoding_options_free(m_encoding_options);
+  heif_encoding_options_free(m_tile_encoding_options);
 }


@@ -664,7 +664,12 @@ ImageItem_Tiled::add_new_tiled_item(HeifContext* ctx, const heif_tiled_image_par
   ctx->insert_image_item(tild_id, tild_image);

   if (encoding_options) {
-    tild_image->set_encoding_options(encoding_options);
+    // encoding options for the tiles, but do not apply transformative properties
+    heif_encoding_options_copy(tild_image->m_tile_encoding_options, encoding_options);
+    tild_image->m_tile_encoding_options->image_orientation = heif_orientation_normal;
+
+    // orientation of the main image
+    tild_image->m_image_orientation = encoding_options->image_orientation;
   }

   // Create tilC box
@@ -722,12 +727,10 @@ Error ImageItem_Tiled::add_image_tile(uint32_t tile_x, uint32_t tile_y,
 {
   auto item = ImageItem::alloc_for_compression_format(get_context(), encoder->plugin->compression_format);

-  const heif_encoding_options* options = get_encoding_options();
-
   Result<std::shared_ptr<HeifPixelImage>> colorConversionResult;
   colorConversionResult = item->get_encoder()->convert_colorspace_for_encoding(image, encoder,
-                                                                               options->output_nclx_profile,
-                                                                               &options->color_conversion_options,
+                                                                               m_tile_encoding_options->output_nclx_profile,
+                                                                               &m_tile_encoding_options->color_conversion_options,
                                                                                get_context()->get_security_limits());
   if (!colorConversionResult) {
     return colorConversionResult.error();
@@ -735,7 +738,7 @@ Error ImageItem_Tiled::add_image_tile(uint32_t tile_x, uint32_t tile_y,

   std::shared_ptr<HeifPixelImage> colorConvertedImage = *colorConversionResult;

-  Result<Encoder::CodedImageData> encodeResult = item->encode_to_bitstream_and_boxes(colorConvertedImage, encoder, *options, heif_image_input_class_normal);
+  Result<Encoder::CodedImageData> encodeResult = item->encode_to_bitstream_and_boxes(colorConvertedImage, encoder, *m_tile_encoding_options, heif_image_input_class_normal);

   if (!encodeResult) {
     return encodeResult.error();
@@ -814,6 +817,8 @@ Error ImageItem_Tiled::add_image_tile(uint32_t tile_x, uint32_t tile_y,
         get_file()->add_property(get_id(), propertyBox, propertyBox->is_essential());
         break;
     }
+
+    get_file()->add_orientation_properties(get_id(), m_image_orientation);
   }

   //get_file()->set_brand(encoder->plugin->compression_format,
diff --git a/libheif/image-items/tiled.h b/libheif/image-items/tiled.h
index 05a06982..19ba8d20 100644
--- a/libheif/image-items/tiled.h
+++ b/libheif/image-items/tiled.h
@@ -156,12 +156,6 @@ public:

   heif_compression_format get_compression_format() const override;

-  void set_encoding_options(const heif_encoding_options* options) {
-    heif_encoding_options_copy(m_encoding_options, options);
-  }
-
-  const heif_encoding_options* get_encoding_options() const { return m_encoding_options; }
-
   static Result<std::shared_ptr<ImageItem_Tiled>> add_new_tiled_item(HeifContext* ctx, const heif_tiled_image_parameters* parameters,
                                                                      const heif_encoder* encoder,
                                                                      const heif_encoding_options* encoding_options);
@@ -213,13 +207,15 @@ public:
 private:
   TiledHeader m_tild_header;
   uint64_t m_next_tild_position = 0;
-  heif_encoding_options* m_encoding_options = nullptr;
+
+  heif_orientation m_image_orientation = heif_orientation_normal;
+  heif_encoding_options* m_tile_encoding_options = nullptr;

   uint32_t mReadChunkSize_bytes = 64*1024; // 64 kiB
   bool m_preload_offset_table = false;

   std::shared_ptr<ImageItem> m_tile_item;
-  std::shared_ptr<class Decoder> m_tile_decoder;
+  std::shared_ptr<Decoder> m_tile_decoder;

   Result<DataExtent>
   get_compressed_data_for_tile(uint32_t tx, uint32_t ty) const;