tiny polish

This commit is contained in:
John Cupitt 2018-11-02 07:38:06 +00:00
parent 226f6e4f09
commit 556a165e53
1 changed files with 51 additions and 40 deletions

View File

@ -89,6 +89,10 @@ typedef struct {
/* Write animated webp here. /* Write animated webp here.
*/ */
WebPAnimEncoder *enc; WebPAnimEncoder *enc;
/* Add metadata with this.
*/
WebPMux *mux;
} VipsWebPWrite; } VipsWebPWrite;
static WebPPreset static WebPPreset
@ -122,6 +126,7 @@ vips_webp_write_unset( VipsWebPWrite *write )
{ {
WebPMemoryWriterClear( &write->memory_writer ); WebPMemoryWriterClear( &write->memory_writer );
VIPS_FREEF( WebPAnimEncoderDelete, write->enc ); VIPS_FREEF( WebPAnimEncoderDelete, write->enc );
VIPS_FREEF( WebPMuxDelete, write->mux );
} }
static int static int
@ -373,26 +378,49 @@ write_webp( VipsWebPWrite *write, VipsImage *image )
return( write_webp_single( write, image ) ); return( write_webp_single( write, image ) );
} }
static void
vips_webp_set_count( VipsWebPWrite *write, int loop_count )
{
uint32_t features;
if( WebPMuxGetFeatures( write->mux, &features ) == WEBP_MUX_OK &&
(features & ANIMATION_FLAG) ) {
WebPMuxAnimParams params;
if( WebPMuxGetAnimationParams( write->mux, &params ) ==
WEBP_MUX_OK ) {
params.loop_count = loop_count;
WebPMuxSetAnimationParams( write->mux, &params );
}
}
}
static int
vips_webp_set_chunk( VipsWebPWrite *write,
const char *webp_name, void *data, size_t length )
{
WebPData chunk;
chunk.bytes = data;
chunk.size = length;
if( WebPMuxSetChunk( write->mux, webp_name, &chunk, 1 ) !=
WEBP_MUX_OK ) {
vips_error( "vips2webp",
"%s", _( "chunk add error" ) );
return( -1 );
}
return( 0 );
}
static int static int
vips_webp_add_chunks( VipsWebPWrite *write, VipsImage *image, WebPMux *mux ) vips_webp_add_chunks( VipsWebPWrite *write, VipsImage *image )
{ {
int i; int i;
if( vips_image_get_typeof( image, "gif-count" ) ) { if( vips_image_get_typeof( image, "gif-count" ) )
uint32_t features; vips_webp_set_count( write, get_int( image, "gif-count", 0 ) );
if( WebPMuxGetFeatures( mux, &features ) == WEBP_MUX_OK &&
(features & ANIMATION_FLAG) ) {
WebPMuxAnimParams params;
if( WebPMuxGetAnimationParams( mux, &params ) ==
WEBP_MUX_OK ) {
params.loop_count =
get_int( image, "gif-count", 0 );
WebPMuxSetAnimationParams( mux, &params );
}
}
}
for( i = 0; i < vips__n_webp_names; i++ ) { for( i = 0; i < vips__n_webp_names; i++ ) {
const char *vips_name = vips__webp_names[i].vips; const char *vips_name = vips__webp_names[i].vips;
@ -401,24 +429,12 @@ vips_webp_add_chunks( VipsWebPWrite *write, VipsImage *image, WebPMux *mux )
if( vips_image_get_typeof( image, vips_name ) ) { if( vips_image_get_typeof( image, vips_name ) ) {
void *data; void *data;
size_t length; size_t length;
WebPData chunk;
#ifdef DEBUG if( vips_image_get_blob( image,
printf( "vips2webp: adding %s chunk\n", webp_name ); vips_name, &data, &length ) ||
#endif/*DEBUG*/ vips_webp_set_chunk( write,
webp_name, data, length ) )
if( vips_image_get_blob( image, vips_name,
&data, &length ) )
return( -1 ); return( -1 );
chunk.bytes = data;
chunk.size = length;
if( WebPMuxSetChunk( mux, webp_name, &chunk, 1 ) !=
WEBP_MUX_OK ) {
vips_error( "vips2webp",
"%s", _( "chunk add error" ) );
return( -1 );
}
} }
} }
@ -429,7 +445,6 @@ static int
vips_webp_add_metadata( VipsWebPWrite *write, VipsImage *image ) vips_webp_add_metadata( VipsWebPWrite *write, VipsImage *image )
{ {
WebPData data; WebPData data;
WebPMux *mux;
/* Rebuild the EXIF block, if any, ready for writing. /* Rebuild the EXIF block, if any, ready for writing.
*/ */
@ -441,27 +456,23 @@ vips_webp_add_metadata( VipsWebPWrite *write, VipsImage *image )
/* Parse what we have. /* Parse what we have.
*/ */
if( !(mux = WebPMuxCreate( &data, 1 )) ) { if( !(write->mux = WebPMuxCreate( &data, 1 )) ) {
vips_error( "vips2webp", "%s", _( "mux error" ) ); vips_error( "vips2webp", "%s", _( "mux error" ) );
return( -1 ); return( -1 );
} }
/* Add extra metadata. /* Add extra metadata.
*/ */
if( vips_webp_add_chunks( write, image, mux ) ) { if( vips_webp_add_chunks( write, image ) )
WebPMuxDelete( mux );
return( -1 ); return( -1 );
}
if( WebPMuxAssemble( mux, &data ) != WEBP_MUX_OK ) { if( WebPMuxAssemble( write->mux, &data ) != WEBP_MUX_OK ) {
WebPMuxDelete( mux );
vips_error( "vips2webp", "%s", _( "mux error" ) ); vips_error( "vips2webp", "%s", _( "mux error" ) );
return( -1 ); return( -1 );
} }
/* Free old stuff, reinit with new stuff. /* Free old stuff, reinit with new stuff.
*/ */
WebPMuxDelete( mux );
WebPMemoryWriterClear( &write->memory_writer ); WebPMemoryWriterClear( &write->memory_writer );
write->memory_writer.mem = (uint8_t *) data.bytes; write->memory_writer.mem = (uint8_t *) data.bytes;
write->memory_writer.size = data.size; write->memory_writer.size = data.size;