emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] /srv/bzr/emacs/trunk r103877: Cleanups to the ImageMagick


From: Chong Yidong
Subject: [Emacs-diffs] /srv/bzr/emacs/trunk r103877: Cleanups to the ImageMagick code and docstrings.
Date: Sat, 09 Apr 2011 16:28:01 -0400
User-agent: Bazaar (2.3.1)

------------------------------------------------------------
revno: 103877
committer: Chong Yidong <address@hidden>
branch nick: trunk
timestamp: Sat 2011-04-09 16:28:01 -0400
message:
  Cleanups to the ImageMagick code and docstrings.
  
  * lisp/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.
  
  * src/image.c (Fimagemagick_types): Doc fix, and comment cleanup.
modified:
  lisp/ChangeLog
  lisp/image-mode.el
  src/ChangeLog
  src/image.c
=== modified file 'lisp/ChangeLog'
--- a/lisp/ChangeLog    2011-04-09 17:40:29 +0000
+++ b/lisp/ChangeLog    2011-04-09 20:28:01 +0000
@@ -1,3 +1,14 @@
+2011-04-09  Chong Yidong  <address@hidden>
+
+       * 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 <address@hidden>
 
        * doc-view.el (doc-view-fit-width-to-window)

=== modified file 'lisp/image-mode.el'
--- a/lisp/image-mode.el        2011-02-19 19:40:59 +0000
+++ b/lisp/image-mode.el        2011-04-09 20:28:01 +0000
@@ -469,6 +469,8 @@
   "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 @@
         (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 @@
 
 (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." )
+(defvar image-transform-resize nil
+  "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))
-       (height
-        (cond
-         ((and (numberp image-transform-resize) (eq 100 
image-transform-resize))
-          nil)
-         ((numberp image-transform-resize)
-          (* 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)))
-       (width (if (eq image-transform-resize 'fit-width)
-                  (- (nth 2 (window-inside-pixel-edges)) (nth 0 
(window-inside-pixel-edges))))))
-
+  "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
+          ((numberp image-transform-resize)
+           (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))))))
+        (width (if (eq image-transform-resize 'fit-width)
+                   (- (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)
 

=== modified file 'src/ChangeLog'
--- a/src/ChangeLog     2011-04-09 17:40:29 +0000
+++ b/src/ChangeLog     2011-04-09 20:28:01 +0000
@@ -1,5 +1,9 @@
 2011-04-09  Chong Yidong  <address@hidden>
 
+       * image.c (Fimagemagick_types): Doc fix, and comment cleanup.
+
+2011-04-09  Chong Yidong  <address@hidden>
+
        * ftfont.c (get_adstyle_property, ftfont_pattern_entity): Use
        unsigned char, to match FcChar8 type definition.
 

=== modified file 'src/image.c'
--- a/src/image.c       2011-04-05 20:06:52 +0000
+++ b/src/image.c       2011-04-09 20:28:01 +0000
@@ -7370,14 +7370,13 @@
 
 
 /***********************************************************************
-                                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 @@
     {":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 @@
   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 @@
 
    Uses librimagemagick to do most of the image processing.
 
-   non-zero when successful.
+   Return non-zero if successful.
 */
 
 static int
@@ -7504,12 +7502,12 @@
   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 @@
   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 @@
   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 @@
   height = MagickGetImageHeight (image_wand);
   width = MagickGetImageWidth (image_wand);
 
-  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)
-    {
-      /* 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)
+    /* w known, calculate h.  */
+    desired_height = (double) desired_width / width * height;
+  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)
     {
       status = MagickScaleImage (image_wand, desired_width, desired_height);
       if (status == MagickFalse)
@@ -7604,19 +7598,17 @@
        }
     }
 
-
   /* 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 @@
   };
 
 
-
-
 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;


reply via email to

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