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;