Fix bug #17790 with compilation against giflib 5.1.0 and later.
src/image.c [5 < GIFLIB_MAJOR + (1 <= GIFLIB_MINOR)]: Declare the prototype of DGifCloseFile as appropriate for older and newer versions of giflib. (gif_close): New function, encapsulates the differences in the calling sequence of DGifCloseFile before v5.1.0 and after it. (gif_load): Call gif_close instead of DGifCloseFile. Divulge the error string where appropriate. lisp/term/w32-win.el (dynamic-library-alist): Support giflib 5.1.0 and later.
This commit is contained in:
parent
d35b443a66
commit
b86b15b221
4 changed files with 60 additions and 14 deletions
|
|
@ -1,3 +1,8 @@
|
|||
2014-06-18 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
* term/w32-win.el (dynamic-library-alist): Support giflib 5.1.0
|
||||
and later. (Bug#17790)
|
||||
|
||||
2014-06-18 Juri Linkov <juri@jurta.org>
|
||||
|
||||
* dired.el (dired-mark-pop-up): Let-bind display-buffer-mark-dedicated
|
||||
|
|
|
|||
|
|
@ -251,13 +251,16 @@ This returns an error if any Emacs frames are X frames, or always under W32."
|
|||
;; libraries according to the version of giflib we were
|
||||
;; compiled against. (If we were compiled without GIF support,
|
||||
;; libgif-version's value is -1.)
|
||||
(if (>= libgif-version 50000)
|
||||
;; Yes, giflib 5.x uses 6 as the major version of the API,
|
||||
;; thus "libgif-6.dll" below (giflib 4.x used 5 as the
|
||||
;; major API version).
|
||||
;; giflib5.dll is from the lua-files project.
|
||||
'(gif "libgif-6.dll" "giflib5.dll")
|
||||
'(gif "libgif-5.dll" "giflib4.dll" "libungif4.dll" "libungif.dll"))
|
||||
(if (>= libgif-version 50100)
|
||||
;; Yes, giflib 5.0 uses 6 as the major version of the API,
|
||||
;; and giflib 5.1 uses 7, thus "libgif-7.dll" and
|
||||
;; "libgif-6.dll" below (giflib 4.x used 5 as the major API
|
||||
;; version). giflib5.dll is from the lua-files project,
|
||||
;; and gif.dll is from luapower.
|
||||
'(gif "libgif-7.dll")
|
||||
(if (>= libgif-version 50000)
|
||||
'(gif "libgif-6.dll" "giflib5.dll" "gif.dll")
|
||||
'(gif "libgif-5.dll" "giflib4.dll" "libungif4.dll" "libungif.dll")))
|
||||
'(svg "librsvg-2-2.dll")
|
||||
'(gdk-pixbuf "libgdk_pixbuf-2.0-0.dll")
|
||||
'(glib "libglib-2.0-0.dll")
|
||||
|
|
|
|||
|
|
@ -1,3 +1,13 @@
|
|||
2014-06-18 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
* image.c [5 < GIFLIB_MAJOR + (1 <= GIFLIB_MINOR)]: Declare the
|
||||
prototype of DGifCloseFile as appropriate for older and newer
|
||||
versions of giflib.
|
||||
(gif_close): New function, encapsulates the differences in the
|
||||
calling sequence of DGifCloseFile before v5.1.0 and after it.
|
||||
(gif_load): Call gif_close instead of DGifCloseFile. Divulge the
|
||||
error string where appropriate. (Bug#17790)
|
||||
|
||||
2014-06-16 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
* xdisp.c (Fmove_point_visually): Instead of testing for keyboard
|
||||
|
|
|
|||
42
src/image.c
42
src/image.c
|
|
@ -7255,7 +7255,11 @@ gif_image_p (Lisp_Object object)
|
|||
#ifdef WINDOWSNT
|
||||
|
||||
/* GIF library details. */
|
||||
#if 5 < GIFLIB_MAJOR + (1 <= GIFLIB_MINOR)
|
||||
DEF_IMGLIB_FN (int, DGifCloseFile, (GifFileType *, int *));
|
||||
#else
|
||||
DEF_IMGLIB_FN (int, DGifCloseFile, (GifFileType *));
|
||||
#endif
|
||||
DEF_IMGLIB_FN (int, DGifSlurp, (GifFileType *));
|
||||
#if GIFLIB_MAJOR < 5
|
||||
DEF_IMGLIB_FN (GifFileType *, DGifOpen, (void *, InputFunc));
|
||||
|
|
@ -7325,6 +7329,19 @@ gif_read_from_memory (GifFileType *file, GifByteType *buf, int len)
|
|||
return len;
|
||||
}
|
||||
|
||||
static int
|
||||
gif_close (GifFileType *gif, int *err)
|
||||
{
|
||||
int retval;
|
||||
|
||||
#if 5 < GIFLIB_MAJOR + (1 <= GIFLIB_MINOR)
|
||||
retval = fn_DGifCloseFile (gif, err);
|
||||
#else
|
||||
retval = fn_DGifCloseFile (gif);
|
||||
if (err)
|
||||
*err = gif->Error;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Load GIF image IMG for use on frame F. Value is true if
|
||||
successful. */
|
||||
|
|
@ -7419,7 +7436,7 @@ gif_load (struct frame *f, struct image *img)
|
|||
if (!check_image_size (f, gif->SWidth, gif->SHeight))
|
||||
{
|
||||
image_error ("Invalid image size (see `max-image-size')", Qnil, Qnil);
|
||||
fn_DGifCloseFile (gif);
|
||||
gif_close (gif, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -7428,7 +7445,7 @@ gif_load (struct frame *f, struct image *img)
|
|||
if (rc == GIF_ERROR || gif->ImageCount <= 0)
|
||||
{
|
||||
image_error ("Error reading `%s'", img->spec, Qnil);
|
||||
fn_DGifCloseFile (gif);
|
||||
gif_close (gif, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -7440,7 +7457,7 @@ gif_load (struct frame *f, struct image *img)
|
|||
{
|
||||
image_error ("Invalid image number `%s' in image `%s'",
|
||||
image_number, img->spec);
|
||||
fn_DGifCloseFile (gif);
|
||||
gif_close (gif, NULL);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
|
@ -7458,7 +7475,7 @@ gif_load (struct frame *f, struct image *img)
|
|||
if (!check_image_size (f, width, height))
|
||||
{
|
||||
image_error ("Invalid image size (see `max-image-size')", Qnil, Qnil);
|
||||
fn_DGifCloseFile (gif);
|
||||
gif_close (gif, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -7476,7 +7493,7 @@ gif_load (struct frame *f, struct image *img)
|
|||
&& 0 <= subimg_left && subimg_left <= width - subimg_width))
|
||||
{
|
||||
image_error ("Subimage does not fit in image", Qnil, Qnil);
|
||||
fn_DGifCloseFile (gif);
|
||||
gif_close (gif, NULL);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
|
@ -7484,7 +7501,7 @@ gif_load (struct frame *f, struct image *img)
|
|||
/* Create the X image and pixmap. */
|
||||
if (!image_create_x_image_and_pixmap (f, img, width, height, 0, &ximg, 0))
|
||||
{
|
||||
fn_DGifCloseFile (gif);
|
||||
gif_close (gif, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -7655,7 +7672,18 @@ gif_load (struct frame *f, struct image *img)
|
|||
Fcons (make_number (gif->ImageCount),
|
||||
img->lisp_data));
|
||||
|
||||
fn_DGifCloseFile (gif);
|
||||
if (gif_close (gif, &gif_err) == GIF_ERROR)
|
||||
{
|
||||
#if 5 <= GIFLIB_MAJOR
|
||||
char *error_text = fn_GifErrorString (gif_err);
|
||||
|
||||
if (error_text)
|
||||
image_error ("Error closing `%s': %s",
|
||||
img->spec, build_string (error_text));
|
||||
#else
|
||||
image_error ("Error closing `%s'", img->spec);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Maybe fill in the background field while we have ximg handy. */
|
||||
if (NILP (image_spec_value (img->spec, QCbackground, NULL)))
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue