From db02adc58201778496c9be2bcb89d1698a2d346c Mon Sep 17 00:00:00 2001 From: Madars Date: Sat, 21 Mar 2026 14:25:16 +0200 Subject: [PATCH] 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. --- coders/png.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/coders/png.c b/coders/png.c index a76129c6ae..d90e7c7dda 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 &&