add support for giflib5
gifload.c now works with giflib5, and well as giflib4 ... forced by ubuntu's switch to giflib5 in 16.04 see https://github.com/jcupitt/libvips/issues/407
This commit is contained in:
parent
128480bab6
commit
d11a7960b7
@ -1,8 +1,8 @@
|
|||||||
15/4/16 started 8.3.1
|
15/4/16 started 8.3.1
|
||||||
- rename vips wrapper script, it was still vips-8.2, thanks Benjamin
|
- rename vips wrapper script, it was still vips-8.2, thanks Benjamin
|
||||||
- export C++ operator overloads for MSVC linking [Lovell]
|
- export C++ operator overloads for MSVC linking [Lovell]
|
||||||
- insist on giflib4
|
|
||||||
- fix magickload @page with GraphicsMagick
|
- fix magickload @page with GraphicsMagick
|
||||||
|
- add giflib5 support
|
||||||
|
|
||||||
29/1/16 started 8.3
|
29/1/16 started 8.3
|
||||||
- add vips_reduce*() ... a fast path for affine downsize
|
- add vips_reduce*() ... a fast path for affine downsize
|
||||||
|
@ -631,16 +631,14 @@ if test "$GIFLIB_LIBS" = ""; then
|
|||||||
INCLUDES="$GIFLIB_INCLUDES $INCLUDES"
|
INCLUDES="$GIFLIB_INCLUDES $INCLUDES"
|
||||||
|
|
||||||
# Try the standard search path first
|
# Try the standard search path first
|
||||||
# look for GifLastError() since it was removed for giflib5 and we only
|
AC_TRY_LINK([#include <gif_lib.h>],[EGifSetGifVersion(0,0)], [
|
||||||
# (for now) work with giflib4
|
|
||||||
AC_TRY_LINK([#include <gif_lib.h>],[GifLastError()], [
|
|
||||||
GIFLIB_LIBS="-lgif"
|
GIFLIB_LIBS="-lgif"
|
||||||
], [
|
], [
|
||||||
# giflib is not in the standard search path, try $prefix
|
# giflib is not in the standard search path, try $prefix
|
||||||
|
|
||||||
LIBS="-L${prefix}/lib $LIBS"
|
LIBS="-L${prefix}/lib $LIBS"
|
||||||
|
|
||||||
AC_TRY_LINK([#include <gif_lib.h>],[GifLastError()], [
|
AC_TRY_LINK([#include <gif_lib.h>],[EGifSetGifVersion(0,0)], [
|
||||||
GIFLIB_LIBS="-L${prefix}/lib -lgif"
|
GIFLIB_LIBS="-L${prefix}/lib -lgif"
|
||||||
], [
|
], [
|
||||||
GIFLIB_LIBS=no
|
GIFLIB_LIBS=no
|
||||||
|
@ -977,7 +977,6 @@ file import/export with libpng: $with_png
|
|||||||
(requires libpng-1.2.9 or later)
|
(requires libpng-1.2.9 or later)
|
||||||
file import/export with libtiff: $with_tiff
|
file import/export with libtiff: $with_tiff
|
||||||
file import/export with giflib: $with_giflib
|
file import/export with giflib: $with_giflib
|
||||||
(requires libgif-4.x)
|
|
||||||
file import/export with libjpeg: $with_jpeg
|
file import/export with libjpeg: $with_jpeg
|
||||||
image pyramid export: $with_gsf
|
image pyramid export: $with_gsf
|
||||||
(requires libgsf-1 1.14.27 or later)
|
(requires libgsf-1 1.14.27 or later)
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
*
|
*
|
||||||
* 10/2/16
|
* 10/2/16
|
||||||
* - from svgload.c
|
* - from svgload.c
|
||||||
|
* 25/4/16
|
||||||
|
* - add giflib5 support
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -55,6 +57,17 @@
|
|||||||
|
|
||||||
#include <gif_lib.h>
|
#include <gif_lib.h>
|
||||||
|
|
||||||
|
/* giflib 5 is rather different :-( functions have error returns and there's
|
||||||
|
* not LastError function.
|
||||||
|
*
|
||||||
|
* GIFLIB_MAJOR was introduced in 4.1.6. Use it to test for giflib 5.x.
|
||||||
|
*/
|
||||||
|
#ifdef GIFLIB_MAJOR
|
||||||
|
# if GIFLIB_MAJOR > 4
|
||||||
|
# define HAVE_GIFLIB_5
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct _VipsForeignLoadGif {
|
typedef struct _VipsForeignLoadGif {
|
||||||
VipsForeignLoad parent_object;
|
VipsForeignLoad parent_object;
|
||||||
|
|
||||||
@ -86,11 +99,14 @@ static int
|
|||||||
InterlacedOffset[] = { 0, 4, 2, 1 },
|
InterlacedOffset[] = { 0, 4, 2, 1 },
|
||||||
InterlacedJumps[] = { 8, 8, 4, 2 };
|
InterlacedJumps[] = { 8, 8, 4, 2 };
|
||||||
|
|
||||||
/* From gif-lib.h
|
/* giflib4 was missing this.
|
||||||
*/
|
*/
|
||||||
static const char *
|
static const char *
|
||||||
vips_foreign_load_gif_errstr( int error_code )
|
vips_foreign_load_gif_errstr( int error_code )
|
||||||
{
|
{
|
||||||
|
#ifdef HAVE_GIFLIB_5
|
||||||
|
return( GifErrorString( error_code ) );
|
||||||
|
#else /*!HAVE_GIFLIB_5*/
|
||||||
switch( error_code ) {
|
switch( error_code ) {
|
||||||
case D_GIF_ERR_OPEN_FAILED:
|
case D_GIF_ERR_OPEN_FAILED:
|
||||||
return( _( "Failed to open given file" ) );
|
return( _( "Failed to open given file" ) );
|
||||||
@ -134,15 +150,86 @@ vips_foreign_load_gif_errstr( int error_code )
|
|||||||
default:
|
default:
|
||||||
return( _( "Unknown error" ) );
|
return( _( "Unknown error" ) );
|
||||||
}
|
}
|
||||||
|
#endif /*HAVE_GIFLIB_5*/
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
vips_foreign_load_gif_error( VipsForeignLoadGif *gif )
|
vips_foreign_load_gif_error( VipsForeignLoadGif *gif )
|
||||||
{
|
{
|
||||||
VipsObjectClass *class = VIPS_OBJECT_GET_CLASS( gif );
|
#ifdef HAVE_GIFLIB_5
|
||||||
|
if( gif->file )
|
||||||
|
vips_foreign_load_gif_errstr( gif->file->Error );
|
||||||
|
#else
|
||||||
|
vips_foreign_load_gif_errstr( GifLastError() );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
vips_error( class->nickname, _( "giflib error: %s" ),
|
static void
|
||||||
vips_foreign_load_gif_errstr( GifLastError() ) );
|
vips_foreign_load_gif_close( VipsForeignLoadGif *gif )
|
||||||
|
{
|
||||||
|
#ifdef HAVE_GIFLIB_5
|
||||||
|
if( gif->file ) {
|
||||||
|
int error;
|
||||||
|
|
||||||
|
if( DGifCloseFile( gif->file, &error ) )
|
||||||
|
vips_foreign_load_gif_errstr( error );
|
||||||
|
gif->file = NULL;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if( gif->file ) {
|
||||||
|
if( DGifCloseFile( gif->file ) )
|
||||||
|
vips_foreign_load_gif_errstr( GifLastError() );
|
||||||
|
gif->file = NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
vips_foreign_load_gif_open( VipsForeignLoadGif *gif, const char *filename )
|
||||||
|
{
|
||||||
|
g_assert( !gif->file );
|
||||||
|
|
||||||
|
#ifdef HAVE_GIFLIB_5
|
||||||
|
{
|
||||||
|
int error;
|
||||||
|
|
||||||
|
if( !(gif->file = DGifOpenFileName( filename, &error )) ) {
|
||||||
|
vips_foreign_load_gif_errstr( error );
|
||||||
|
return( -1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if( !(gif->file = DGifOpenFileName( filename )) ) {
|
||||||
|
vips_foreign_load_gif_errstr( GifLastError() );
|
||||||
|
return( -1 );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
vips_foreign_load_gif_open_buffer( VipsForeignLoadGif *gif, InputFunc read_fn )
|
||||||
|
{
|
||||||
|
g_assert( !gif->file );
|
||||||
|
|
||||||
|
#ifdef HAVE_GIFLIB_5
|
||||||
|
{
|
||||||
|
int error;
|
||||||
|
|
||||||
|
if( !(gif->file = DGifOpen( gif, read_fn, &error )) ) {
|
||||||
|
vips_foreign_load_gif_errstr( error );
|
||||||
|
return( -1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if( !(gif->file = DGifOpen( gif, read_fn )) ) {
|
||||||
|
vips_foreign_load_gif_errstr( GifLastError() );
|
||||||
|
return( -1 );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return( 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -150,7 +237,7 @@ vips_foreign_load_gif_dispose( GObject *gobject )
|
|||||||
{
|
{
|
||||||
VipsForeignLoadGif *gif = (VipsForeignLoadGif *) gobject;
|
VipsForeignLoadGif *gif = (VipsForeignLoadGif *) gobject;
|
||||||
|
|
||||||
VIPS_FREEF( DGifCloseFile, gif->file );
|
vips_foreign_load_gif_close( gif );
|
||||||
|
|
||||||
G_OBJECT_CLASS( vips_foreign_load_gif_parent_class )->
|
G_OBJECT_CLASS( vips_foreign_load_gif_parent_class )->
|
||||||
dispose( gobject );
|
dispose( gobject );
|
||||||
@ -293,7 +380,7 @@ vips_foreign_load_gif_render( VipsForeignLoadGif *gif, VipsImage *out )
|
|||||||
|
|
||||||
if( DGifGetLine( gif->file, gif->line,
|
if( DGifGetLine( gif->file, gif->line,
|
||||||
file->Image.Width ) == GIF_ERROR ) {
|
file->Image.Width ) == GIF_ERROR ) {
|
||||||
vips_foreign_load_gif_error( gif );
|
vips_foreign_load_gif_error( gif );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -311,7 +398,7 @@ vips_foreign_load_gif_render( VipsForeignLoadGif *gif, VipsImage *out )
|
|||||||
|
|
||||||
if( DGifGetLine( gif->file, gif->line,
|
if( DGifGetLine( gif->file, gif->line,
|
||||||
file->Image.Width ) == GIF_ERROR ) {
|
file->Image.Width ) == GIF_ERROR ) {
|
||||||
vips_foreign_load_gif_error( gif );
|
vips_foreign_load_gif_error( gif );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -349,7 +436,7 @@ vips_foreign_load_gif_load( VipsForeignLoad *load )
|
|||||||
int ext_code;
|
int ext_code;
|
||||||
|
|
||||||
if( DGifGetRecordType( gif->file, &record) == GIF_ERROR ) {
|
if( DGifGetRecordType( gif->file, &record) == GIF_ERROR ) {
|
||||||
vips_foreign_load_gif_error( gif );
|
vips_foreign_load_gif_error( gif );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -358,7 +445,7 @@ vips_foreign_load_gif_load( VipsForeignLoad *load )
|
|||||||
VIPS_DEBUG_MSG( "gifload: IMAGE_DESC_RECORD_TYPE:\n" );
|
VIPS_DEBUG_MSG( "gifload: IMAGE_DESC_RECORD_TYPE:\n" );
|
||||||
|
|
||||||
if( DGifGetImageDesc( gif->file ) == GIF_ERROR ) {
|
if( DGifGetImageDesc( gif->file ) == GIF_ERROR ) {
|
||||||
vips_foreign_load_gif_error( gif );
|
vips_foreign_load_gif_error( gif );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -378,7 +465,7 @@ vips_foreign_load_gif_load( VipsForeignLoad *load )
|
|||||||
|
|
||||||
if( DGifGetExtension( gif->file,
|
if( DGifGetExtension( gif->file,
|
||||||
&ext_code, &extension) == GIF_ERROR ) {
|
&ext_code, &extension) == GIF_ERROR ) {
|
||||||
vips_foreign_load_gif_error( gif );
|
vips_foreign_load_gif_error( gif );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -399,7 +486,7 @@ vips_foreign_load_gif_load( VipsForeignLoad *load )
|
|||||||
while( extension != NULL ) {
|
while( extension != NULL ) {
|
||||||
if( DGifGetExtensionNext( gif->file,
|
if( DGifGetExtensionNext( gif->file,
|
||||||
&extension) == GIF_ERROR ) {
|
&extension) == GIF_ERROR ) {
|
||||||
vips_foreign_load_gif_error( gif );
|
vips_foreign_load_gif_error( gif );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -439,7 +526,7 @@ vips_foreign_load_gif_load( VipsForeignLoad *load )
|
|||||||
/* We've rendered to a memory image ... we can shut down the GIF
|
/* We've rendered to a memory image ... we can shut down the GIF
|
||||||
* reader now.
|
* reader now.
|
||||||
*/
|
*/
|
||||||
VIPS_FREEF( DGifCloseFile, gif->file );
|
vips_foreign_load_gif_close( gif );
|
||||||
|
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
@ -497,10 +584,8 @@ vips_foreign_load_gif_file_header( VipsForeignLoad *load )
|
|||||||
VipsForeignLoadGif *gif = (VipsForeignLoadGif *) load;
|
VipsForeignLoadGif *gif = (VipsForeignLoadGif *) load;
|
||||||
VipsForeignLoadGifFile *file = (VipsForeignLoadGifFile *) load;
|
VipsForeignLoadGifFile *file = (VipsForeignLoadGifFile *) load;
|
||||||
|
|
||||||
if( !(gif->file = DGifOpenFileName( file->filename )) ) {
|
if( vips_foreign_load_gif_open( gif, file->filename ) )
|
||||||
vips_foreign_load_gif_error( gif );
|
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
|
||||||
|
|
||||||
return( vips_foreign_load_gif_header( load ) );
|
return( vips_foreign_load_gif_header( load ) );
|
||||||
}
|
}
|
||||||
@ -593,11 +678,9 @@ vips_foreign_load_gif_buffer_header( VipsForeignLoad *load )
|
|||||||
buffer->p = buffer->buf->data;
|
buffer->p = buffer->buf->data;
|
||||||
buffer->bytes_to_go = buffer->buf->length;
|
buffer->bytes_to_go = buffer->buf->length;
|
||||||
|
|
||||||
if( !(gif->file = DGifOpen( gif,
|
if( vips_foreign_load_gif_open_buffer( gif,
|
||||||
vips_foreign_load_gif_buffer_read )) ) {
|
vips_foreign_load_gif_buffer_read ) )
|
||||||
vips_foreign_load_gif_error( gif );
|
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
|
||||||
|
|
||||||
return( vips_foreign_load_gif_header( load ) );
|
return( vips_foreign_load_gif_header( load ) );
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user