emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/src/image.c [lexbind]


From: Miles Bader
Subject: [Emacs-diffs] Changes to emacs/src/image.c [lexbind]
Date: Tue, 06 Jul 2004 07:04:05 -0400

Index: emacs/src/image.c
diff -c emacs/src/image.c:1.6.2.6 emacs/src/image.c:1.6.2.7
*** emacs/src/image.c:1.6.2.6   Tue Jul  6 10:10:53 2004
--- emacs/src/image.c   Tue Jul  6 10:14:28 2004
***************
*** 606,611 ****
--- 606,619 ----
  
  static struct image_type *image_types;
  
+ /* A list of symbols, one for each supported image type.  */
+ 
+ Lisp_Object Vimage_types;
+ 
+ /* Cache for delayed-loading image types.  */
+ 
+ static Lisp_Object Vimage_type_cache;
+ 
  /* The symbol `xbm' which is used as the type symbol for XBM images.  */
  
  Lisp_Object Qxbm;
***************
*** 630,636 ****
  
  /* Function prototypes.  */
  
! static void define_image_type P_ ((struct image_type *type));
  static struct image_type *lookup_image_type P_ ((Lisp_Object symbol));
  static void image_error P_ ((char *format, Lisp_Object, Lisp_Object));
  static void x_laplace P_ ((struct frame *, struct image *));
--- 638,644 ----
  
  /* Function prototypes.  */
  
! 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));
  static void x_laplace P_ ((struct frame *, struct image *));
***************
*** 638,658 ****
  static int x_build_heuristic_mask P_ ((struct frame *, struct image *,
                                       Lisp_Object));
  
  
  /* 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.  */
  
! static void
! define_image_type (type)
       struct image_type *type;
  {
!   /* 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);
  }
  
  
--- 646,682 ----
  static int x_build_heuristic_mask P_ ((struct frame *, struct image *,
                                       Lisp_Object));
  
+ #define CACHE_IMAGE_TYPE(type, status) \
+   do { Vimage_type_cache = Fcons (Fcons (type, status), Vimage_type_cache); } 
while (0)
+ 
+ #define ADD_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 caches the loading status of TYPE.  */
  
! static Lisp_Object
! define_image_type (type, loaded)
       struct image_type *type;
+      int loaded;
  {
!   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,1794 ****
--- 1813,1845 ----
      if (!fn_##func) return 0;                                         \
    }
  
+ /* 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_delayed_load (Lisp_Object libraries, Lisp_Object type)
+ {
+   HMODULE library = NULL;
+ 
+   if (CONSP (libraries) && NILP (Fassq (type, Vimage_type_cache)))
+     {
+       Lisp_Object dlls = Fassq (type, 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 */
  
  static int x_create_x_image_and_pixmap P_ ((struct frame *, int, int, int,
***************
*** 3489,3501 ****
  DEF_IMGLIB_FN (XpmReadFileToImage);
  DEF_IMGLIB_FN (XImageFree);
  
- 
  static int
! init_xpm_functions (void)
  {
    HMODULE library;
  
!   if (!(library = LoadLibrary ("libXpm.dll")))
      return 0;
  
    LOAD_IMGLIB_FN (library, XpmFreeAttributes);
--- 3540,3551 ----
  DEF_IMGLIB_FN (XpmReadFileToImage);
  DEF_IMGLIB_FN (XImageFree);
  
  static int
! init_xpm_functions (Lisp_Object libraries)
  {
    HMODULE library;
  
!   if (!(library = w32_delayed_load (libraries, Qxpm)))
      return 0;
  
    LOAD_IMGLIB_FN (library, XpmFreeAttributes);
***************
*** 5589,5609 ****
  DEF_IMGLIB_FN (png_error);
  
  static int
! init_png_functions (void)
  {
    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")))
      return 0;
  
    LOAD_IMGLIB_FN (library, png_get_io_ptr);
--- 5639,5650 ----
  DEF_IMGLIB_FN (png_error);
  
  static int
! init_png_functions (Lisp_Object libraries)
  {
    HMODULE library;
  
    /* Try loading libpng under probable names.  */
!   if (!(library = w32_delayed_load (libraries, Qpng)))
      return 0;
  
    LOAD_IMGLIB_FN (library, png_get_io_ptr);
***************
*** 6247,6259 ****
  DEF_IMGLIB_FN (jpeg_resync_to_restart);
  
  static int
! init_jpeg_functions (void)
  {
    HMODULE library;
  
!   if (!(library = LoadLibrary ("libjpeg.dll"))
!       && !(library = LoadLibrary ("jpeg-62.dll"))
!       && !(library = LoadLibrary ("jpeg.dll")))
      return 0;
  
    LOAD_IMGLIB_FN (library, jpeg_finish_decompress);
--- 6288,6298 ----
  DEF_IMGLIB_FN (jpeg_resync_to_restart);
  
  static int
! init_jpeg_functions (Lisp_Object libraries)
  {
    HMODULE library;
  
!   if (!(library = w32_delayed_load (libraries, Qjpeg)))
      return 0;
  
    LOAD_IMGLIB_FN (library, jpeg_finish_decompress);
***************
*** 6684,6694 ****
  DEF_IMGLIB_FN (TIFFClose);
  
  static int
! init_tiff_functions (void)
  {
    HMODULE library;
  
!   if (!(library = LoadLibrary ("libtiff.dll")))
      return 0;
  
    LOAD_IMGLIB_FN (library, TIFFSetErrorHandler);
--- 6723,6733 ----
  DEF_IMGLIB_FN (TIFFClose);
  
  static int
! init_tiff_functions (Lisp_Object libraries)
  {
    HMODULE library;
  
!   if (!(library = w32_delayed_load (libraries, Qtiff)))
      return 0;
  
    LOAD_IMGLIB_FN (library, TIFFSetErrorHandler);
***************
*** 7104,7114 ****
  DEF_IMGLIB_FN (DGifOpenFileName);
  
  static int
! init_gif_functions (void)
  {
    HMODULE library;
  
!   if (!(library = LoadLibrary ("libungif.dll")))
      return 0;
  
    LOAD_IMGLIB_FN (library, DGifCloseFile);
--- 7143,7153 ----
  DEF_IMGLIB_FN (DGifOpenFileName);
  
  static int
! init_gif_functions (Lisp_Object libraries)
  {
    HMODULE library;
  
!   if (!(library = w32_delayed_load (libraries, Qgif)))
      return 0;
  
    LOAD_IMGLIB_FN (library, DGifCloseFile);
***************
*** 7881,7889 ****
--- 7920,8000 ----
                            Initialization
   ***********************************************************************/
  
+ #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, Vimage_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 ()
  {
+   /* Must be defined now becase we're going to update it below, while
+      defining the supported image types.  */
+   DEFVAR_LISP ("image-types", &Vimage_types,
+     doc: /* List of potentially supported image types.
+ Each element of the list is a symbol for a image type, like 'jpeg or 'png.
+ To check whether it is really supported, use `image-type-available-p'.  */);
+   Vimage_types = Qnil;
+ 
+   Vimage_type_cache = Qnil;
+   staticpro (&Vimage_type_cache);
+ 
    QCascent = intern (":ascent");
    staticpro (&QCascent);
    QCmargin = intern (":margin");
***************
*** 7917,7922 ****
--- 8028,8034 ----
    Qpostscript = intern ("postscript");
    staticpro (&Qpostscript);
  #ifdef HAVE_GHOSTSCRIPT
+   ADD_IMAGE_TYPE(Qpostscript);
    QCloader = intern (":loader");
    staticpro (&QCloader);
    QCbounding_box = intern (":bounding-box");
***************
*** 7929,7963 ****
--- 8041,8083 ----
  
    Qpbm = intern ("pbm");
    staticpro (&Qpbm);
+   ADD_IMAGE_TYPE(Qpbm);
  
    Qxbm = intern ("xbm");
    staticpro (&Qxbm);
+   ADD_IMAGE_TYPE(Qxbm);
  
  #if defined (HAVE_XPM) || defined (MAC_OS)
    Qxpm = intern ("xpm");
    staticpro (&Qxpm);
+   ADD_IMAGE_TYPE(Qxpm);
  #endif
  
  #if defined (HAVE_JPEG) || defined (MAC_OS)
    Qjpeg = intern ("jpeg");
    staticpro (&Qjpeg);
+   ADD_IMAGE_TYPE(Qjpeg);
  #endif
  
  #if defined (HAVE_TIFF) || defined (MAC_OS)
    Qtiff = intern ("tiff");
    staticpro (&Qtiff);
+   ADD_IMAGE_TYPE(Qtiff);
  #endif
  
  #if defined (HAVE_GIF) || defined (MAC_OS)
    Qgif = intern ("gif");
    staticpro (&Qgif);
+   ADD_IMAGE_TYPE(Qgif);
  #endif
  
  #if defined (HAVE_PNG) || defined (MAC_OS)
    Qpng = intern ("png");
    staticpro (&Qpng);
+   ADD_IMAGE_TYPE(Qpng);
  #endif
  
+   defsubr (&Sinit_image_library);
    defsubr (&Sclear_image_cache);
    defsubr (&Simage_size);
    defsubr (&Simage_mask_p);
***************
*** 7985,8036 ****
    Vimage_cache_eviction_delay = make_number (30 * 60);
  }
  
- 
- #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
! 
! #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
  
  #ifdef MAC_OS
    /* Animated gifs use QuickTime Movie Toolbox.  So initialize it here. */
--- 8105,8117 ----
    Vimage_cache_eviction_delay = make_number (30 * 60);
  }
  
  void
  init_image ()
  {
    image_types = NULL;
  
!   define_image_type (&xbm_type, TRUE);
!   define_image_type (&pbm_type, TRUE);
  
  #ifdef MAC_OS
    /* Animated gifs use QuickTime Movie Toolbox.  So initialize it here. */




reply via email to

[Prev in Thread] Current Thread [Next in Thread]