reformatting for vips2webp

- move a couple of small functions inline for simplicity
- mark "gif-delay" as deprecated
- minor reformatting
This commit is contained in:
John Cupitt 2019-07-06 13:37:33 +01:00
parent 777c360774
commit 515bf68f46
4 changed files with 43 additions and 59 deletions

View File

@ -22,8 +22,8 @@
* - init pages to 0 before load
* 14/2/19
* - rework as a sequential loader ... simpler, much lower mem use
* 6/7/19
* - support array of delays
* 6/7/19 [deftomat]
* - support array of delays
*/
/*

View File

@ -8,6 +8,8 @@
* - write with a single call to vips_sink_disc()
* 29/6/19
* - support "strip" option
* 6/7/19 [deftomat]
* - support array of delays
*/
/*
@ -147,10 +149,11 @@ vips_foreign_save_magick_next_image( VipsForeignSaveMagick *magick )
/* Delay must be converted from milliseconds into centiseconds
* as GIF image requires centiseconds.
*/
if ( magick->delays != NULL) {
if( magick->delays ) {
page_index = magick->position.top / magick->page_height;
if( page_index < magick->delays_length )
image->delay = (size_t) VIPS_RINT( magick->delays[page_index] / 10.0 );
image->delay =
VIPS_RINT( magick->delays[page_index] / 10.0 );
}
/* ImageMagick uses iterations like this (at least in gif save):
@ -348,9 +351,8 @@ vips_foreign_save_magick_build( VipsObject *object )
if( vips_image_get_typeof( im, "delay" ) &&
vips_image_get_array_int( im,
"delay", &magick->delays, &magick->delays_length ) ) {
return( -1 );
}
"delay", &magick->delays, &magick->delays_length ) )
return( -1 );
if( vips_sink_disc( im,
vips_foreign_save_magick_write_block, magick ) )

View File

@ -12,6 +12,8 @@
* - target libwebp 0.5+ and remove some ifdefs
* - add animated webp write
* - use libwebpmux instead of our own thing, phew
* 6/7/19 [deftomat]
* - support array of delays
*/
/*
@ -275,61 +277,16 @@ write_webp_single( VipsWebPWrite *write, VipsImage *image )
return( 0 );
}
/* Get a defaulted int value.
*/
static int
get_int( VipsImage *image, const char *field, int default_value )
{
int value;
if( vips_image_get_typeof( image, field ) &&
!vips_image_get_int( image, field, &value ) )
return( value );
return( default_value );
}
/* Get an image field as an array of ints.
*/
static int*
get_array_int( VipsImage *image, const char *field, int* n )
{
int *value;
if( vips_image_get_typeof( image, field ) &&
!vips_image_get_array_int( image, field, &value, n ) )
return( value );
return( NULL );
}
/* Returns a delay on a given index or the default delay.
*/
static int
extract_delay( int index, const int *delays, int delays_length,
int default_delay )
{
if( delays == NULL ||
index > delays_length )
return( default_delay );
return( delays[index] );
}
/* Write a set of animated frames into write->memory_writer.
*/
static int
write_webp_anim( VipsWebPWrite *write, VipsImage *image, int page_height )
{
/* 100ms is the webp default. gif-delay is in centiseconds (the GIF
* standard).
*/
const int default_delay = 10 * get_int( image, "gif-delay", 10 );
int delays_length;
const int *delays = get_array_int( image, "delay", &delays_length );
WebPAnimEncoderOptions anim_config;
WebPData webp_data;
int gif_delay;
int *delay;
int delay_length;
int top;
int timestamp_ms;
@ -351,6 +308,20 @@ write_webp_anim( VipsWebPWrite *write, VipsImage *image, int page_height )
return( -1 );
}
/* There might just be the old gif-delay field. This is centiseconds.
*/
gif_delay = 4;
if( vips_image_get_typeof( image, "gif-delay" ) &&
vips_image_get_int( image, "gif-delay", &gif_delay ) )
return( -1 );
/* New images have an array of ints instead.
*/
if( vips_image_get_typeof( image, "delay" ) &&
vips_image_get_array_int( image, "delay",
&delay, &delay_length ) )
return( -1 );
timestamp_ms = 0;
for( top = 0; top < image->Ysize; top += page_height ) {
VipsImage *x;
@ -379,7 +350,11 @@ write_webp_anim( VipsWebPWrite *write, VipsImage *image, int page_height )
WebPPictureFree( &pic );
page_index = top / page_height;
timestamp_ms += extract_delay( page_index, delays, delays_length, default_delay );
if( delay &&
page_index < delay_length )
timestamp_ms += delay[page_index];
else
timestamp_ms += gif_delay * 10;
}
/* Closes encoder and add last frame delay.
@ -462,8 +437,14 @@ vips_webp_add_chunks( VipsWebPWrite *write, VipsImage *image )
{
int i;
if( vips_image_get_typeof( image, "gif-loop" ) )
vips_webp_set_count( write, get_int( image, "gif-loop", 0 ) );
if( vips_image_get_typeof( image, "gif-loop" ) ) {
int gif_loop;
if( vips_image_get_int( image, "gif-loop", &gif_loop ) )
return( -1 );
vips_webp_set_count( write, gif_loop );
}
for( i = 0; i < vips__n_webp_names; i++ ) {
const char *vips_name = vips__webp_names[i].vips;

View File

@ -1222,7 +1222,8 @@ vips_image_remove( VipsImage *image, const char *name )
/* Deprecated header fields we hide from _map.
*/
static const char *vips_image_header_deprecated[] = {
"ipct-data"
"ipct-data",
"gif-delay"
};
static void *