« Groovy1.0がついにリリース!!...されてた。だいぶ前に | トップページ | 3次のベジェから2次のベジェ(B-Spline)に変換 »

2007年2月14日 (水)

Flash SWFの書き出し(覚書)

ここ二日ほど訳あってJavaでSWF(Flash)を書き出すプログラムを書いています。

ほいで、誰のためとも無く覚書程度に書いておきます。

...

■SWFファイルフォーマット仕様書の取得

 SWFの仕様書(英語版)は全てAdobeから無料で提供されています(2007/2/14現在)

http://www.adobe.com/licensing/developer/

 Macromedia Flash (SWF) and Flash Video (FLV) File Format Specification (Version 8)

の中の

 Begin the licensing process for the File Format Specification .

 という部分をクリックして、登録すればダウンロードが可能となります。

 PDFで300ページ近くありますが、本気で作る気であれば印刷した方が良いでしょう。

 私はホッチキスで小分けにして閉じて、その都度、必要な部分だけをペラペラ見るようにしています。


■ByteとBit演算のユーティリティを準備

 まず、この手の書き出し処理でお約束の「リトルエンディアン」が出てきます。基本的に1バイト以上のデータ(32bit int型など)はリトルエンディアンで書き出すようです。
リトルエンディアンはそこらで説明されているのでそちらを参考にしてください。

 次はBit演算、フラグとして1bitを書き出したり、4bitや15bitなど任意のビット数で、数値を書き出せる必要があります。

 仕様書にはTYPEとして色々出てきますが大まかに紹介すると

 UI8 なら Unsigned Int 8 (bit) 負号なしINT
 SI16 なら Signed Int 16(bit) 負号付きINT

 UB[1]なら 負号なしのフラグ 0,1
 UB[4]なら 4ビットで表現される負号なしの数値(0~15)
 SB[5]なら 5ビットで表現される負号ありの数値(-16~15かな?)


□負号なしと負号付き

 UB[2]、SB[5]などのとき、Javaであれば >>> と >> をうまく使い分ければ簡単に実装できます。もちろん & , | <<などのビット演算はフル活用しますが。


□その他の型

 RECTなどの型が多々出てきます。

 SWFの仕様を全部カバーするつもりでなければ、あらかじめ全部実装しても殆ど無駄になりますので、必要になったら実装していった方が良いでしょう。


□Byte Align

 UI8などのTYPEは Byte Align(1バイトの境界で必ず分ける)しますが、UB[1]などの場合は、ビットをつなげて行きます。

 SWFのタグはUI16で始まるのでByteAlignされますが、曲線などを定義するShape RecordsはUB[n],SB[n]などのビット書き出しが続くため、次のShape Recordsにいく時もByte Alignされません。私はここでこけました。


■SWFTOOLSを取得

 SWFTOOLSの中のSWFDUMPというソフトを使うとSWFを書き出したあと、Flashなどを使わずに内容をチェックすることが出来ます。
http://www.swftools.org/


■書き出しサンプルの用意

 SWF書き出しの第一目標は、超簡単なSWFファイルを生成して目標どおりに動くかどうかを試すことではないでしょうか。しかし、意外に何を書き出したらよいか悩みます(悩みました)。一発目ではなかなか動かず、どこがいけないのか原因不明になります(数時間苦しみました)。

 仕様書を一生懸命読んでも解決の糸口が見つからず苦しんでいたところ、「もしや」と思い、仕様書の最後を見たら「A Simple Macromdeia Flash(SWF)File Dissected」なるおまけを発見。

 ここには非常にシンプルなSWFフォーマットのサンプルデータとその16進ダンプが書かれております。また1Byteずつどうしてそうなるのかを書いてあるため、これの通りに書き出すことを最初の目標にすると、ドツボにはまることが無くなるのではないでしょうか。

※これに気づかなかったら数日無駄にしていたかもしれません。


□FillStyle0/1

 FillStyle0を使うとFlash8上に読み込み(インポート)した時、理由は今のところ理解していませんが「塗り」が消えてしまいます(FlashPlayerでは見える場合もあります)。FillStyle1を使うとFlash上でもみえます。

2007/02/19 追記

曲線の進行方向の左側を塗る場合にFillStyle0、右側を塗る場合にFillStyle1を使うらしい(SWF8仕様書p.147)。

但し、FlashPlayerではFillStyle0/1の違いが表示に影響を与えていないように思われる。

一方で、Flash8に読み込んだ場合は、Fill Style 0/1の意味を厳密に区別しているようで、正しく左右を指定してないと表示が壊れてしまう。上記のFillStyle1で成功したのは、たまたま曲線の進行方向と一致したようです。

曲線の回転方向を意識して作り直します。。

□曲線

 Flashでは意外にも、2次のベジェ曲線?(B-スプライン?コントロールポイント1つのヤツ)しか対応していません。Illustratorのような3次のベジェ(コントロールポイント2つ)で出来たデータはうまいこと2次のベジェに変換して書き出す必要があるようです。


■あとは根性?

 最低限のSWFが問題なく書き出せたら、後は必要な機能をガンガン組み込んでいくだけではないでしょうか。
画像処理が分かっていて、英語がソコソコ読めて、ビット演算に慣れていれば、一週間でそれなりのSWFを書き出せるようになると思います。もちろん仕様をフルにカバーするのは死ぬほど大変でしょうが。。

2月 14, 2007 Java, SWF書き出し | このエントリーを含むはてなブックマーク

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/130974/13904923

この記事へのトラックバック一覧です: Flash SWFの書き出し(覚書):

コメント

コメントを書く