\f
(defcustom imagemagick-types-inhibit
'(C HTML HTM TXT PDF)
- ;; FIXME what are the possible options?
- ;; Are these actually file-name extensions?
- ;; Why are these upper-case when eg image-types is lower-case?
- "Types the ImageMagick loader should not try to handle."
- :type '(choice (const :tag "Let ImageMagick handle all the types it can" nil)
+ "ImageMagick types that Emacs should not use ImageMagick to handle.
+This should be a list of symbols, each of which has the same
+names as one of the format tags used internally by ImageMagick;
+see `imagemagick-types'. Entries in this list are excluded from
+being registered by `imagemagick-register-types'.
+
+If Emacs is compiled without ImageMagick, this variable has no effect."
+ :type '(choice (const :tag "Let ImageMagick handle all types it can" nil)
(repeat symbol))
:version "24.1"
:group 'image)
;;;###autoload
(defun imagemagick-register-types ()
- "Register the file types that ImageMagick is able to handle."
- (if (fboundp 'imagemagick-types)
- (let ((im-types (imagemagick-types)))
- (dolist (im-inhibit imagemagick-types-inhibit)
- (setq im-types (remove im-inhibit im-types)))
- (dolist (im-type im-types)
- (let ((extension (downcase (symbol-name im-type))))
- (push
- (cons (concat "\\." extension "\\'") 'image-mode)
- auto-mode-alist)
- (push
- (cons (concat "\\." extension "\\'") 'imagemagick)
- image-type-file-name-regexps))))
- (error "Emacs was not built with ImageMagick support")))
+ "Register file types that can be handled by ImageMagick.
+This adds the file types returned by `imagemagick-types'
+\(excluding the ones in `imagemagick-types-inhibit') to
+`auto-mode-alist' and `image-type-file-name-regexps', so that
+Emacs visits them in Image mode.
+
+If Emacs is compiled without ImageMagick support, do nothing."
+ (when (fboundp 'imagemagick-types)
+ (let ((im-types (imagemagick-types)))
+ (dolist (im-inhibit imagemagick-types-inhibit)
+ (setq im-types (delq im-inhibit im-types)))
+ (dolist (im-type im-types)
+ (let ((extension
+ (concat "\\." (downcase (symbol-name im-type))
+ "\\'")))
+ (push (cons extension 'image-mode) auto-mode-alist)
+ (push (cons extension 'imagemagick)
+ image-type-file-name-regexps))))))
(provide 'image)
Lisp_Object Qimagemagick;
+static int imagemagick_image_p (Lisp_Object);
+static int imagemagick_load (struct frame *, struct image *);
+static void imagemagick_clear_image (struct frame *, struct image *);
+
/* Indices of image specification fields in imagemagick_format. */
enum imagemagick_keyword_index
{":crop", IMAGE_DONT_CHECK_VALUE_TYPE, 0}
};
+/* Structure describing the image type for any image handled via
+ ImageMagick. */
+
+static struct image_type imagemagick_type =
+ {
+ &Qimagemagick,
+ imagemagick_image_p,
+ imagemagick_load,
+ imagemagick_clear_image,
+ NULL
+ };
+
/* Free X resources of imagemagick image IMG which is used on frame F. */
static void
#define DrawRectangle DrawRectangleGif
#include <wand/MagickWand.h>
-/* imagemagick_load_image is a helper function for imagemagick_load,
- which does the actual loading given contents and size, apart from
- frame and image structures, passed from imagemagick_load.
+/* Helper function for imagemagick_load, which does the actual loading
+ given contents and size, apart from frame and image structures,
+ passed from imagemagick_load. Uses librimagemagick to do most of
+ the image processing.
- Uses librimagemagick to do most of the image processing.
+ F is a pointer to the Emacs frame; IMG to the image structure to
+ prepare; CONTENTS is the string containing the IMAGEMAGICK data to
+ be parsed; SIZE is the number of bytes of data; and FILENAME is
+ either the file name or the image data.
- Return non-zero if successful.
-*/
+ Return non-zero if successful. */
static int
-imagemagick_load_image (/* Pointer to emacs frame structure. */
- struct frame *f,
- /* Pointer to emacs image structure. */
- struct image *img,
- /* String containing the IMAGEMAGICK data to
- be parsed. */
- unsigned char *contents,
- /* Size of data in bytes. */
- unsigned int size,
- /* Filename, either pass filename or
- contents/size. */
- unsigned char *filename)
+imagemagick_load_image (struct frame *f, struct image *img,
+ unsigned char *contents, unsigned int size,
+ unsigned char *filename)
{
unsigned long width;
unsigned long height;
- MagickBooleanType
- status;
+ MagickBooleanType status;
XImagePtr ximg;
Lisp_Object specified_bg;
DestroyMagickWand (ping_wand);
- /* Now, after pinging, we know how many images are inside the
- file. If it's not a bundle, the number is one. */
+ /* Now we know how many images are inside the file. If it's not a
+ bundle, the number is one. */
if (filename != NULL)
{
}
}
- /* Finaly we are done manipulating the image, figure out resulting
- width, height, and then transfer ownerwship to Emacs. */
+ /* Finally we are done manipulating the image. Figure out the
+ resulting width/height and transfer ownerwship to Emacs. */
height = MagickGetImageHeight (image_wand);
width = MagickGetImageWidth (image_wand);
the prototype thus needs to be compatible with that structure. */
static int
-imagemagick_load (struct frame *f,
- struct image *img)
+imagemagick_load (struct frame *f, struct image *img)
{
int success_p = 0;
Lisp_Object file_name;
return success_p;
}
-/* Structure describing the image type `imagemagick'. Its the same
- type of structure defined for all image formats, handled by Emacs
- image functions. See struct image_type in dispextern.h. */
-
-static struct image_type imagemagick_type =
- {
- /* An identifier showing that this is an image structure for the
- IMAGEMAGICK format. */
- &Qimagemagick,
- /* Handle to a function that can be used to identify a IMAGEMAGICK
- file. */
- imagemagick_image_p,
- /* Handle to function used to load a IMAGEMAGICK file. */
- imagemagick_load,
- /* Handle to function to free resources for IMAGEMAGICK. */
- imagemagick_clear_image,
- /* An internal field to link to the next image type in a list of
- image types, will be filled in when registering the format. */
- NULL
- };
-
-
DEFUN ("imagemagick-types", Fimagemagick_types, Simagemagick_types, 0, 0, 0,
- doc: /* Return the image types supported by ImageMagick.
-Note that ImageMagick recognizes many file-types that Emacs does not recognize
-as images, such as .c. */)
+ doc: /* Return a list of image types supported by ImageMagick.
+Each entry in this list is a symbol named after an ImageMagick format
+tag. See the ImageMagick manual for a list of ImageMagick formats and
+their descriptions (http://www.imagemagick.org/script/formats.php).
+
+Note that ImageMagick recognizes many file-types that Emacs does not
+recognize as images, such as C. See `imagemagick-types-inhibit'. */)
(void)
{
Lisp_Object typelist = Qnil;
- unsigned long numf;
+ unsigned long numf = 0;
ExceptionInfo ex;
char **imtypes = GetMagickList ("*", &numf, &ex);
int i;