[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 メーリングリストの案内