some more docs and polish

This commit is contained in:
Joakim Verona 2010-07-10 22:35:42 +02:00
parent 788489aa74
commit fe72c5b465
2 changed files with 72 additions and 53 deletions

View file

@ -1,3 +1,5 @@
* README for the ImageMagick Emacs branch
This is the imagemagick branch of Emacs. Imagemagick can now be used
to load many new image formats, and also do useful transforms like
scaling and rotation.
@ -13,14 +15,15 @@ autoconf
./configure --with-imagemagick
* TODO
- image-type-header-regexps priorities the jpeg loader over the
* TODO image-type-header-regexps priorities the jpeg loader over the
imagemagick one. This is not wrong, but how should a user go about
prefering the imagemagick loader? The user might like zooming etc in
jpegs.
jpegs.
#B _ For some reason its unbearably slow to look at a page in a large
try (setq image-type-header-regexps nil) for a quick hack to prefer
imagemagick over the jpg loader.
* TODO For some reason its unbearably slow to look at a page in a large
image bundle using the :index feature. The imagemagick "display"
command is also a bit slow, but nowhere near as slow as the emacs
code. It seems imagemagick tries to unpack every page when loading
@ -31,60 +34,72 @@ jpegs.
It is now way faster to use the :index feature, but its still not
very fast.
#B X optimize number of pages calculation for bundles as suggested by
** DONE optimize number of pages calculation for bundles as suggested by
imagemagick forum: "set the density to something low like 2 and use
MagickPingImage()"
#B _ zooming the image like what is done for fonts in face-remap.el would
be a useful and demo friendly addition. Some work has been done on
image-mode.el to acihieve this.
** TODO try to cache the num pages calculation. it can take a while to
calculate the number of pages, and if you need to do it for each
page view, page-flipping becomes uselessly slow.
#B _ look for optimizations for handling images with low depth
* TODO
* TODO integrate with image-dired
#B _ complete documentation drafts below
* TODO integrate with docview.
* TODO integrate with image-mode
Some work has been done, M-x image-transform-fit-to-height will fit
the image to the height of the Emacs window for instance.
#B X fix inconsistencys with spelling of imagemagick in the src
#B X report number of images in image bundle types somehow
* TODO look for optimizations for handling images with low depth
Currently the code seems to default to 24 bit RGB which is costly for
images with lower bit depth.
* TODO complete documentation drafts below
* DONE fix inconsistencys with spelling of imagemagick in the src
* DONE report number of images in image bundle types somehow
Works like for "gif" support. Thanks to Juri Linkov.
#B X probably add pdf to inhibited types
#B X inhibit types is defconst should probably be defcustom
#B _ decide what to do with some uncommitted imagemagick support
* DONE probably add pdf to inhibited types
* DONE inhibit types is defconst should probably be defcustom
* TODO decide what to do with some uncommitted imagemagick support
functions for image size etc.
#B _ Test with more systems
* TODO Test with more systems
Tested on Fedora 12 so far, and the libmagick that ships with it.
Ubuntu 8.04 was also tested, but it seems it ships a broken ImageMagick.
#B X Also need some way to handle render methods that only work on newer ImageMagicks
Ubuntu 8.04 was also tested, but it seems it ships a broken
ImageMagick.
I also tried using an imagemagick compiled from their SVN, in
parallell with the one packaged by Fedora, it worked well.
* DONE Also need some way to handle render methods that only work on newer ImageMagicks
Is handled by configure now
* Some nits from Stefan Monnier
I just took a quick look at the code and I see the following nits to fix:
#B _ obviously a merge will have to come with a good ChangeLog.
#B X also the merge will need to come with documentation. Maybe not in the
** TODO obviously a merge will have to come with a good ChangeLog.
** DONE also the merge will need to come with documentation. Maybe not in the
Texinfo form yet, but at least in the etc/NEWS with enough info that
describes the `scale' and other such arguments that someone can start
using them.
#B X the README talks about naming inconsistencies, I think these should be
** DONE the README talks about naming inconsistencies, I think these should be
fixed before a first commit (should be straightforward).
#B X the "let" in image.el should not be followed by a line break and the while
** DONE the "let" in image.el should not be followed by a line break and the while
should be replaced by a dolist.
#B X the prototype of imagemagick_load_image has some odd indentation in ([[2010.06.14]])
** DONE the prototype of imagemagick_load_image has some odd indentation in ([[2010.06.14]])
its args, not sure what happened.
#B X a few lines in the C code break the 80columns limit.
#B X please use ANSI style function declarations rather than K&R for new code. ([[2010.06.14]])
#B X you can get rid of the prototypes by reordering the code. ([[2010.06.14]])
#B X the docstrings in DEFUN should not be indented (they'll display ([[2010.06.14]])
** DONE a few lines in the C code break the 80columns limit.
** DONE please use ANSI style function declarations rather than K&R for new code. ([[2010.06.14]])
** DONE you can get rid of the prototypes by reordering the code. ([[2010.06.14]])
** DONE the docstrings in DEFUN should not be indented (they'll display ([[2010.06.14]])
weirdly otherwise in C-h f).
#B X Some "{" are at the end of a for/if rather than on their own line. ([[2010.06.14]])
#B X why use "*( imtypes + i)" rather than "imtypes[i]"? ([[2010.06.14]])
#B X some "," lack a space after them. ([[2010.06.14]])
#B X several "=" and "==" lack spaces around them. ([[2010.06.14]])
** DONE Some "{" are at the end of a for/if rather than on their own line. ([[2010.06.14]])
** DONE why use "*( imtypes + i)" rather than "imtypes[i]"? ([[2010.06.14]])
** DONE some "," lack a space after them. ([[2010.06.14]])
** DONE several "=" and "==" lack spaces around them. ([[2010.06.14]])
* NEWS entry
** ImageMagick support
@ -147,4 +162,4 @@ of images in an image bundle. This is simmilar to how GIF files work.
* config.in, Makefile.in, configure.in
* Manual entry
nothing yet, but the NEWS entry could be adapted.
nothing yet, but the NEWS entry could be adapted.

View file

@ -543,8 +543,8 @@ the image file and `image-mode' showing the image as an image."
; (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 "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.")
@ -553,23 +553,16 @@ the image file and `image-mode' showing the image as an image."
nil "image-transform"
image-transform-minor-mode-map)
;;these are supposed to be buffer local
;(defvar image-transform-height 100);;nil should mean 100%
;;the interface could rather be:
(defvar image-transform-resize
nil
"values: fit-height number=scale nil=scale100% TODO fit-width fit-page"
)
(defvar image-transform-resize nil
"The image resize operation. See the command
`image-transform-set-scale' for more information." )
;;TODO 0 90 180 270 degrees are the only reasonable angles here
;;otherwise combining with rescaling will get very awkward
(defvar image-transform-rotation 0.0)
;;then it would be nice with a bunch of globals like:
;; image-transform-always-resize values: 'fit-height nil=100% number=scale TODO 'fit-width 'fit-page
;; image-transform-always-rotate value: angle
(defun image-transform-properties (display)
"Calculate the display properties for transformations; scaling
and rotation. "
(let*
((size (image-size display t))
(height
@ -588,28 +581,39 @@ the image file and `image-mode' showing the image as an image."
,@(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
)))
(defun image-transform-set-scale (scale)
"SCALE sets the scaling for images. "
(interactive "nscale:")
(image-transform-set-resize (float scale)))
(defun image-transform-fit-to-height ()
"Fit image height to window height. "
(interactive)
(image-transform-set-resize 'fit-height))
(defun image-transform-fit-to-width ()
"Fit image width to window width. "
(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)))
(defun image-transform-set-rotation (rotation)
"Set the image ROTATION angle. "
(interactive "nrotation:")
;;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))
(image-toggle-display-image))
(if (eq major-mode 'image-mode) (image-toggle-display-image)))
(provide 'image-mode)