tiny polish
This commit is contained in:
parent
226f6e4f09
commit
556a165e53
|
@ -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,27 +378,50 @@ write_webp( VipsWebPWrite *write, VipsImage *image )
|
||||||
return( write_webp_single( write, image ) );
|
return( write_webp_single( write, image ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static void
|
||||||
vips_webp_add_chunks( VipsWebPWrite *write, VipsImage *image, WebPMux *mux )
|
vips_webp_set_count( VipsWebPWrite *write, int loop_count )
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
|
|
||||||
if( vips_image_get_typeof( image, "gif-count" ) ) {
|
|
||||||
uint32_t features;
|
uint32_t features;
|
||||||
|
|
||||||
if( WebPMuxGetFeatures( mux, &features ) == WEBP_MUX_OK &&
|
if( WebPMuxGetFeatures( write->mux, &features ) == WEBP_MUX_OK &&
|
||||||
(features & ANIMATION_FLAG) ) {
|
(features & ANIMATION_FLAG) ) {
|
||||||
WebPMuxAnimParams params;
|
WebPMuxAnimParams params;
|
||||||
|
|
||||||
if( WebPMuxGetAnimationParams( mux, ¶ms ) ==
|
if( WebPMuxGetAnimationParams( write->mux, ¶ms ) ==
|
||||||
WEBP_MUX_OK ) {
|
WEBP_MUX_OK ) {
|
||||||
params.loop_count =
|
params.loop_count = loop_count;
|
||||||
get_int( image, "gif-count", 0 );
|
WebPMuxSetAnimationParams( write->mux, ¶ms );
|
||||||
WebPMuxSetAnimationParams( mux, ¶ms );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
vips_webp_add_chunks( VipsWebPWrite *write, VipsImage *image )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if( vips_image_get_typeof( image, "gif-count" ) )
|
||||||
|
vips_webp_set_count( write, get_int( image, "gif-count", 0 ) );
|
||||||
|
|
||||||
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;
|
||||||
const char *webp_name = vips__webp_names[i].webp;
|
const char *webp_name = vips__webp_names[i].webp;
|
||||||
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue