トップ / ソースコード / ASDoc

SWFを弄る

SWFについて簡単な説明

SWFクラスはSWFの構造をそのままクラス化したものです。以下簡単に説明。

  • SWF
    • header - ヘッダ情報
      • version - SWFのバージョン
      • isCompressed - データが圧縮されていたかどうか
      • frameSize - SWFの幅(xMax)と高さ(yMax)
      • frameRate - SWFのFPS
      • numFrames - SWFの総フレーム数
    • fileAttributes - バージョン8以降には必ず存在
      • hasMetadata - メタデータを持っているか
      • useNetwork - ネットワークを利用するか
      • isActionScript3 - ActionScript?3を利用するか
    • tags
      • tags - SWFに含まれる全てのタグの配列

タグ

SWFでは、「タグ」と呼ばれるもので図形やアニメーションの定義をしています。HTMLと似たようなものです。swfassistでは、これらのタグは全てクラス化され、org.libspark.swfassist.swf.tags以下に定義されています。

TagVisitor?

swfassistではタグに対してVisitorパターンを適用しているので、簡単にタグを網羅して様々な処理が行えるようになっています。

例えば適当なSWFを読み込んでSWFPrinter(作りかけなので不完全ですが)をvisitさせてあげると、SWFの構造がなんとなくtraceされます。

swf.visit(new SWFPrinter());

TagVisitor?インターフェイスを実装したクラスであれば、visitさせることができます。TagVisitor?にはvisitほげほげというメソッドがたくさん定義されています。それぞれタグひとつに対応しており、そのタグが出現した時にそのメソッドが呼ばれるようになっています。

AbstractTagVisitor?

AbstractTagVisitor?TagVisitor?を実装し、全てのvisitほげほげメソッドを空のメソッドで実装してあります。独自のTagVisitor?を作る時に、こいつを継承してやるととても楽です。swfassist内で用意しているTagVisitor?ももれなくAbstractTagVisitor?を継承しています。

実例

以下に、TagVisitor?を使った弄り方をいくつか紹介します。

ShapeCollector?

ShapeCollector?を使うと、SWF内で定義されているシェイプとフォントの情報を全て持ってくることが出来ます。具体的にはShapeクラスを集めてくれます。

更に、これをFlash上に描画するためのShapeDrawer?なんて便利な物があるのでそれを使うとそのシェイプやらフォントやら描画出来ます(現在アウトラインのみ)。次のコードをお試しあれ。

AnimationCollector?

今度はアニメ情報までとってきて全部自前で描画しちゃいます。ただ、Playerを作るのが目的ではなく、あくまで「これだけ正確に情報が取れるよ」というデモなので再現度はそこそこです。

実際に動くコードは次にあります。

SepiaConverter?

フィルタ系をのぞくSWF内の全ての色をセピア調に変換しちゃいます。これで作ったSWFをSWFWriterで書き出せば、見事セピアなSWFのできあがり。