Forums: Open Discussion (Thread #19738)

DefineBitsLosslessのcolormapのサイズ (2008-08-28 12:55 by fx-702p #38536)

バージョン0.08で、swf_tag_lossless.cのswf_tag_lossless_create_detailの中で、swf_tag_lossless->format=3の場合、tag->tagが20か36かでカラーインデックスの形式がXRGBかARGBかを区別していますが、XRGBの場合、カラーインデックスは1個あたり3バイトになるようで、該当する画像をもつSWFファイルは現在の状態だと読み込み時にエラーが出てしまいます。実際、uncompressのサイズを見てもカラーインデックスが3バイトだと考えると計算が合うようです。

インデックスカラーでない場合(format!=3)は、Lossless(tag=20)かLossless2(tag=30)かによって、画像サイズをsizeof(swf_xrgb_t)やsizeof(swf_argb_t)を元に計算している為、それぞれサイズの単位は3または4となり、計算が合っているようです。

同様の計算をformat=3の際にも行うようにしたところ、正しい結果になったように見えますが、どうでしょうか。

RE: DefineBitsLosslessのcolormapのサイズ (2008-08-28 13:01 by fx-702p #38537)

すみません、少々説明不足でした。具体的には、origsizeを計算している計算式と直下のエラーチェックの「4 * swf_tag_lossless->colormap_count」の部分です。
Reply to #38536

RE: DefineBitsLosslessのcolormapのサイズ (2008-08-28 22:02 by yoya #38544)

ご指摘ありがとうございます。
Lossless(1)のインデックスカラーの考慮が抜けていました。
おっしゃる通り、Lossless のインデックスカラーでは、
画像データとして 1pixel辺り3byteですので、合わせてコードを修正します。
Reply to #38537

RE: DefineBitsLosslessのcolormapのサイズ (2008-08-28 22:04 by yoya #38546)

あと、実はビットマップ形式の Lossless は、
透明度無しでも透明度有りと同じ形式で展開しつつ、
透明度の所に 0 を埋めるという、何とも
もったいない仕様になってまして。^^;

ですので、SWF 内のビットマップ形式の画像データを
吸い出す時は Lossless, Lossless2 共に 4byte 決め打ち
で処理しています。

ただ、内部データで 4byte を使うのは勿体ないので、
xrgb_t の配列で収納する際には、3 byte で処理をしています。
この辺りの事情はコードのコメントで説明をするべきだと
考えているので、追記していきます。
わかりにくくて済みません。m(__)m

swf_xrgb.h で pad をコメントアウトしているのは、
その辺りの気持ちが中途半端に表れてます。^^;
Reply to #38544

RE: DefineBitsLosslessのcolormapのサイズ (2008-08-28 22:11 by yoya #38548)

すみません。無茶苦茶書いてました。
整理すると以下のようになります。

- format3
- Lossless: 1color 3byte (rgb)
- Lossless2: 1color 4byte (rgba)
- format 5
- Lossless: 1pixel 4byte (xrgb) x は padding
- Lossless: 1pixel 4byte (argb)
Reply to #38546