[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[mgp-users-jp 00730] Re: transparent gif/png



  楯岡@電通大です。

From: Jun-ichiro itojun Hagino <itojun@itojun.org>
> > - 透過 gif の表示が非常に遅い
> >です。
> 
> 	だいぶ忘れてるので違うかもしれないけど、
> 	背景との関係から、1pixelづつ色を考えないといけないからです。

  ちょっと追ってみました。確かにすごい計算量の増加ですが、最近の CPU 
だとどうってことないようです。(^^;
  むしろ、今回の問題は libungif の中の DGifDecompressLine() の中で時間
を食っているようでした。今更 gif という意識もあって libungif の中まで
は追いかけませんでした。

  convert のかわりに ppmtogif + giftrans を使って透過 gif を作ったとこ
ろ、一瞬で表示されるようになりました。この差も追ってません、ごめんなさ
い。
  ただ、同じ透過 gif でも、background color が transparent color と一
緒でないとうまく透過できないようです。これは、gifLoad():image/gif.c の 
       if (trans)
                image->trans = GifFile->SBackGroundColor;
で透過色として Extension block の中の transparent color index が差す色
ではなく、background color を入れている為のようです。

  mgp 側を直す根性がなかったので、
% ppmtogif <hoge.ppm | giftrans -b white -t white >hoge.gif
として background color と transparent color を一致させて解決しました。

  透過 png の方はちょっと追い切れませんでした。一箇所だけバグの元にな
りそうな部分を見つけたので、それだけ送っておきます。

BEGIN--- cut here ---
*** image/png.c.DIST	Tue Jun 13 13:46:17 2000
--- image/png.c	Sun Jul 23 14:22:49 2000
***************
*** 152,158 ****
  	row_pointers = (png_bytep *)malloc(sizeof(png_bytep) * height);
  	for (row = 0; row < height; row++) {
  			row_pointers[row] = 
! 				(png_bytep)malloc(width * 3);
  	}
  	png_read_image(png_ptr, row_pointers);
  
--- 152,158 ----
  	row_pointers = (png_bytep *)malloc(sizeof(png_bytep) * height);
  	for (row = 0; row < height; row++) {
  			row_pointers[row] = 
! 				(png_bytep)malloc(png_get_rowbytes(png_ptr, info_ptr));
  	}
  	png_read_image(png_ptr, row_pointers);
  
END--- cut here ---

--
  電気通信大学 情報工学科
  楯岡孝道 (Tateoka Takamichi)  tate@cs.uec.ac.jp