Top > Flash > SWF > format
TITLE:Flash SWF フォーマット
#contents

----
- ネタ元: http://www.m2osw.com/en/swf_alexref.html

* はじめに [#first]

- {header}+{header_movie}+{tag block}+{tag block}+.... といった形式
- {header}が固定長。{header_movie}が描画領域フィールドだけ可変長
- {tag block} は { tag | length | contents.... } # いわゆる TLC構造

- 複数バイトで表現する値が LittleEndian なのと、一部、ビット単位でフィールドが詰まっている事が分かれば、後は素直な形式なので楽に分解できる。

- block の中身(contents)も興味があるものだけ解析すればOKなので、中身を入れ替える場合は、入れ替えた {tag block}の length と {header}にある file_length の2箇所を更新すれば大抵のブロックは入れ替えられる。

* header [#swf_header]
// #header は自動生成されるので

 +--------------------------------+
 |  magic  | ver  |  file_length  |
 +--------------------------------+
 <-3 bytes-><1 byte><-- 4 bytes -->

** magic: offset = 0 [#magic]
- FWS or CWS の 3文字 + SWF version (1 byte)
- CWS の時は、file_length の後ろ(=header_movie 以降全て)のデータが zlib 圧縮される

 +-----------------------------------------------------------------+
 |  FWS\0   | ver  |  file_length  | header_movie | tag_block list |
 +-----------------------------------------------------------------+
 <-3 bytes-><1 byte><-- 4 bytes -->
                                     ↓zlib compress↓
 +--------------------------------------------------+
 |  CWS\0   | ver  |  file_length  |  (compressed)  |
 +--------------------------------------------------+
                                    ↑ compressed
                                       header_movie & tag_block list

** 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  | frame_rate_count |
  -------------------------------------+
      <-- 2 bytes --> <--  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: offset = 8 + 5(bits) + 4*size(bits) [#frame_rate]
- frame_rate 
- little endian の 8.8固定小数点なので、0x100 倍相当の値が byte swap して入っている

** 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 & length は Little Endian なので
 +--------------+------------+
 | tag | length |    tag     |
 | 1 0 | 543210 |  98765432  |
 +---------------------------+
--  bit 構成的には↑こんな感じ。(ややこしい)

** 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, 21, 35, 90) DefineBitsJPEG* [#jpeg]

- [[Flash/SWF/format/Jpeg]]

*** (8) JPEGTables [#jpegtables]

- [[Flash/SWF/format/Jpeg]]

*** (20, 36) DefineBitsLossless* [#lossless]

- [[Flash/SWF/format/Lossless]]

*** (37) DefineEditText [#edittext]

- [[Flash/SWF/format/EditText]]

*** (39) DefineSprite [#sprite]

- [[Flash/SWF/format/Sprite]]

*** (2, 22, 32, 46, 83, 84) DefineShape* [#shape]

- [[Flash/SWF/format/Shape]]


*** (12, 59) Do*Action [#action]

- [[Flash/SWF/format/Action]]

Reload   Diff   Front page List of pages Search Recent changes Backup Referer   Help   RSS of recent changes