Commit f98aafe3 for libheif
commit f98aafe32e0eb78772e594f6cb34377f3f2de515
Author: Dirk Farin <dirk.farin@gmail.com>
Date: Sat Mar 21 00:10:47 2026 +0100
fix writing grid images with transformation properties (#1730)
diff --git a/libheif/image-items/grid.cc b/libheif/image-items/grid.cc
index bb1f4d08..de3d3662 100644
--- a/libheif/image-items/grid.cc
+++ b/libheif/image-items/grid.cc
@@ -137,20 +137,20 @@ std::string ImageGrid::dump() const
ImageItem_Grid::ImageItem_Grid(HeifContext* ctx)
: ImageItem(ctx)
{
- m_encoding_options = heif_encoding_options_alloc();
+ m_tile_encoding_options = heif_encoding_options_alloc();
}
ImageItem_Grid::ImageItem_Grid(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_Grid::~ImageItem_Grid()
{
- heif_encoding_options_free(m_encoding_options);
+ heif_encoding_options_free(m_tile_encoding_options);
}
@@ -728,9 +728,10 @@ Result<std::shared_ptr<ImageItem_Grid>> ImageItem_Grid::add_new_grid_item(HeifCo
}
heif_item_id grid_id = *grid_id_result;
grid_image = std::make_shared<ImageItem_Grid>(ctx, grid_id);
- grid_image->set_encoding_options(encoding_options);
+ grid_image->set_tile_encoding_options(encoding_options);
grid_image->set_grid_spec(grid);
grid_image->set_resolution(output_width, output_height);
+ ctx->get_heif_file()->add_orientation_properties(grid_id, encoding_options->image_orientation);
ctx->insert_image_item(grid_id, grid_image);
const int construction_method = 1; // 0=mdat 1=idat
@@ -755,16 +756,22 @@ Result<std::shared_ptr<ImageItem_Grid>> ImageItem_Grid::add_new_grid_item(HeifCo
return grid_image;
}
+void ImageItem_Grid::set_tile_encoding_options(const heif_encoding_options* options)
+{
+ heif_encoding_options_copy(m_tile_encoding_options, options);
+
+ // do not propagate image transformation to tiles
+ m_tile_encoding_options->image_orientation = heif_orientation_normal;
+}
+
Error ImageItem_Grid::add_image_tile(uint32_t tile_x, uint32_t tile_y,
const std::shared_ptr<HeifPixelImage>& image,
heif_encoder* encoder)
{
- auto encoding_options = get_encoding_options();
-
auto encodingResult = get_context()->encode_image(image,
encoder,
- *encoding_options,
+ *m_tile_encoding_options,
heif_image_input_class_normal);
if (!encodingResult) {
return encodingResult.error();
@@ -795,9 +802,9 @@ Error ImageItem_Grid::add_image_tile(uint32_t tile_x, uint32_t tile_y,
// add color profile similar to first tile image
// TODO: this shouldn't be necessary. The colr profiles should be in the ImageExtraData above.
- auto colr_boxes = add_color_profile(image, *encoding_options,
+ auto colr_boxes = add_color_profile(image, *m_tile_encoding_options,
heif_image_input_class_normal,
- encoding_options->output_nclx_profile);
+ m_tile_encoding_options->output_nclx_profile);
for (auto& property : colr_boxes) {
add_property(property, is_property_essential(property));
}
diff --git a/libheif/image-items/grid.h b/libheif/image-items/grid.h
index 032086c2..5cc7e9d0 100644
--- a/libheif/image-items/grid.h
+++ b/libheif/image-items/grid.h
@@ -115,11 +115,7 @@ public:
int get_chroma_bits_per_pixel() 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; }
+ void set_tile_encoding_options(const heif_encoding_options* options);
Result<Encoder::CodedImageData> encode(const std::shared_ptr<HeifPixelImage>& image,
heif_encoder* encoder,
@@ -159,7 +155,7 @@ private:
ImageGrid m_grid_spec;
std::vector<heif_item_id> m_grid_tile_ids;
- heif_encoding_options* m_encoding_options = nullptr;
+ heif_encoding_options* m_tile_encoding_options = nullptr;
Error read_grid_spec();