[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: display word wrapping
From: |
Juanma Barranquero |
Subject: |
Re: display word wrapping |
Date: |
Tue, 08 Jun 2004 13:31:43 +0200 |
OK, here's the patch with Vimage_types containing a list of potentially
supported image types, and an internal image_type_cache serving as a
cache alist.
Questions:
- Should image_type_cache be exported to Lisp? OOH, it is an
implementation detail; OTOH, exporting it would allow reseting an
entry and trying a new library without restarting Emacs (if a load
failed, of course; there's no support for unloading image libraries).
- I'm initializing Vimage_types in syms_of_image() instead of
init_image(), because I have the relevant #ifdef's already in place,
but that's no a very good reason :) Should I move it?
- Is any way to do a defconst from C code? (There's no DEFCONST_LISP).
Or is it irrelevant?
David, could you please try the patch and see if it addresses your
concerns?
Juanma
--- src/xdisp.c.orig 2004-06-08 13:20:45.000000000 +0200
+++ src/xdisp.c 2004-06-08 12:47:27.000000000 +0200
@@ -22262,5 +22262,6 @@
DEFVAR_LISP ("image-types", &Vimage_types,
doc: /* List of supported image types.
-Each element of the list is a symbol for a supported image type. */);
+Each element of the list is a symbol for a potentially supported image type.
+To know whether it is really supported, you must use `image-type-available-p'.
*/);
Vimage_types = Qnil;
--- src/image.c.orig 2004-06-07 13:14:55.000000000 +0200
+++ src/image.c 2004-06-08 13:09:57.000000000 +0200
@@ -606,4 +606,8 @@
static struct image_type *image_types;
+/* Cache for delayed-loading image types. */
+
+Lisp_Object image_type_cache;
+
/* The symbol `xbm' which is used as the type symbol for XBM images. */
@@ -630,5 +634,5 @@
/* Function prototypes. */
-static void define_image_type P_ ((struct image_type *type));
+static Lisp_Object define_image_type P_ ((struct image_type *type, int
loaded));
static struct image_type *lookup_image_type P_ ((Lisp_Object symbol));
static void image_error P_ ((char *format, Lisp_Object, Lisp_Object));
@@ -638,19 +642,35 @@
Lisp_Object));
+#define CACHE_IMAGE_TYPE(type, status) \
+ do { image_type_cache = Fcons (Fcons (type, status), image_type_cache); }
while (0)
+
+#define ADD_SUPPORTED_IMAGE_TYPE(type) \
+ do { Vimage_types = Fcons (type, Vimage_types); } while (0)
/* Define a new image type from TYPE. This adds a copy of TYPE to
- image_types and adds the symbol *TYPE->type to Vimage_types. */
+ image_types and adds (*TYPE->type, loaded) to image_type_cache. */
-static void
-define_image_type (type)
+static Lisp_Object
+define_image_type (type, loaded)
struct image_type *type;
+ int loaded;
{
- /* Make a copy of TYPE to avoid a bus error in a dumped Emacs.
- The initialized data segment is read-only. */
- struct image_type *p = (struct image_type *) xmalloc (sizeof *p);
- bcopy (type, p, sizeof *p);
- p->next = image_types;
- image_types = p;
- Vimage_types = Fcons (*p->type, Vimage_types);
+ Lisp_Object success;
+
+ if (!loaded)
+ success = Qnil;
+ else
+ {
+ /* Make a copy of TYPE to avoid a bus error in a dumped Emacs.
+ The initialized data segment is read-only. */
+ struct image_type *p = (struct image_type *) xmalloc (sizeof *p);
+ bcopy (type, p, sizeof *p);
+ p->next = image_types;
+ image_types = p;
+ success = Qt;
+ }
+
+ CACHE_IMAGE_TYPE(*type->type, success);
+ return success;
}
@@ -1789,4 +1809,31 @@
}
+/* Load a DLL implementing an image type.
+ The `image-library-alist' variable associates a symbol,
+ identifying an image type, to a list of possible filenames.
+ The function returns NULL if no library could be loaded for
+ the given image type, or if the library was previously loaded;
+ else the handle of the DLL. */
+static HMODULE
+w32_dynaload (Lisp_Object libraries, Lisp_Object library_id)
+{
+ HMODULE library = NULL;
+
+ if (CONSP (libraries) && NILP (Fassq (library_id, image_type_cache)))
+ {
+ Lisp_Object dlls = Fassq (library_id, libraries);
+
+ if (CONSP (dlls))
+ for (dlls = XCDR (dlls); CONSP (dlls); dlls = XCDR (dlls))
+ {
+ CHECK_STRING_CAR (dlls);
+ if (library = LoadLibrary (SDATA (XCAR (dlls))))
+ break;
+ }
+ }
+
+ return library;
+}
+
#endif /* HAVE_NTGUI */
@@ -3489,11 +3536,10 @@
DEF_IMGLIB_FN (XImageFree);
-
static int
-init_xpm_functions (void)
+init_xpm_functions (Lisp_Object libraries)
{
HMODULE library;
- if (!(library = LoadLibrary ("libXpm.dll")))
+ if (!(library = w32_dynaload (libraries, Qxpm)))
return 0;
@@ -5589,19 +5635,10 @@
static int
-init_png_functions (void)
+init_png_functions (Lisp_Object libraries)
{
HMODULE library;
- /* Ensure zlib is loaded. Try debug version first. */
- if (!LoadLibrary ("zlibd.dll")
- && !LoadLibrary ("zlib.dll"))
- return 0;
-
/* Try loading libpng under probable names. */
- if (!(library = LoadLibrary ("libpng13d.dll"))
- && !(library = LoadLibrary ("libpng13.dll"))
- && !(library = LoadLibrary ("libpng12d.dll"))
- && !(library = LoadLibrary ("libpng12.dll"))
- && !(library = LoadLibrary ("libpng.dll")))
+ if (!(library = w32_dynaload (libraries, Qpng)))
return 0;
@@ -6247,11 +6284,9 @@
static int
-init_jpeg_functions (void)
+init_jpeg_functions (Lisp_Object libraries)
{
HMODULE library;
- if (!(library = LoadLibrary ("libjpeg.dll"))
- && !(library = LoadLibrary ("jpeg-62.dll"))
- && !(library = LoadLibrary ("jpeg.dll")))
+ if (!(library = w32_dynaload (libraries, Qjpeg)))
return 0;
@@ -6684,9 +6719,9 @@
static int
-init_tiff_functions (void)
+init_tiff_functions (Lisp_Object libraries)
{
HMODULE library;
- if (!(library = LoadLibrary ("libtiff.dll")))
+ if (!(library = w32_dynaload (libraries, Qtiff)))
return 0;
@@ -7104,9 +7139,9 @@
static int
-init_gif_functions (void)
+init_gif_functions (Lisp_Object libraries)
{
HMODULE library;
- if (!(library = LoadLibrary ("libungif.dll")))
+ if (!(library = w32_dynaload (libraries, Qgif)))
return 0;
@@ -7881,7 +7916,70 @@
***********************************************************************/
+#ifdef HAVE_NTGUI
+/* Image types that rely on external libraries are loaded dynamically
+ if the library is available. */
+#define CHECK_LIB_AVAILABLE(image_type, init_lib_fn) \
+ define_image_type (image_type, init_lib_fn (libraries))
+#else
+#define CHECK_LIB_AVAILABLE(image_type, init_lib_fn) \
+ define_image_type (image_type, TRUE)
+#endif /* HAVE_NTGUI */
+
+DEFUN ("init-image-library", Finit_image_library, Sinit_image_library, 2, 2, 0,
+ doc: /* Initialize image library implementing image type TYPE.
+Return non-nil if TYPE is a supported image type.
+
+Image types pbm and xbm are prebuilt; other types are loaded here.
+Libraries to load are specified in alist LIBRARIES (usually, the value
+of `image-library-alist', which see. */)
+ (type, libraries)
+{
+ Lisp_Object tested;
+
+ /* Don't try to reload the library. */
+ tested = Fassq (type, image_type_cache);
+ if (CONSP (tested))
+ return XCDR (tested);
+
+#if defined (HAVE_XPM) || defined (MAC_OS)
+ if (EQ (type, Qxpm))
+ return CHECK_LIB_AVAILABLE(&xpm_type, init_xpm_functions);
+#endif
+
+#if defined (HAVE_JPEG) || defined (MAC_OS)
+ if (EQ (type, Qjpeg))
+ return CHECK_LIB_AVAILABLE(&jpeg_type, init_jpeg_functions);
+#endif
+
+#if defined (HAVE_TIFF) || defined (MAC_OS)
+ if (EQ (type, Qtiff))
+ return CHECK_LIB_AVAILABLE(&tiff_type, init_tiff_functions);
+#endif
+
+#if defined (HAVE_GIF) || defined (MAC_OS)
+ if (EQ (type, Qgif))
+ return CHECK_LIB_AVAILABLE(&gif_type, init_gif_functions);
+#endif
+
+#if defined (HAVE_PNG) || defined (MAC_OS)
+ if (EQ (type, Qpng))
+ return CHECK_LIB_AVAILABLE(&png_type, init_png_functions);
+#endif
+
+#ifdef HAVE_GHOSTSCRIPT
+ if (EQ (type, Qpostscript))
+ return CHECK_LIB_AVAILABLE(&gs_type, init_gs_functions);
+#endif
+
+ /* If the type is not recognized, avoid testing it ever again. */
+ CACHE_IMAGE_TYPE(type, Qnil);
+ return Qnil;
+}
+
void
syms_of_image ()
{
+ Vimage_types = Qnil;
+
QCascent = intern (":ascent");
staticpro (&QCascent);
@@ -7917,4 +8015,5 @@
staticpro (&Qpostscript);
#ifdef HAVE_GHOSTSCRIPT
+ ADD_SUPPORTED_IMAGE_TYPE(&Qpostscript);
QCloader = intern (":loader");
staticpro (&QCloader);
@@ -7929,11 +8028,14 @@
Qpbm = intern ("pbm");
staticpro (&Qpbm);
+ ADD_SUPPORTED_IMAGE_TYPE(Qpbm);
Qxbm = intern ("xbm");
staticpro (&Qxbm);
+ ADD_SUPPORTED_IMAGE_TYPE(Qxbm);
#if defined (HAVE_XPM) || defined (MAC_OS)
Qxpm = intern ("xpm");
staticpro (&Qxpm);
+ ADD_SUPPORTED_IMAGE_TYPE(Qxpm);
#endif
@@ -7941,4 +8043,5 @@
Qjpeg = intern ("jpeg");
staticpro (&Qjpeg);
+ ADD_SUPPORTED_IMAGE_TYPE(Qjpeg);
#endif
@@ -7946,4 +8049,5 @@
Qtiff = intern ("tiff");
staticpro (&Qtiff);
+ ADD_SUPPORTED_IMAGE_TYPE(Qtiff);
#endif
@@ -7951,4 +8055,5 @@
Qgif = intern ("gif");
staticpro (&Qgif);
+ ADD_SUPPORTED_IMAGE_TYPE(Qgif);
#endif
@@ -7956,6 +8061,8 @@
Qpng = intern ("png");
staticpro (&Qpng);
+ ADD_SUPPORTED_IMAGE_TYPE(Qpng);
#endif
+ defsubr (&Sinit_image_library);
defsubr (&Sclear_image_cache);
defsubr (&Simage_size);
@@ -7985,50 +8092,12 @@
}
-
-#ifdef HAVE_NTGUI
-/* Image types that rely on external libraries are loaded dynamically
- if the library is available. */
-#define IF_LIB_AVAILABLE(init_lib_fn) if (init_lib_fn())
-#else
-#define IF_LIB_AVAILABLE(init_func) /* Load unconditionally */
-#endif /* HAVE_NTGUI */
-
void
init_image ()
{
image_types = NULL;
- Vimage_types = Qnil;
-
- define_image_type (&xbm_type);
- define_image_type (&pbm_type);
-
-#if defined (HAVE_XPM) || defined (MAC_OS)
- IF_LIB_AVAILABLE(init_xpm_functions)
- define_image_type (&xpm_type);
-#endif
-
-#if defined (HAVE_JPEG) || defined (MAC_OS)
- IF_LIB_AVAILABLE(init_jpeg_functions)
- define_image_type (&jpeg_type);
-#endif
-
-#if defined (HAVE_TIFF) || defined (MAC_OS)
- IF_LIB_AVAILABLE(init_tiff_functions)
- define_image_type (&tiff_type);
-#endif
-
-#if defined (HAVE_GIF) || defined (MAC_OS)
- IF_LIB_AVAILABLE(init_gif_functions)
- define_image_type (&gif_type);
-#endif
+ image_type_cache = Qnil;
-#if defined (HAVE_PNG) || defined (MAC_OS)
- IF_LIB_AVAILABLE(init_png_functions)
- define_image_type (&png_type);
-#endif
-
-#ifdef HAVE_GHOSTSCRIPT
- define_image_type (&gs_type);
-#endif
+ define_image_type (&xbm_type, TRUE);
+ define_image_type (&pbm_type, TRUE);
#ifdef MAC_OS
--- lisp/image.el.orig 2004-06-07 13:13:55.000000000 +0200
+++ lisp/image.el 2004-06-08 02:06:53.000000000 +0200
@@ -49,4 +49,15 @@
a non-nil value, TYPE is the image's type.")
+;;;###autoload
+(defvar image-library-alist nil
+ "Alist of image types vs external libraries needed to display them.
+
+Each element is a list (IMAGE-TYPE LIBRARY...), where the car is a symbol
+representing a supported image type, and the rest are strings giving
+alternate filenames for the corresponding external libraries to load.
+They are tried in the order they appear on the list; if none of them can
+be loaded, the running session of Emacs won't display the image type.
+No entries are needed for pbm and xbm images; they're always supported.")
+;;;###autoload (put 'image-library-alist 'risky-local-variable t)
(defun image-jpeg-p (data)
@@ -112,6 +123,6 @@
"Value is non-nil if image type TYPE is available.
Image types are symbols like `xbm' or `jpeg'."
- (and (boundp 'image-types) (not (null (memq type image-types)))))
-
+ (and (fboundp 'init-image-library)
+ (init-image-library type image-library-alist)))
;;;###autoload
--- lisp/term/w32-win.el.orig 2004-06-07 13:16:33.000000000 +0200
+++ lisp/term/w32-win.el 2004-06-08 02:06:58.000000000 +0200
@@ -1262,4 +1262,12 @@
(error "Font not found")))))
+;;; Set default known names for image libraries
+(setq image-library-alist
+ '((xpm "libXpm-nox4.dll" "libxpm.dll")
+ (png "libpng13d.dll" "libpng13.dll" "libpng12d.dll" "libpng12.dll"
"libpng.dll")
+ (jpeg "jpeg62.dll" "libjpeg.dll" "jpeg-62.dll" "jpeg.dll")
+ (tiff "libtiff3.dll" "libtiff.dll")
+ (gif "libungif.dll")))
+
;;; arch-tag: 69fb1701-28c2-4890-b351-3d1fe4b4f166
;;; w32-win.el ends here
- Re: display word wrapping, (continued)
- Re: display word wrapping, Kim F. Storm, 2004/06/08
- Re: display word wrapping, David Kastrup, 2004/06/08
- Re: display word wrapping, Juanma Barranquero, 2004/06/08
- Re: display word wrapping, David Kastrup, 2004/06/08
- Re: display word wrapping, Juanma Barranquero, 2004/06/08
- Re: display word wrapping, David Kastrup, 2004/06/08
- Re: display word wrapping, Juanma Barranquero, 2004/06/08
- Re: display word wrapping, Kim F. Storm, 2004/06/08
- Re: display word wrapping, Miles Bader, 2004/06/08
- Re: display word wrapping, David Kastrup, 2004/06/08
- Re: display word wrapping,
Juanma Barranquero <=
- Re: display word wrapping, David Kastrup, 2004/06/08
- Re: display word wrapping, Juanma Barranquero, 2004/06/08
- Re: display word wrapping, Kim F. Storm, 2004/06/08
- Re: display word wrapping, Juanma Barranquero, 2004/06/08
- Re: display word wrapping, Juanma Barranquero, 2004/06/08
- Re: display word wrapping, Juanma Barranquero, 2004/06/08
- Re: display word wrapping, Juanma Barranquero, 2004/06/02
- Re: display word wrapping, Jason Rumney, 2004/06/03
- Re: display word wrapping, Juanma Barranquero, 2004/06/03
- Re: display word wrapping, Benjamin Riefenstahl, 2004/06/03