Commit db02adc58 for imagemagick.org
commit db02adc58201778496c9be2bcb89d1698a2d346c
Author: Madars <mad182@gmail.com>
Date: Sat Mar 21 14:25:16 2026 +0200
Fix MNG frame disposal for transparent animations (#8625)
Reader: set image->dispose=BackgroundDispose when MNG framing_mode
is 3 (restore background before next frame). Previously disposal was
never set from framing_mode, defaulting to NoneDispose and losing the
disposal information on read.
Writer: trigger framing_mode=3 when image->dispose >= BackgroundDispose
(value 2) instead of only >= PreviousDispose (value 3). This was an
off-by-one in the dispose check that prevented BackgroundDispose from
producing the correct MNG framing mode.
Together these ensure disposal information survives read-edit-write
cycles for transparent MNG animations.
diff --git a/coders/png.c b/coders/png.c
index a76129c6a..d90e7c7dd 100644
--- a/coders/png.c
+++ b/coders/png.c
@@ -6328,6 +6328,11 @@ static Image *ReadOneMNGImage(MngReadInfo* mng_info,
else
image->delay=0;
+ if (mng_info->framing_mode == 3)
+ image->dispose=BackgroundDispose;
+ else
+ image->dispose=NoneDispose;
+
image->page.width=mng_info->mng_width;
image->page.height=mng_info->mng_height;
image->page.x=mng_info->x_off[object_id];
@@ -13583,7 +13588,7 @@ static MagickBooleanType WriteMNGImage(const ImageInfo *image_info,Image *image,
mng_info->write_mng=write_mng;
- if ((int) image->dispose >= 3)
+ if ((int) image->dispose >= BackgroundDispose)
mng_info->framing_mode=3;
if (mng_info->need_fram != MagickFalse && mng_info->adjoin != MagickFalse &&