diff options
Diffstat (limited to 'jabber-avatar.el')
-rw-r--r-- | jabber-avatar.el | 49 |
1 files changed, 36 insertions, 13 deletions
diff --git a/jabber-avatar.el b/jabber-avatar.el index 3f0d73a..ac02523 100644 --- a/jabber-avatar.el +++ b/jabber-avatar.el @@ -41,7 +41,8 @@ "Avatar related settings" :group 'jabber) -(defcustom jabber-avatar-cache-directory "~/.jabber-avatars/" +(defcustom jabber-avatar-cache-directory + (locate-user-emacs-file "jabber-avatar-cache" ".jabber-avatars") "Directory to use for cached avatars" :group 'jabber-avatar :type 'directory) @@ -51,6 +52,16 @@ :group 'jabber-avatar :type 'boolean) +(defcustom jabber-avatar-max-width 96 + "Maximum width of avatars." + :group 'jabber-avatar + :type 'integer) + +(defcustom jabber-avatar-max-height 96 + "Maximum height of avatars." + :group 'jabber-avatar + :type 'integer) + ;;;; Avatar data handling (defstruct avatar sha1-sum mime-type url base64-data height width bytes) @@ -96,7 +107,7 @@ If MIME-TYPE is not specified, try to find it from the image data." (base64-data (or base64-string (base64-encode-string raw-data))) (type (or mime-type (cdr (assq (get :type (cdr (condition-case nil - (create-image data nil t) + (jabber-create-image data nil t) (error nil)))) '((png "image/png") (jpeg "image/jpeg") @@ -117,7 +128,7 @@ If MIME-TYPE is not specified, try to find it from the image data." "Create an image from AVATAR. Return nil if images of this type are not supported." (condition-case nil - (create-image (with-temp-buffer + (jabber-create-image (with-temp-buffer (set-buffer-multibyte nil) (insert (avatar-base64-data avatar)) (base64-decode-region (point-min) (point-max)) @@ -156,24 +167,21 @@ If there is no cached image, return nil." (let* ((id (avatar-sha1-sum avatar)) (base64-data (avatar-base64-data avatar)) (mime-type (avatar-mime-type avatar)) - (filename (expand-file-name id jabber-avatar-cache-directory)) - (buffer (create-file-buffer filename))) + (filename (expand-file-name id jabber-avatar-cache-directory))) (unless (file-directory-p jabber-avatar-cache-directory) - (make-directory jabber-avatar-cache-directory)) + (make-directory jabber-avatar-cache-directory t)) (if (file-exists-p filename) (when jabber-avatar-verbose (message "Caching avatar, but %s already exists" filename)) - (with-current-buffer buffer - (let ((require-final-newline nil)) - (setq buffer-file-coding-system 'binary) + (with-temp-buffer + (let ((require-final-newline nil) + (coding-system-for-write 'binary)) (if (fboundp 'set-buffer-multibyte) (set-buffer-multibyte nil)) - (set-visited-file-name filename t) (insert base64-data) (base64-decode-region (point-min) (point-max)) - (basic-save-buffer)))) - (kill-buffer buffer))) + (write-region (point-min) (point-max) filename nil 'silent)))))) ;;;; Set avatar for contact @@ -196,7 +204,7 @@ AVATAR may be one of: (setq hash avatar) (setq image (lambda () (condition-case nil - (create-image (jabber-avatar-find-cached avatar)) + (jabber-create-image (jabber-avatar-find-cached avatar)) (error nil))))) (t (setq hash nil) @@ -207,5 +215,20 @@ AVATAR may be one of: (put jid-symbol 'avatar-hash hash) (jabber-presence-update-roster jid-symbol)))) +(defun jabber-create-image (file-or-data &optional type data-p) + "Create image, scaled down to jabber-avatar-max-width/height, +if width/height exceeds either of those, and ImageMagick is +available." + (let* ((image (create-image file-or-data type data-p)) + (size (image-size image t)) + (spec (cdr image))) + (when (and (functionp 'imagemagick-types) + (or (> (car size) jabber-avatar-max-width) + (> (cdr size) jabber-avatar-max-height))) + (plist-put spec :type 'imagemagick) + (plist-put spec :width jabber-avatar-max-width) + (plist-put spec :height jabber-avatar-max-height)) + image)) + (provide 'jabber-avatar) ;; arch-tag: 2405c3f8-8eaa-11da-826c-000a95c2fcd0 |