From d14e0d5c9790637c0b5310ed4298751b1ddb9dbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Szabo?= Date: Tue, 17 Dec 2019 07:28:28 +0100 Subject: [PATCH] feat: add normalized `loop` field --- libvips/foreign/gifload.c | 9 ++++++++- libvips/foreign/magicksave.c | 17 ++++++++++++----- libvips/foreign/vips2webp.c | 18 ++++++++++++++---- libvips/foreign/webp2vips.c | 10 +++++++++- 4 files changed, 43 insertions(+), 11 deletions(-) diff --git a/libvips/foreign/gifload.c b/libvips/foreign/gifload.c index a34ed8bb..04e51f5e 100644 --- a/libvips/foreign/gifload.c +++ b/libvips/foreign/gifload.c @@ -590,7 +590,14 @@ vips_foreign_load_gif_set_header( VipsForeignLoadGif *gif, VipsImage *image ) vips_image_set_int( image, VIPS_META_PAGE_HEIGHT, gif->file->SHeight ); vips_image_set_int( image, VIPS_META_N_PAGES, gif->n_pages ); - vips_image_set_int( image, "gif-loop", gif->loop ); + vips_image_set_int( image, "loop", gif->loop ); + + /* DEPRECATED "gif-loop" + * + * Not the correct behavior as loop=1 became gif-loop=0 + * but we want to keep the old behavior untouched! + */ + vips_image_set_int( image, "gif-loop", gif->loop == 0 ? 0 : gif->loop - 1 ); if( gif->delays ) { /* The deprecated gif-delay field is in centiseconds. diff --git a/libvips/foreign/magicksave.c b/libvips/foreign/magicksave.c index 5eee1a20..8e47f16b 100644 --- a/libvips/foreign/magicksave.c +++ b/libvips/foreign/magicksave.c @@ -163,13 +163,20 @@ vips_foreign_save_magick_next_image( VipsForeignSaveMagick *magick ) * 1 - don't write the netscape extension block * 2 - loop once * 3 - loop twice etc. - * - * We have the simple gif meaning, so we must add one unless it's - * zero. */ - if( vips_image_get_typeof( im, "gif-loop" ) && - !vips_image_get_int( im, "gif-loop", &number ) ) + if( vips_image_get_typeof( im, "loop" ) && + !vips_image_get_int( im, "loop", &number ) ) { image->iterations = (size_t) (number ? number : 0); + } + else { + /* DEPRECATED "gif-loop" + * + * We have the simple gif meaning, so we must add one unless it's zero. + */ + if( vips_image_get_typeof( im, "gif-loop" ) && + !vips_image_get_int( im, "gif-loop", &number ) ) + image->iterations = (size_t) (number ? number + 1 : 0); + } if( vips_image_get_typeof( im, "gif-comment" ) && !vips_image_get_string( im, "gif-comment", &str ) ) diff --git a/libvips/foreign/vips2webp.c b/libvips/foreign/vips2webp.c index a1dda939..ca0df25c 100644 --- a/libvips/foreign/vips2webp.c +++ b/libvips/foreign/vips2webp.c @@ -478,13 +478,23 @@ vips_webp_add_metadata( VipsWebPWrite *write, VipsImage *image, gboolean strip ) return( -1 ); } - if( vips_image_get_typeof( image, "gif-loop" ) ) { - int gif_loop; + if( vips_image_get_typeof( image, "loop" ) ) { + int loop; - if( vips_image_get_int( image, "gif-loop", &gif_loop ) ) + if( vips_image_get_int( image, "loop", &loop ) ) return( -1 ); - vips_webp_set_count( write, gif_loop ); + vips_webp_set_count( write, loop ); + } + /* DEPRECATED "gif-loop" + */ + else if ( vips_image_get_typeof( image, "gif-loop" ) ) { + int loop; + + if( vips_image_get_int( image, "gif-loop", &loop ) ) + return( -1 ); + + vips_webp_set_count( write, loop == 0 ? 0 : loop + 1 ); } /* Add extra metadata. diff --git a/libvips/foreign/webp2vips.c b/libvips/foreign/webp2vips.c index 7e28015e..bf03555e 100644 --- a/libvips/foreign/webp2vips.c +++ b/libvips/foreign/webp2vips.c @@ -473,7 +473,15 @@ read_header( Read *read, VipsImage *out ) printf( "webp2vips: frame_count = %d\n", read->frame_count ); #endif /*DEBUG*/ - vips_image_set_int( out, "gif-loop", loop_count ); + vips_image_set_int( out, "loop", loop_count ); + + /* DEPRECATED "gif-loop" + * + * Not the correct behavior as loop=1 became gif-loop=0 + * but we want to keep the old behavior untouched! + */ + vips_image_set_int( out, "gif-loop", loop_count == 0 ? 0 : loop_count - 1 ); + vips_image_set_int( out, VIPS_META_PAGE_HEIGHT, read->frame_height );