透明度無しパレット形式画像処理の不具合修正
透明度無しのパレット画像(いわゆる色index方式)の入っている
SWF ファイルを読み込めない不具合があるので、その対応をしました。
問題
% php sample/swfdump.phps bitmap.swf magic=FWS version=4 file_length=209 rect=(0, 0)-(240, 350) (f_size=14) frame_rate=12.0 frame_count=1 [0] tag=SetBackgroundColor(9) length=3 [1] tag=DefineBitsLossless(20) length=30 swf_tag_lossless_create_detail: indices_len != origsize - 4 * swf_tag_lossless->colormap_count at line(62) can't create tag detail (tag=20) swf_tag_lossless_print_detail: detail == NULL [2] tag=DefineBitsLossless(20) length=29 image_id=2 format=5 width=8 height=8 xrgb bitmap exists [3] tag=DefineShape2(22) length=95 [4] tag=PlaceObject2(26) length=6 [5] tag=ShowFrame(1) [6] tag=End(0)
原因
color を 4 byte 決めうちで処理してましたが、以下のように場合によって変わります。
- format 3 (palette 形式)
- Lossless: 1color 3byte (rgb)
- Lossless2: 1color 4byte (rgba)
- format 5 (bitmap 形式)
- Lossless: 1pixel 4byte (xrgb) x は padding
- Lossless: 1pixel 4byte (argb)
というわけで修正。
修正
SWF Lossless 内の colormap のフィールド長を計算する際に、
以前は 4 決め打ちだったのを、 format=3 で且つ、
tag=20(Lossless)の場合は 3 で処理するように修正。
確認
% php sample/swfdump.phps bitmap.swf magic=FWS version=4 file_length=209 rect=(0, 0)-(240, 350) (f_size=14) frame_rate=12.0 frame_count=1 [0] tag=SetBackgroundColor(9) length=3 [1] tag=DefineBitsLossless(20) length=30 image_id=1 format=3 width=8 height=8 colormap_count=4 rgb colormap exists indices exists [2] tag=DefineBitsLossless(20) length=29 image_id=2 format=5 width=8 height=8 xrgb bitmap exists [3] tag=DefineShape2(22) length=95 [4] tag=PlaceObject2(26) length=6 [5] tag=ShowFrame(1) [6] tag=End(0)
% php sample/swfgetpngdata.phps bitmap.swf 1 > 1.png % php sample/swfgetpngdata.phps bitmap.swf 2 > 2.png % png_dump 1.png png_filename=1.png png_buff.data_len=119 (width, height)=(8,8) bpp=8 color_type=3(PALETTE) palette_num=4 y=0: 00 01 02 03 00 01 02 03 y=1: 00 01 02 03 00 01 02 03 y=2: 00 01 02 03 00 01 02 03 y=3: 00 01 02 03 00 01 02 03 y=4: 00 01 02 03 00 01 02 03 y=5: 00 01 02 03 00 01 02 03 y=6: 00 01 02 03 00 01 02 03 y=7: 00 01 02 03 00 01 02 03 % png_dump 2.png png_filename=2.png png_buff.data_len=103 (width, height)=(8,8) bpp=8 color_type=2(RGB) y=0: ff0000 00ff00 0000ff ffff00 ff0000 00ff00 0000ff ffff00 y=1: ff0000 00ff00 0000ff ffff00 ff0000 00ff00 0000ff ffff00 y=2: ff0000 00ff00 0000ff ffff00 ff0000 00ff00 0000ff ffff00 y=3: ff0000 00ff00 0000ff ffff00 ff0000 00ff00 0000ff ffff00 y=4: ff0000 00ff00 0000ff ffff00 ff0000 00ff00 0000ff ffff00 y=5: ff0000 00ff00 0000ff ffff00 ff0000 00ff00 0000ff ffff00 y=6: ff0000 00ff00 0000ff ffff00 ff0000 00ff00 0000ff ffff00 y=7: ff0000 00ff00 0000ff ffff00 ff0000 00ff00 0000ff ffff00
問題なし。
吸い出す時に処理をサボる為に bpp = 8 決め打ちにしてるけど、
時間見つけて bpp そのまま吸いだせるように修正しとこう。
あと、palette 形式を差し替える時、bitmap で入っちゃうので、
これは早めに対応しとこう… (焦