SWFファイルフォーマットメモ
Definition and control tags
- Definition tags
- Shape, Text, Bitmap, SoundといったSWFファイルの内容を定義する。いずれのdefinition tagもcharacter IDと呼ばれるユニークなIDを持つ。FlashPlayer?はそのIDをdictionaryと呼ばれるリポジトリに保持する。
- Control tags
- dictionary内のcharacterのinstanceの作成や操作、フロー制御を行う。
Tag odering in SWF files
- FileAttributes?タグは必ず最初のタグ(SWF8以降)
- あるタグはその前に出現したタグにのみ依存して良い。
- definition tag はそれを参照する control tag よりも前に定義する。
- Streaming sound tag は順番通りに現れる必要がある。(変な順番にするとその通り再生される)
- End tag は必ず最後。
The dictionary
The process of buiding and using the dictionary is as follows:
- Definition tag が Shape, Font, Bitmap, Sound といったコンテンツを定義する
- Definition tag がそのコンテンツに対して CharacterId? を割り当てる
- そのコンテンツは CharacterId? の元、 dictionary に保存される
- Control tag は CharacterID を用いて dictionary からコンテンツを取得し、表示や再生といった動作を行う
CharacterId? はユニークであり、重複は許されない。最初の CharacterId? は 1 で始まり、次は 2 である。0 は特殊であり、 null character とみなされる。
Definition tag はより複雑な character を定義するために、 dictionary 内の character を利用することが出来る。例:DefineButton?, DefineSprite?, DefineText?
Processing a SWF file
FlashPlayer? は ShowFrame? tag に出くわすまで全ての tag を処理する。
The Display List
フレームの表示は次のプロセスで行われる:
- DefineShape?, DefineSprite? といった Definition tag によってオブジェクトが定義される。いずれのオブジェクトも character というユニークなIDを与えられ、 dictionary と呼ばれるリポジトリに保持される。
- 選択された character は dictionary からコピーされ、次のフレームで表示される character のリストである display list に配置される。
- ShowFrame? によって display list の内容はスクリーンにレンダリングされる。
display list 上のいずれの character も、 depth 値が割り当てられる。depth は character のスタック順を表す。小さい depth 値の character はそれよりも大きい depth 値の character よりも下に表示される。depth 値が 1 の character は最も下に表示される。character は display list 中に何度も出現することが出来るが、depth 値は異ならなくてはならない。
SWF1 および 2 では、display list は常に表示されるオブジェクトのフラットなリストであった。SWF3 よりも後のバージョンでは、display list は階層的なリストである。(see DefineSprite?)
Display list を制御するために次の 6 つの tag が使用される:
- PlaceObject?
- display list への character の追加
- PlaceObject?2 & PlaceObject?3
- display list への character の追加、もしくは指定された depth の character の変更
- RemoveObject?
- display list から指定された character の削除
- RemoveObject?2
- 指定された depth の character の削除
- ShowFrame?
- display list の内容をディスプレイに描画
Note: PlaceObject? および RemoveObject? は SWF3 以降のバージョンではめったに使用されない
Clipping layers
Flash Player は clipping layer と呼ばれる display list 内の特殊なオブジェクトをサポートする。clipping layer として配置された character は表示されず、その上に配置された character をクリップ(もしくはマスク)する。PlaceObject?2 の ClipDepth? フィールドは clipping layer がマスクする depth の最大値を定義する。
Using the display list
次の手順はアニメーションの作成と表示を行う:
- Definition tag を用いてそれぞれの character を定義する。それぞれの character はユニークな character ID を与えられ、 dictionary に追加される。
- PlaceObject?2 tag を用いて display list にそれぞれの character を追加する。それぞれの PlaceObject?2 tag は次のパラーメタと共に character の表示を指定する。
- Depth value - character の重ね順をコントロールする。
- Transformation matrix - character の位置、スケール、係数、回転角を決める。
- Color transform (オプション) - character のカラーエフェクトを定義する。透明度や着色など。
- Name string (オプション) - SetTarget? action のために character に名前をつける。
- ClipDepth? value (オプション) - clipping layer がマスクする character の depth の最大値を定義する。
- Ratio value (オプション) - morph character が配置されたときにどのように表示されるかを定義する。Ratio が 0 のときは morph のスタート時を表示し、Ratio が 65535 のときは morph の終了時を表示する。
- Display list の内容をスクリーンに表示するために ShowFrame? tag を使用する。
- Display list 上の character を変更するために PlaceObject?2 tag を使用する。それぞれの PlaceObject?2 は与えられた depth 上の character に新たな transformation matrix を割り当てる。それぞれの depth はひとつの character だけしか持てないため、Character ID は定義されない。
- 新たな位置になった character を表示するため、ShowFrame? tag を使用する。アニメーションの各フレームに対して 4. と 5. を繰り返す。(Note: フレームとフレームの間で character に変更が加えられないとき、そのフレーム間で character を置き換える必要は無い)
- Display list からそれぞれの character を削除するために RemoveObject?2 tag を使用する。削除される character を特定するために depth 値のみが必要とされる。
