diff --git a/ChangeLog b/ChangeLog index ba59c533..2c16fdd7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -19,6 +19,7 @@ - add missing flushes on write to target [harukizaemon] - hide info messages you could get with some older glibs [kleisauke] - fix --no-strip on dzsave with icc-profiles [altert] +- better GraphicsMagick image write [bfriesen] 6/9/20 started 8.10.2 - update magicksave/load profile handling [kelilevi] diff --git a/libvips/foreign/heifload.c b/libvips/foreign/heifload.c index 5b0b7160..9b3232db 100644 --- a/libvips/foreign/heifload.c +++ b/libvips/foreign/heifload.c @@ -987,11 +987,15 @@ vips_foreign_load_heif_read( void *data, size_t size, void *userdata ) { VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) userdata; - gint64 result; + while( size > 0 ) { + gint64 result; - result = vips_source_read( heif->source, data, size ); - if( result < 0 ) - return( -1 ); + result = vips_source_read( heif->source, data, size ); + if( result <= 0 ) + return( -1 ); + + size -= result; + } return( 0 ); } diff --git a/libvips/foreign/ppmload.c b/libvips/foreign/ppmload.c index bcc2e79a..77dfbb60 100644 --- a/libvips/foreign/ppmload.c +++ b/libvips/foreign/ppmload.c @@ -458,13 +458,21 @@ vips_foreign_load_ppm_generate_binary( VipsRegion *or, for( y = 0; y < r->height; y++ ) { VipsPel *q = VIPS_REGION_ADDR( or, 0, r->top + y ); - size_t bytes_read; + size_t n_bytes; - bytes_read = vips_source_read( ppm->source, q, sizeof_line ); - if( bytes_read != sizeof_line ) { - vips_error( class->nickname, - "%s", _( "file truncated" ) ); - return( -1 ); + n_bytes = sizeof_line; + while( n_bytes > 0 ) { + size_t bytes_read; + + bytes_read = vips_source_read( ppm->source, + q, sizeof_line ); + if( bytes_read == 0 ) { + vips_error( class->nickname, + "%s", _( "file truncated" ) ); + return( -1 ); + } + + n_bytes -= bytes_read; } } diff --git a/libvips/foreign/spngload.c b/libvips/foreign/spngload.c index baba7a4a..b3e6a601 100644 --- a/libvips/foreign/spngload.c +++ b/libvips/foreign/spngload.c @@ -94,13 +94,18 @@ vips_foreign_load_png_stream( spng_ctx *ctx, void *user, { VipsSource *source = VIPS_SOURCE( user ); - gint64 bytes_read; + while( length > 0 ) { + gint64 bytes_read; - bytes_read = vips_source_read( source, dest, length ); - if( bytes_read < 0 ) - return( SPNG_IO_ERROR ); - if( bytes_read < length ) - return( SPNG_IO_EOF); + bytes_read = vips_source_read( source, dest, length ); + if( bytes_read < 0 ) + return( SPNG_IO_ERROR ); + if( bytes_read == 0 ) + return( SPNG_IO_EOF ); + + dest += bytes_read; + length -= bytes_read; + } return( 0 ); }