mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-25 23:10:47 -08:00
(DrawText): Kludge to avoid a redefinition on Windows when including gif_lib.h.
(init_gif_functions): New function. (gif_load): Sync with xfns.c version. Adjust colors for Windows. Disable color table lookups. Call gif library functions through pointers determined at runtime. (init_external_image_libraries): Try to load libungif.dll.
This commit is contained in:
parent
6b89e3aa28
commit
1ffb278b0d
1 changed files with 46 additions and 13 deletions
59
src/w32fns.c
59
src/w32fns.c
|
|
@ -12919,7 +12919,9 @@ tiff_load (f, img)
|
|||
|
||||
#if HAVE_GIF
|
||||
|
||||
#define DrawText gif_DrawText
|
||||
#include <gif_lib.h>
|
||||
#undef DrawText
|
||||
|
||||
static int gif_image_p P_ ((Lisp_Object object));
|
||||
static int gif_load P_ ((struct frame *f, struct image *img));
|
||||
|
|
@ -12975,6 +12977,25 @@ static struct image_type gif_type =
|
|||
NULL
|
||||
};
|
||||
|
||||
|
||||
/* GIF library details. */
|
||||
DEF_IMGLIB_FN (DGifCloseFile);
|
||||
DEF_IMGLIB_FN (DGifSlurp);
|
||||
DEF_IMGLIB_FN (DGifOpen);
|
||||
DEF_IMGLIB_FN (DGifOpenFileName);
|
||||
|
||||
static int
|
||||
init_gif_functions (library)
|
||||
HMODULE library;
|
||||
{
|
||||
LOAD_IMGLIB_FN (library, DGifCloseFile);
|
||||
LOAD_IMGLIB_FN (library, DGifSlurp);
|
||||
LOAD_IMGLIB_FN (library, DGifOpen);
|
||||
LOAD_IMGLIB_FN (library, DGifOpenFileName);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/* Return non-zero if OBJECT is a valid GIF image specification. */
|
||||
|
||||
static int
|
||||
|
|
@ -13061,7 +13082,7 @@ gif_load (f, img)
|
|||
}
|
||||
|
||||
/* Open the GIF file. */
|
||||
gif = DGifOpenFileName (SDATA (file));
|
||||
gif = fn_DGifOpenFileName (SDATA (file));
|
||||
if (gif == NULL)
|
||||
{
|
||||
image_error ("Cannot open `%s'", file, Qnil);
|
||||
|
|
@ -13077,7 +13098,7 @@ gif_load (f, img)
|
|||
memsrc.len = SBYTES (specified_data);
|
||||
memsrc.index = 0;
|
||||
|
||||
gif = DGifOpen(&memsrc, gif_read_from_memory);
|
||||
gif = fn_DGifOpen(&memsrc, gif_read_from_memory);
|
||||
if (!gif)
|
||||
{
|
||||
image_error ("Cannot open memory source `%s'", img->spec, Qnil);
|
||||
|
|
@ -13087,11 +13108,11 @@ gif_load (f, img)
|
|||
}
|
||||
|
||||
/* Read entire contents. */
|
||||
rc = DGifSlurp (gif);
|
||||
rc = fn_DGifSlurp (gif);
|
||||
if (rc == GIF_ERROR)
|
||||
{
|
||||
image_error ("Error reading `%s'", img->spec, Qnil);
|
||||
DGifCloseFile (gif);
|
||||
fn_DGifCloseFile (gif);
|
||||
UNGCPRO;
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -13102,18 +13123,18 @@ gif_load (f, img)
|
|||
{
|
||||
image_error ("Invalid image number `%s' in image `%s'",
|
||||
image, img->spec);
|
||||
DGifCloseFile (gif);
|
||||
fn_DGifCloseFile (gif);
|
||||
UNGCPRO;
|
||||
return 0;
|
||||
}
|
||||
|
||||
width = img->width = gif->SWidth;
|
||||
height = img->height = gif->SHeight;
|
||||
width = img->width = max (gif->SWidth, gif->Image.Left + gif->Image.Width);
|
||||
height = img->height = max (gif->SHeight, gif->Image.Top + gif->Image.Height);
|
||||
|
||||
/* Create the X image and pixmap. */
|
||||
if (!x_create_x_image_and_pixmap (f, width, height, 0, &ximg, &img->pixmap))
|
||||
{
|
||||
DGifCloseFile (gif);
|
||||
fn_DGifCloseFile (gif);
|
||||
UNGCPRO;
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -13122,19 +13143,27 @@ gif_load (f, img)
|
|||
gif_color_map = gif->SavedImages[ino].ImageDesc.ColorMap;
|
||||
if (!gif_color_map)
|
||||
gif_color_map = gif->SColorMap;
|
||||
#if 0 /* TODO: Color tables */
|
||||
init_color_table ();
|
||||
#endif
|
||||
bzero (pixel_colors, sizeof pixel_colors);
|
||||
|
||||
for (i = 0; i < gif_color_map->ColorCount; ++i)
|
||||
{
|
||||
int r = gif_color_map->Colors[i].Red << 8;
|
||||
int g = gif_color_map->Colors[i].Green << 8;
|
||||
int b = gif_color_map->Colors[i].Blue << 8;
|
||||
int r = gif_color_map->Colors[i].Red;
|
||||
int g = gif_color_map->Colors[i].Green;
|
||||
int b = gif_color_map->Colors[i].Blue;
|
||||
#if 0 /* TODO: Color tables */
|
||||
pixel_colors[i] = lookup_rgb_color (f, r, g, b);
|
||||
#else
|
||||
pixel_colors[i] = PALETTERGB (r, g, b);
|
||||
#endif
|
||||
}
|
||||
|
||||
#if 0 /* TODO: Color tables */
|
||||
img->colors = colors_in_color_table (&img->ncolors);
|
||||
free_color_table ();
|
||||
#endif
|
||||
|
||||
/* Clear the part of the screen image that are not covered by
|
||||
the image from the GIF file. Full animated GIF support
|
||||
|
|
@ -13205,7 +13234,7 @@ gif_load (f, img)
|
|||
}
|
||||
}
|
||||
|
||||
DGifCloseFile (gif);
|
||||
fn_DGifCloseFile (gif);
|
||||
|
||||
/* Maybe fill in the background field while we have ximg handy. */
|
||||
if (NILP (image_spec_value (img->spec, QCbackground, NULL)))
|
||||
|
|
@ -15694,7 +15723,11 @@ init_external_image_libraries ()
|
|||
#endif
|
||||
|
||||
#if HAVE_GIF
|
||||
define_image_type (&gif_type);
|
||||
if (library = LoadLibrary ("libungif.dll"))
|
||||
{
|
||||
if (init_gif_functions (library))
|
||||
define_image_type (&gif_type);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if HAVE_PNG
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue