summaryrefslogtreecommitdiff
path: root/jabber-avatar.el
diff options
context:
space:
mode:
Diffstat (limited to 'jabber-avatar.el')
-rw-r--r--jabber-avatar.el49
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