diff --git a/libvips/foreign/magicksave.c b/libvips/foreign/magicksave.c index 4d9fa414..68a80e31 100644 --- a/libvips/foreign/magicksave.c +++ b/libvips/foreign/magicksave.c @@ -72,6 +72,7 @@ typedef struct _VipsForeignSaveMagick { Image *current_image; int page_height; + GValue delay_gvalue; int *delays; int delays_length; @@ -99,6 +100,7 @@ vips_foreign_save_magick_dispose( GObject *gobject ) VIPS_FREEF( DestroyImageList, magick->images ); VIPS_FREEF( DestroyImageInfo, magick->image_info ); VIPS_FREEF( magick_destroy_exception, magick->exception ); + g_value_unset( &magick->delay_gvalue ); G_OBJECT_CLASS( vips_foreign_save_magick_parent_class )-> dispose( gobject ); @@ -349,10 +351,15 @@ vips_foreign_save_magick_build( VipsObject *object ) magick->page_height = vips_image_get_page_height( im ); - if( vips_image_get_typeof( im, "delay" ) && - vips_image_get_array_int( im, - "delay", &magick->delays, &magick->delays_length ) ) - return( -1 ); + /* Get as a gvalue so we can keep a ref to the delay array while we + * need it. + */ + if( vips_image_get_typeof( im, "delay" ) ) { + if( vips_image_get( im, "delay", &magick->delay_gvalue ) ) + return( -1 ); + magick->delays = vips_value_get_array_int( + &magick->delay_gvalue, &magick->delays_length ); + } if( vips_sink_disc( im, vips_foreign_save_magick_write_block, magick ) ) diff --git a/test/test-suite/test_foreign.py b/test/test-suite/test_foreign.py index cf917bf1..d75fad72 100644 --- a/test/test-suite/test_foreign.py +++ b/test/test-suite/test_foreign.py @@ -459,6 +459,15 @@ class TestForeign: self.save_load_buffer("magicksave_buffer", "magickload_buffer", self.colour, 40, format="JPG") + # try an animation + if have("gifload"): + x1 = pyvips.Image.new_from_file(GIF_ANIM_FILE, n=-1) + w1 = x1.magicksave_buffer(format="GIF") + x2 = pyvips.Image.new_from_buffer(w1, "", n=-1) + assert x1.get("delay") == x2.get("delay") + assert x1.get("page-height") == x2.get("page-height") + assert x1.get("gif-loop") == x2.get("gif-loop") + @skip_if_no("webpload") def test_webp(self): def webp_valid(im): @@ -517,7 +526,7 @@ class TestForeign: x2 = pyvips.Image.new_from_buffer(w1, "", n=-1) assert x1.width == x2.width assert x1.height == x2.height - assert x1.get("gif-delay") == x2.get("gif-delay") + assert x1.get("delay") == x2.get("delay") assert x1.get("page-height") == x2.get("page-height") assert x1.get("gif-loop") == x2.get("gif-loop") @@ -636,6 +645,8 @@ class TestForeign: x2 = pyvips.Image.new_from_file(GIF_ANIM_FILE, n=-1) assert x2.height == 5 * x1.height + # our test gif has delay 0 for the first frame set in error + assert x2.get("delay") == [0, 50, 50, 50, 50] x2 = pyvips.Image.new_from_file(GIF_ANIM_FILE, page=1, n=-1) assert x2.height == 4 * x1.height