[mew-dist 19506] Re: animation gif on 2.1rc1
Hideyuki SHIRAI ( 白井秀行 )
shirai at example.com
2001年 10月 25日 (木) 13:55:11 JST
From: SUGITA Toshinori <sugita at example.com> さん曰く
Subject: [mew-dist 19504] Re: animation gif on 2.1rc1
Message-ID: <20011025.132454.424259023.sugita at example.com>
Date: Thu, 25 Oct 2001 13:24:54 +0900 (JST)
杉田> > このあいだ XEmacs を殺すとうわさになった
杉田> > http://www.mew.org/image/vxhtml10.gif
杉田> > で確かめました。
杉田>
杉田> はい。件のデータでも落ちなくなり、正常に添付されるように
杉田> なりました。
杉田>
杉田> もちろん、添付されているデータを開こうとすると、
杉田> 何も表示されませんが。。。
良かったです。interlaced GIF だと XEmacs 落ちちゃいますからね。
杉田> > image-decode-gif も hogehoge しないといけないですね。
杉田> >
杉田> > # ご参考 emacs-w3m/w3m-xmas.el => w3m-fix-gif()
杉田> > # hogehoge の作り方はわかるのですが、時間が無いのでパス
杉田>
杉田> こちらをやる必要があるのですね。
気持悪いのでやってみました。
殆んど、山岡さんのコードをコピーしただけなのですが、表示はできま
した。ただし、もとの buffer を書き換えちゃうので、なにかと副作用
はあるかもしれませんの注意してください。
以下の gif を手元にコピーして、find-file して
http://www.asahi.com/ad/clients/americanhome/aha0514tile.gif
http://www.asahi.com/ad/clients/goujin/goujin0507.gif
http://www.asahi.com/ad/clients/nicos/nicos0507.gif
が見えることと、
http://www.mew.org/image/vxhtml10.gif
で落ちないことを確かめました。
~/.emacs の最後にでもつけておいて下さい。
(setq format-alist
(cons
'(image/gif "GIF image" "GIF8[79]"
image-decode-gif-fix nil t image-mode)
(delq (assq 'image/gif format-alist) format-alist)))
(defun image-decode-gif-fix (start end)
(let ((image (buffer-substring-no-properties start end))
(prog "gifsicle")
fixedgif)
(with-temp-buffer
(let ((coding-system-for-read 'binary)
(coding-system-for-write 'binary)
should-be-non-interlaced should-unoptimize size1 size2)
(insert image)
(goto-char (point-min))
(when (looking-at "GIF8[79]")
(call-process-region (point-min) (point-max)
prog
t t nil "--info")
(goto-char (point-min))
;; Check whether a `data' is interlaced.
(setq should-be-non-interlaced
(re-search-forward
" \\+ image #[0-9]+ \\([0-9]+x[0-9]+\\).* interlaced"
nil t))
(goto-char (point-min))
;; Check whether a `data' is optimized or larger than
;; the value of `w3m-animated-gif-maximum-size'.
(when (looking-at ".+ \\([0-9]+\\) images\r?$")
(setq size1 (string-to-number (match-string 1)))
(forward-line 1)
(unless (and (looking-at ".+ \\([0-9]+\\)x\\([0-9]+\\)\r?$")
(natnump (setq size1 (* size1
(string-to-number
(match-string 1)))))
(natnump (setq size1 (* size1
(string-to-number
(match-string 2))))))
;; It should be truncated to be only one frame.
(setq should-unoptimize "#0"))
(setq size1 nil)
(while (and (not should-unoptimize)
(re-search-forward
" \\+ image #[0-9]+ \\([0-9]+x[0-9]+\\)"
nil t))
(if size1
(if (string-equal size1 (setq size2 (match-string 1)))
(setq size1 size2)
(setq should-unoptimize "--unoptimize"))
(setq size1 (match-string 1)))))
(when (or should-unoptimize should-be-non-interlaced)
(erase-buffer)
(insert image)
;; Unoptimize anyway.
(if should-unoptimize
(call-process-region (point-min) (point-max)
prog
t t nil should-unoptimize
"--no-interlace")
(call-process-region (point-min) (point-max)
prog
t t nil "--no-interlace"))
(goto-char (point-min))
(or (looking-at "GIF8[79]")
;; Unoptimization is failed. :-<
;; Attempt to extract the first frame.
(progn
(erase-buffer)
(insert data)
(call-process-region (point-min) (point-max)
w3m-gifsicle-program
t t nil "#0" "--no-interlace")
(goto-char (point-min))
(looking-at "GIF8[79]")))
(setq fixedgif (buffer-string))))))
(when fixedgif
(delete-region start end)
(insert fixedgif)
(setq end (point)))
(image-decode-gif start end)))
--
白井秀行 (mailto:shirai at example.com)
Mew-dist メーリングリストの案内