#define x_defined_color w32_defined_color
#define DefaultDepthOfScreen(screen) (one_w32_display_info.n_cbits)
-/* Version of libpng that we were compiled with, or -1 if no PNG
- support was compiled in. This is tested by w32-win.el to correctly
- set up the alist used to search for PNG libraries. */
-Lisp_Object Qlibpng_version;
+/* Versions of libpng, libgif, and libjpeg that we were compiled with,
+ or -1 if no PNG/GIF support was compiled in. This is tested by
+ w32-win.el to correctly set up the alist used to search for the
+ respective image libraries. */
+Lisp_Object Qlibpng_version, Qlibgif_version, Qlibjpeg_version;
+
#endif /* HAVE_NTGUI */
#ifdef HAVE_NS
/* Functions to access the contents of a bitmap, given an id. */
-int
+static int
x_bitmap_height (struct frame *f, ptrdiff_t id)
{
return FRAME_DISPLAY_INFO (f)->bitmaps[id - 1].height;
}
-int
+static int
x_bitmap_width (struct frame *f, ptrdiff_t id)
{
return FRAME_DISPLAY_INFO (f)->bitmaps[id - 1].width;
}
else if (BOOL_VECTOR_P (elt))
{
- if (XBOOL_VECTOR (elt)->size < width)
+ if (bool_vector_size (elt) < width)
return 0;
}
else
}
else if (BOOL_VECTOR_P (data))
{
- if (XBOOL_VECTOR (data)->size / height < width)
+ if (bool_vector_size (data) / height < width)
return 0;
}
else
}
+/* Get next char skipping comments in Netpbm header. Returns -1 at
+ end of input. */
+
+static int
+pbm_next_char (unsigned char **s, unsigned char *end)
+{
+ int c = -1;
+
+ while (*s < end && (c = *(*s)++, c == '#'))
+ {
+ /* Skip to the next line break. */
+ while (*s < end && (c = *(*s)++, c != '\n' && c != '\r'))
+ ;
+
+ c = -1;
+ }
+
+ return c;
+}
+
+
/* Scan a decimal number from *S and return it. Advance *S while
reading the number. END is the end of the string. Value is -1 at
end of input. */
{
int c = 0, val = -1;
- while (*s < end)
- {
- /* Skip white-space. */
- while (*s < end && (c = *(*s)++, c_isspace (c)))
- ;
+ /* Skip white-space. */
+ while ((c = pbm_next_char (s, end)) != -1 && c_isspace (c))
+ ;
- if (c == '#')
- {
- /* Skip comment to end of line. */
- while (*s < end && (c = *(*s)++, c != '\n'))
- ;
- }
- else if (c_isdigit (c))
- {
- /* Read decimal number. */
- val = c - '0';
- while (*s < end && (c = *(*s)++, c_isdigit (c)))
- val = 10 * val + c - '0';
- break;
- }
- else
- break;
+ if (c_isdigit (c))
+ {
+ /* Read decimal number. */
+ val = c - '0';
+ while ((c = pbm_next_char (s, end)) != -1 && c_isdigit (c))
+ val = 10 * val + c - '0';
}
return val;
#ifdef HAVE_GIF
#if defined (HAVE_NTGUI)
+
/* winuser.h might define DrawText to DrawTextA or DrawTextW.
Undefine before redefining to avoid a preprocessor warning. */
#ifdef DrawText
#include <gif_lib.h>
#undef DrawText
+/* Giflib before 5.0 didn't define these macros (used only if HAVE_NTGUI). */
+#ifndef GIFLIB_MINOR
+#define GIFLIB_MINOR 0
+#endif
+#ifndef GIFLIB_RELEASE
+#define GIFLIB_RELEASE 0
+#endif
+
#else /* HAVE_NTGUI */
#include <gif_lib.h>
#endif /* HAVE_NTGUI */
+/* Giflib before 5.0 didn't define these macros. */
+#ifndef GIFLIB_MAJOR
+#define GIFLIB_MAJOR 4
+#endif
#ifdef WINDOWSNT
/* GIF library details. */
DEF_IMGLIB_FN (int, DGifCloseFile, (GifFileType *));
DEF_IMGLIB_FN (int, DGifSlurp, (GifFileType *));
+#if GIFLIB_MAJOR < 5
DEF_IMGLIB_FN (GifFileType *, DGifOpen, (void *, InputFunc));
DEF_IMGLIB_FN (GifFileType *, DGifOpenFileName, (const char *));
+#else
+DEF_IMGLIB_FN (GifFileType *, DGifOpen, (void *, InputFunc, int *));
+DEF_IMGLIB_FN (GifFileType *, DGifOpenFileName, (const char *, int *));
+DEF_IMGLIB_FN (char *, GifErrorString, (int));
+#endif
static bool
init_gif_functions (void)
LOAD_IMGLIB_FN (library, DGifSlurp);
LOAD_IMGLIB_FN (library, DGifOpen);
LOAD_IMGLIB_FN (library, DGifOpenFileName);
+#if GIFLIB_MAJOR >= 5
+ LOAD_IMGLIB_FN (library, GifErrorString);
+#endif
return 1;
}
#define fn_DGifSlurp DGifSlurp
#define fn_DGifOpen DGifOpen
#define fn_DGifOpenFileName DGifOpenFileName
+#if 5 <= GIFLIB_MAJOR
+# define fn_GifErrorString GifErrorString
+#endif
#endif /* WINDOWSNT */
Lisp_Object specified_data = image_spec_value (img->spec, QCdata, NULL);
unsigned long bgcolor = 0;
EMACS_INT idx;
+#if GIFLIB_MAJOR >= 5
+ int gif_err;
+#endif
if (NILP (specified_data))
{
}
/* Open the GIF file. */
+#if GIFLIB_MAJOR < 5
gif = fn_DGifOpenFileName (SSDATA (file));
if (gif == NULL)
{
image_error ("Cannot open `%s'", file, Qnil);
return 0;
}
+#else
+ gif = fn_DGifOpenFileName (SSDATA (file), &gif_err);
+ if (gif == NULL)
+ {
+ image_error ("Cannot open `%s': %s",
+ file, build_string (fn_GifErrorString (gif_err)));
+ return 0;
+ }
+#endif
}
else
{
memsrc.len = SBYTES (specified_data);
memsrc.index = 0;
+#if GIFLIB_MAJOR < 5
gif = fn_DGifOpen (&memsrc, gif_read_from_memory);
if (!gif)
{
image_error ("Cannot open memory source `%s'", img->spec, Qnil);
return 0;
}
+#else
+ gif = fn_DGifOpen (&memsrc, gif_read_from_memory, &gif_err);
+ if (!gif)
+ {
+ image_error ("Cannot open memory source `%s': %s",
+ img->spec, build_string (fn_GifErrorString (gif_err)));
+ return 0;
+ }
+#endif
}
/* Before reading entire contents, check the declared image size. */
y++, row += interlace_increment[pass])
{
while (subimg_height <= row)
- {
- assume (pass < 3);
- row = interlace_start[++pass];
- }
+ row = interlace_start[++pass];
for (x = 0; x < subimg_width; x++)
{
make_number (PNG_LIBPNG_VER)
#else
make_number (-1)
+#endif
+ );
+ DEFSYM (Qlibgif_version, "libgif-version");
+ Fset (Qlibgif_version,
+#ifdef HAVE_GIF
+ make_number (GIFLIB_MAJOR * 10000
+ + GIFLIB_MINOR * 100
+ + GIFLIB_RELEASE)
+#else
+ make_number (-1)
+#endif
+ );
+ DEFSYM (Qlibjpeg_version, "libjpeg-version");
+ Fset (Qlibjpeg_version,
+#if HAVE_JPEG
+ make_number (JPEG_LIB_VERSION)
+#else
+ make_number (-1)
#endif
);
#endif