+(defconst image-type-file-name-regexps
+ '(("\\.png\\'" . png)
+ ("\\.gif\\'" . gif)
+ ("\\.jpe?g\\'" . jpeg)
+ ("\\.bmp\\'" . bmp)
+ ("\\.xpm\\'" . xpm)
+ ("\\.pbm\\'" . pbm)
+ ("\\.xbm\\'" . xbm)
+ ("\\.ps\\'" . postscript)
+ ("\\.tiff?\\'" . tiff))
+ "Alist of (REGEXP . IMAGE-TYPE) pairs used to identify image files.
+When the name of an image file match REGEXP, it is assumed to
+be of image type IMAGE-TYPE.")
+
+
+(defvar image-load-path nil
+ "List of locations in which to search for image files.
+If an element is a string, it defines a directory to search.
+If an element is a variable symbol whose value is a string, that
+value defines a directory to search.
+If an element is a variable symbol whose value is a list, the
+value is used as a list of directories to search.")
+
+(eval-at-startup
+ (setq image-load-path
+ (list (file-name-as-directory (expand-file-name "images" data-directory))
+ 'data-directory 'load-path)))
+
+
+(defun image-load-path-for-library (library image &optional path no-error)
+ "Return a suitable search path for images used by LIBRARY.
+
+It searches for IMAGE in `image-load-path' (excluding
+\"`data-directory'/images\") and `load-path', followed by a path
+suitable for LIBRARY, which includes \"../../etc/images\" and
+\"../etc/images\" relative to the library file itself, and then
+in \"`data-directory'/images\".
+
+Then this function returns a list of directories which contains
+first the directory in which IMAGE was found, followed by the
+value of `load-path'. If PATH is given, it is used instead of
+`load-path'.
+
+If NO-ERROR is non-nil and a suitable path can't be found, don't
+signal an error. Instead, return a list of directories as before,
+except that nil appears in place of the image directory.
+
+Here is an example that uses a common idiom to provide
+compatibility with versions of Emacs that lack the variable
+`image-load-path':
+
+ ;; Shush compiler.
+ (defvar image-load-path)
+
+ (let* ((load-path (image-load-path-for-library \"mh-e\" \"mh-logo.xpm\"))
+ (image-load-path (cons (car load-path)
+ (when (boundp 'image-load-path)
+ image-load-path))))
+ (mh-tool-bar-folder-buttons-init))"
+ (unless library (error "No library specified"))
+ (unless image (error "No image specified"))
+ (let (image-directory image-directory-load-path)
+ ;; Check for images in image-load-path or load-path.
+ (let ((img image)
+ (dir (or
+ ;; Images in image-load-path.
+ (image-search-load-path image)
+ ;; Images in load-path.
+ (locate-library image)))
+ parent)
+ ;; Since the image might be in a nested directory (for
+ ;; example, mail/attach.pbm), adjust `image-directory'
+ ;; accordingly.
+ (when dir
+ (setq dir (file-name-directory dir))
+ (while (setq parent (file-name-directory img))
+ (setq img (directory-file-name parent)
+ dir (expand-file-name "../" dir))))
+ (setq image-directory-load-path dir))
+
+ ;; If `image-directory-load-path' isn't Emacs' image directory,
+ ;; it's probably a user preference, so use it. Then use a
+ ;; relative setting if possible; otherwise, use
+ ;; `image-directory-load-path'.
+ (cond
+ ;; User-modified image-load-path?
+ ((and image-directory-load-path
+ (not (equal image-directory-load-path
+ (file-name-as-directory
+ (expand-file-name "images" data-directory)))))
+ (setq image-directory image-directory-load-path))
+ ;; Try relative setting.
+ ((let (library-name d1ei d2ei)
+ ;; First, find library in the load-path.
+ (setq library-name (locate-library library))
+ (if (not library-name)
+ (error "Cannot find library %s in load-path" library))
+ ;; And then set image-directory relative to that.
+ (setq
+ ;; Go down 2 levels.
+ d2ei (file-name-as-directory
+ (expand-file-name
+ (concat (file-name-directory library-name) "../../etc/images")))
+ ;; Go down 1 level.
+ d1ei (file-name-as-directory
+ (expand-file-name
+ (concat (file-name-directory library-name) "../etc/images"))))
+ (setq image-directory
+ ;; Set it to nil if image is not found.
+ (cond ((file-exists-p (expand-file-name image d2ei)) d2ei)
+ ((file-exists-p (expand-file-name image d1ei)) d1ei)))))
+ ;; Use Emacs' image directory.
+ (image-directory-load-path
+ (setq image-directory image-directory-load-path))
+ (no-error
+ (message "Could not find image %s for library %s" image library))
+ (t
+ (error "Could not find image %s for library %s" image library)))
+
+ ;; Return an augmented `path' or `load-path'.
+ (nconc (list image-directory)
+ (delete image-directory (copy-sequence (or path load-path))))))
+