Commit c517d9c4 for libheif
commit c517d9c407cf30275e4c7aaa5e5db03f70550550
Author: Dirk Farin <dirk.farin@gmail.com>
Date: Thu Mar 5 19:08:02 2026 +0100
fix reading mask imags with 16 bpp
diff --git a/libheif/image-items/mask_image.cc b/libheif/image-items/mask_image.cc
index 1dca27e0..5492304d 100644
--- a/libheif/image-items/mask_image.cc
+++ b/libheif/image-items/mask_image.cc
@@ -92,7 +92,9 @@ Error MaskImageCodec::decode_mask_image(const HeifContext* context,
"Unsupported bit depth for mask item");
}
- if (data.size() / width < height) {
+ uint32_t bytes_per_pixel = (mskC->get_bits_per_pixel() + 7) / 8;
+
+ if (data.size() / (static_cast<size_t>(width) * bytes_per_pixel) < height) {
return {heif_error_Invalid_input,
heif_suberror_Unspecified,
"Mask image data is too short"};
@@ -108,14 +110,14 @@ Error MaskImageCodec::decode_mask_image(const HeifContext* context,
size_t stride;
uint8_t* dst = img->get_plane(heif_channel_Y, &stride);
- if (stride == static_cast<size_t>(width)) {
- memcpy(dst, data.data(), static_cast<size_t>(width) * height);
+ if (stride == static_cast<size_t>(width) * bytes_per_pixel) {
+ memcpy(dst, data.data(), static_cast<size_t>(width) * bytes_per_pixel * height);
}
else
{
for (size_t i = 0; i < height; i++)
{
- memcpy(dst + i * stride, data.data() + i * width, width);
+ memcpy(dst + i * stride, data.data() + i * width * bytes_per_pixel, width * bytes_per_pixel);
}
}
return Error::Ok;