透明度無しパレット形式画像処理の不具合修正

透明度無しのパレット画像(いわゆる色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 で入っちゃうので、
これは早めに対応しとこう… (焦