Commit da0e5338 authored by Paul Eggert's avatar Paul Eggert

Merge from mainline.

parents 3fc40372 a32d4040
......@@ -3,6 +3,17 @@
Remove the doprnt implementation, as Emacs now uses vsnprintf.
* emacs-lisp/find-gc.el (find-gc-source-files): Remove doprnt.c.
2011-04-09 Chong Yidong <cyd@stupidchicken.com>
* image-mode.el (image-toggle-display-image): Signal an error if
not in Image mode.
(image-transform-mode, image-transform-resize)
(image-transform-set-rotation): Doc fix.
(image-transform-set-resize): Deleted.
(image-transform-set-scale, image-transform-fit-to-height)
(image-transform-fit-to-width): Handle image-toggle-display-image
and image-transform-resize directly.
2011-04-08 Sho Nakatani <lay.sakura@gmail.com>
* doc-view.el (doc-view-fit-width-to-window)
......
......@@ -469,6 +469,8 @@ Remove text properties that display the image."
"Show the image of the image file.
Turn the image data into a real image, but only if the whole file
was inserted."
(unless (derived-mode-p 'image-mode major-mode)
(error "The buffer is not in Image mode"))
(let* ((filename (buffer-file-name))
(data-p (not (and filename
(file-readable-p filename)
......@@ -485,8 +487,7 @@ was inserted."
(type (image-type file-or-data nil data-p))
(image0 (create-animated-image file-or-data type data-p))
(image (append image0
(image-transform-properties image0)
))
(image-transform-properties image0)))
(props
`(display ,image
intangible ,image
......@@ -557,80 +558,86 @@ the image file and `image-mode' showing the image as an image."
(defvar image-transform-minor-mode-map
(let ((map (make-sparse-keymap)))
; (define-key map [(control ?+)] 'image-scale-in)
; (define-key map [(control ?-)] 'image-scale-out)
; (define-key map [(control ?=)] 'image-scale-none)
;; (define-key map "c f h" 'image-scale-fit-height)
;; (define-key map "c ]" 'image-rotate-right)
;; (define-key map [(control ?+)] 'image-scale-in)
;; (define-key map [(control ?-)] 'image-scale-out)
;; (define-key map [(control ?=)] 'image-scale-none)
;; (define-key map "c f h" 'image-scale-fit-height)
;; (define-key map "c ]" 'image-rotate-right)
map)
"Minor mode keymap for transforming the view of images Image mode.")
"Minor mode keymap `image-transform-mode'.")
(define-minor-mode image-transform-mode
"minor mode for scaleing and rotation"
nil "image-transform"
image-transform-minor-mode-map)
"Minor mode for scaling and rotating images.
This minor mode has no effect unless Emacs is compiled with
ImageMagick support."
nil "image-transform" image-transform-minor-mode-map)
(defvar image-transform-resize nil
"The image resize operation. See the command
`image-transform-set-scale' for more information." )
"The image resize operation.
Its value should be one of the following:
- nil, meaning no resizing.
- `fit-height', meaning to fit the image to the window height.
- `fit-width', meaning to fit the image to the window width.
- A number, which is a scale factor (the default size is 100).")
(defvar image-transform-rotation 0.0)
(defun image-transform-properties (display)
"Calculate the display properties for transformations; scaling
and rotation. "
(let*
((size (image-size display t))
"Rescale and/or rotate the current image.
The scale factor and rotation angle are given by the variables
`image-transform-resize' and `image-transform-rotation'. This
takes effect only if Emacs is compiled with ImageMagick support."
(let* ((size (image-size display t))
(height
(cond
((and (numberp image-transform-resize) (eq 100 image-transform-resize))
nil)
((numberp image-transform-resize)
(* image-transform-resize (cdr size)))
(unless (= image-transform-resize 100)
(* image-transform-resize (cdr size))))
((eq image-transform-resize 'fit-height)
(- (nth 3 (window-inside-pixel-edges)) (nth 1 (window-inside-pixel-edges))))
(t nil)))
(- (nth 3 (window-inside-pixel-edges))
(nth 1 (window-inside-pixel-edges))))))
(width (if (eq image-transform-resize 'fit-width)
(- (nth 2 (window-inside-pixel-edges)) (nth 0 (window-inside-pixel-edges))))))
(- (nth 2 (window-inside-pixel-edges))
(nth 0 (window-inside-pixel-edges))))))
;;TODO fit-to-* should consider the rotation angle
`(,@(if height (list :height height))
,@(if width (list :width width))
,@(if (not (equal 0.0 image-transform-rotation))
(list :rotation image-transform-rotation))
;;TODO fit-to-* should consider the rotation angle
)))
(list :rotation image-transform-rotation)))))
(defun image-transform-set-scale (scale)
"SCALE sets the scaling for images. "
(interactive "nscale:")
(image-transform-set-resize (float scale)))
"Prompt for a number, and resize the current image by that amount.
This command has no effect unless Emacs is compiled with
ImageMagick support."
(interactive "nScale: ")
(setq image-transform-resize resize)
(image-toggle-display-image))
(defun image-transform-fit-to-height ()
"Fit image height to window height. "
"Fit the current image to the height of the current window.
This command has no effect unless Emacs is compiled with
ImageMagick support."
(interactive)
(image-transform-set-resize 'fit-height))
(setq image-transform-resize 'fit-height)
(image-toggle-display-image))
(defun image-transform-fit-to-width ()
"Fit image width to window width. "
"Fit the current image to the width of the current window.
This command has no effect unless Emacs is compiled with
ImageMagick support."
(interactive)
(image-transform-set-resize 'fit-width))
(defun image-transform-set-resize (resize)
"Set the resize mode for images. The RESIZE value can be the
symbol fit-height which fits the image to the window height. The
symbol fit-width fits the image to the window width. A number
indicates a scaling factor. nil indicates scale to 100%. "
(setq image-transform-resize resize)
(if (eq 'image-mode major-mode) (image-toggle-display-image)))
(setq image-transform-resize 'fit-width)
(image-toggle-display-image))
(defun image-transform-set-rotation (rotation)
"Set the image ROTATION angle. "
(interactive "nrotation:")
"Prompt for an angle ROTATION, and rotate the image by that amount.
ROTATION should be in degrees. This command has no effect unless
Emacs is compiled with ImageMagick support."
(interactive "nRotation angle (in degrees): ")
;;TODO 0 90 180 270 degrees are the only reasonable angles here
;;otherwise combining with rescaling will get very awkward
(setq image-transform-rotation (float rotation))
(if (eq major-mode 'image-mode) (image-toggle-display-image)))
(image-toggle-display-image))
(provide 'image-mode)
......
......@@ -78,6 +78,10 @@
* xdisp.c, lisp.h (message_nolog): Remove; unused.
2011-04-09 Chong Yidong <cyd@stupidchicken.com>
* image.c (Fimagemagick_types): Doc fix, and comment cleanup.
2011-04-09 Chong Yidong <cyd@stupidchicken.com>
* ftfont.c (get_adstyle_property, ftfont_pattern_entity): Use
......
......@@ -7370,14 +7370,13 @@ gif_load (struct frame *f, struct image *img)
/***********************************************************************
imagemagick
ImageMagick
***********************************************************************/
#if defined (HAVE_IMAGEMAGICK)
/* The symbol `imagemagick' identifying images of this type. */
Lisp_Object Qimagemagick;
/* Indices of image specification fields in imagemagick_format, below. */
/* Indices of image specification fields in imagemagick_format. */
enum imagemagick_keyword_index
{
......@@ -7418,6 +7417,7 @@ static struct image_keyword imagemagick_format[IMAGEMAGICK_LAST] =
{":rotation", IMAGE_NUMBER_VALUE, 0},
{":crop", IMAGE_DONT_CHECK_VALUE_TYPE, 0}
};
/* Free X resources of imagemagick image IMG which is used on frame F. */
static void
......@@ -7427,8 +7427,6 @@ imagemagick_clear_image (struct frame *f,
x_clear_image (f, img);
}
/* Return non-zero if OBJECT is a valid IMAGEMAGICK image specification. Do
this by calling parse_image_spec and supplying the keywords that
identify the IMAGEMAGICK format. */
......@@ -7457,7 +7455,7 @@ imagemagick_image_p (Lisp_Object object)
Uses librimagemagick to do most of the image processing.
non-zero when successful.
Return non-zero if successful.
*/
static int
......@@ -7504,12 +7502,12 @@ imagemagick_load_image (/* Pointer to emacs frame structure. */
Image * im_image;
/* Handle image index for image types who can contain more than one
image. Interface :index is same as for GIF. First we "ping" the
image to see how many sub-images it contains. Pinging is faster
than loading the image to find out things about it. */
/* Handle image index for image types who can contain more than one image.
Interface :index is same as for GIF. First we "ping" the image to see how
many sub-images it contains. Pinging is faster than loading the image to
find out things about it. */
/* `MagickWandGenesis' initializes the imagemagick environment. */
/* Initialize the imagemagick environment. */
MagickWandGenesis ();
image = image_spec_value (img->spec, QCindex, NULL);
ino = INTEGERP (image) ? XFASTINT (image) : 0;
......@@ -7541,7 +7539,7 @@ imagemagick_load_image (/* Pointer to emacs frame structure. */
DestroyMagickWand (ping_wand);
/* Now, after pinging, we know how many images are inside the
file. If its not a bundle, just one. */
file. If it's not a bundle, the number is one. */
if (filename != NULL)
{
......@@ -7572,7 +7570,7 @@ imagemagick_load_image (/* Pointer to emacs frame structure. */
if (status == MagickFalse) goto imagemagick_error;
/* If width and/or height is set in the display spec assume we want
to scale to those values. if either h or w is unspecified, the
to scale to those values. If either h or w is unspecified, the
unspecified should be calculated from the specified to preserve
aspect ratio. */
......@@ -7584,17 +7582,13 @@ imagemagick_load_image (/* Pointer to emacs frame structure. */
height = MagickGetImageHeight (image_wand);
width = MagickGetImageWidth (image_wand);
if(desired_width != -1 && desired_height == -1)
{
if (desired_width != -1 && desired_height == -1)
/* w known, calculate h. */
desired_height = (double) desired_width / width * height;
}
if(desired_width == -1 && desired_height != -1)
{
if (desired_width == -1 && desired_height != -1)
/* h known, calculate w. */
desired_width = (double) desired_height / height * width;
}
if(desired_width != -1 && desired_height != -1)
if (desired_width != -1 && desired_height != -1)
{
status = MagickScaleImage (image_wand, desired_width, desired_height);
if (status == MagickFalse)
......@@ -7604,19 +7598,17 @@ imagemagick_load_image (/* Pointer to emacs frame structure. */
}
}
/* crop behaves similar to image slicing in Emacs but is more memory
efficient. */
crop = image_spec_value (img->spec, QCcrop, NULL);
if (CONSP (crop) && INTEGERP (XCAR (crop)))
{
/* After some testing, it seems MagickCropImage is the fastest
crop function in ImageMagick. This crop function seems to do
less copying than the alternatives, but it still reads the
entire image into memory before croping, which is aparently
difficult to avoid when using imagemagick. */
/* After some testing, it seems MagickCropImage is the fastest crop
function in ImageMagick. This crop function seems to do less copying
than the alternatives, but it still reads the entire image into memory
before croping, which is aparently difficult to avoid when using
imagemagick. */
int w, h, x, y;
w = XFASTINT (XCAR (crop));
crop = XCDR (crop);
......@@ -7877,12 +7869,10 @@ static struct image_type imagemagick_type =
};
DEFUN ("imagemagick-types", Fimagemagick_types, Simagemagick_types, 0, 0, 0,
doc: /* Return image file types supported by ImageMagick.
Since ImageMagick recognizes a lot of file-types that clash with Emacs,
such as .c, we want to be able to alter the list at the lisp level. */)
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. */)
(void)
{
Lisp_Object typelist = Qnil;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment