TITLE:Flash SWF フォーマット #contents ---- - ネタ元: http://www.m2osw.com/en/swf_alexref.html - 複数 byte field は Little Endian - 可変長フィールドの bit 処理があって面倒 - タグは TLC(type,length,contents) 構造 * header [#header] +---------+----------------------+ | magic | \0 | file_length | +-------- +------+---------------+ <-3 bytes-><1 byte><-- 4 bytes --> ** magic: offset = 0 [#magic] - FWS or CWS の 3文字 + \0 (zero terminated string) - CWS の時は、file_length の後ろ(=header_movie 以降全て)のデータが zlib 圧縮される ** file_length: offset = 4 [#file_length] - Little Endian 4 byte - SWF ファイル全体の byte 数 * header_movie [#header_movie] char align (byte境界に合わせる) | +-------+----------+----------+----------+----------+--- | size | x_min | x_max | y_min | y_max | .. +-------+----------+----------+----------+----------+--- <5 bits><size bits><size bits><size bits><size bits> ---+---------------------------------+------------------+ .. | frame_rate_dec | frame_rate_int | frame_rate_count | ---+---------------------------------+------------------+ <-- 1 byte --> <-- 1 byte --> <-- 2 bytes --> ** size: offset = 8 [#size] - 先頭 5 bits は、この後に続く {x,y}_{min_max} のフィールドサイズ(つまり可変長) ** {x,y}_{min,max}: offset = 8 + 5(bits) + n*size(bits) (n は 0 数え) [#zabe493c] - 表示フレームの左上と右下の座標値 (単位は [[TWIPS]]) - 負の値もとりうる事に注意。 ** frame_rate_decimal: offset = 8 + 5(bits) + 4*size(bits) [#frame_rate_decimal] - frame_rate の小数部 ** frame_rate_integral: offset = 8 + 5(bits) + 4*size(bits) + 1 [#frame_rate_integral] - frame_rate の整数部 ** frame_rate_count: offset = 8 + 5(bits) + 4*size(bits) + 2 [#frame_rate_count] - frame_rate_count: frame 数 * tag block [#tag_block] - header + header_movie の後ろに TLC(Type|Length|Contents)形式で並ぶ +----------------------------------------------------+ | header | header_movie | tag_block | tag_block| ... | +----------------------------------------------------+ <-8bytes-> <- 可変長 -> <- 可変長 -- 数も可変 -- - tag block は contents の長さ(length)によって二種類のフォーマットに分かれる ** tag block の構造 (1) length < 0x3f [#tag_format1] +-------------------------------------+ | tag | length | contents | +-------------------------------------+ <-10bits-><-6bits-><-- length bytes --> <- Little Endian -> ** tag block の構造 (1) 0x3f <= length or something[#tag_format2] +------------------------------------------------------+ | tag | 0x3f | length | contents | +------------------------------------------------------+ <-10bits-><-6bits-><-- 4 bytes --> <-- length bytes --> <- Little Endian -> - DefineBitJpeg* のように length の値に関係なく(0x3f 以下でも)このフォーマットを使う tag があるので注意。 ** tag contents の構造 [#tag_contents] *** (0) End [#tag0] - SWF ファイルの末尾に来る tag は必ずこれ +--------------+ | tag | length | | 0 | 0 | +--------------+ <- 2 bytes -> *** (6) DefineBitsJPEG [#tag6] - JPEG データが image_data にそのまま入る +-------------------------------------------------------------+ | tag | length | length | image_id | image_data | | 6 | 0x3f | | | | +-------------------------------------------------------------+ <-- 2 bytes --> <- 4 bytes -> <-2 bytes-> <-contents 残り全部-> <------------------ length ----> *** (21) DefineBitsJPEG2 [#tag21] - JPEG データの圧縮テーブルに関するセグメントが encoding_tables (又は、別の tag である JPEGTables の方)に、それ以外のセグメントが image_data に入る。 -- そのまま取り出しても JPEG ファイルにはならず、セグメントを並び替える必要がある。 -- 各々、SOI(Start of Image)、EOI(End of Image) マーカーでくくるので、SOI,EOI が2つある妙な JPEG に見える。 --- 参考1 -> http://diary.awm.jp/~yoya/?20080203#200802031 --- 参考2 -> http://diary.awm.jp/~yoya/?20080203#200802033 --- 参考3 -> http://mp.i-revo.jp/user.php/wrckyapk/entry/7225.html -- JPEG データのセグメント構造については ([[Flash/JPEG]])参考のこと。 +-----------------------------------------+------------------------------+ | tag | length | length | image_id | encoding_tables | image_data | | 21 | 0x3f | | | | +------------------------------------------------------------------------+ <-- 2 bytes --> <- 4 bytes -> <-2 bytes-> <--- contents 残り全部 ---> <---------------- length ----------------> *** (35) DefineBitsJPEG3 [#tag35] - [[DefineBitsJPEG2>#tag21]] のデータに alpha channel (透明度)データが加わったもの -- これに画像のマスク値を乗せればスプライト的な表示が可能。 -- alpha channel は zlib 圧縮して格納。伸張すると画像左上の pixel から対応する順に透明度の値(1byte)が並んでいる。 -- 参考 -> http://diary.awm.jp/~yoya/?20080213#200802132 +--------------------------------------------------------------- | tag | length | length | image_id | offset_to_alpha | .. | 35 | 0x3f | | | | +--------------------------------------------------------------- <-- 2 bytes --> <- 4 bytes -> <-2 bytes-> <-- 4 bytes --> <--- length (最後まで) --- ---+------------------------------+-------------------+ .. | encoding_tables | image_data | alpha(zlib圧縮) | ---+------------------------------+-------------------+ <-- offse_to_alpha --> <-contents 残り全部-> *** (90) DefineBitsJPEG4 [#tag90] - [[DefineBitsJPEG3>#tag35]] のデータに deblock_param (デブロッキングフィルタの値)データが加わったもの -- deblock_param は 2 byte +--------------------------------------------------------------- | tag | length | length | image_id | offset_to_alpha | .. | 90 | 0x3f | | | | +--------------------------------------------------------------- <-- 2 bytes --> <- 4 bytes -> <-2 bytes-> <-- 4 bytes --> <--- length (最後まで) --- ---+-------------+-----------------+------------+-------------------+ .. |deblock_param| encoding_tables | image_data | alpha(zlib圧縮) | ---+-------------+-----------------+------------+-------------------+ <- 2 bytes -> <----- offset_to_alpha ------> <-contents 残り全部-> *** 作成予定 [#aa0c7273] - JPEGTables -- http://www.m2osw.com/en/swf_alexref.html#tag_jpegtables - DefineEditText -- http://www.m2osw.com/en/swf_alexref.html#tag_defineedittext |