Commit b86b15b2 authored by Eli Zaretskii's avatar Eli Zaretskii

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.
parent d35b443a
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")
......
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
......
......@@ -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)))
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment