SWF Editor for PHP
(c) 2008/03/09- yoya@awm.jp

メモ

過去リリース

次回(0.29)リリース予定

  • replaceTagByCID() の実装 (CID の後ろのコンテンツを入れ替える)
  • getTagByCID() の実装 (CIDの後ろのコンテンツを取り出す)
  • setCompressLevel (zlib 圧縮率の変更)

次々回(0.30)リリース予定

  • replacePNG で 15bit以下のcolor を扱う時に format=4 で処理する
  • 標準エラーを PHP の警告へ移す。(debugモードを作る)
  • JPEG replace 時に strip (不要なセグメントを削除)

課題

  • configure で gif, png 取りこめない場合の警告を分かり易くする
  • FreeBSD で Seg.fault する問題の修正 (0.28 で治ったはず)
  • 安定化 (php binding の見直し含め)
  • 高速化 (はしょれる処理がありそう)
  • コード整理 (冗長になってる)

予定機能

  • フォントの抽出/入れ替え (DefineFont)

確認予定

  • getPNGData メソッドで透明度付きPNG の動作が未確認。tRNS は対応済みだが RGBA 形式の処理は未確認。

完了

  • 諸々高速化 (chara.swf の dump が web越しだと重たい原因が不明) 
    • 一時ファイルを置くディスクが壊れてたwww

成果物

ダウンロード

動作環境

  • PHP5 (5.1.x, 5.2.x, 5.3.0)
  • Linux, FreeBSD (apache 上で連続で呼ぶと落ちます), Macintosh(x86, PPC 両方)

実験ページ

インストール方法

モジュールのビルド

cd src
phpize
./configure
make
  • linux や freebsd だと php-dev 系pkg, macintosh だと Xcode といった開発用パッケージが必要です。

モジュール(新規)設置

  • modules 以下に生成される so ファイルを php の extension ディレクトリに copy
  • php.ini に extension 設定追加
    extension=swfed.so
  • apachectl graceful
su
cp modules/swfed.so <php_ext_dir>/.
vi <php_ini_dir>/php.ini
apachectl graceful

モジュール更新

  • apachectl stop
  • extension ディレクトリに so を copy
  • apachectl start
su
apachectl stop
cp modules/swfed.so <php_ext_dir>/.
apachectl start

※ もし、無停止で更新する方法があれば、どなたかご教授頂けませんか。(無理な気がしてますが…)

!!!

cp でなく install (rm & cp) なら大丈夫らしい。今度試してみよう。

目的

  • Flash SWF ファイル内のコンテンツを入れ替える
    • テキストツールで貼り付けた文字列の入れ替え
    • JPEG画像の入れ替え
    • PNG画像の入れ替えもほぼ対応 (グレー形式は未対応)
  • Adobe CS3 等で生成した SWF の必要な部分だけ PHP+swfed で書き換える事で、Flash 開発者と PHP 開発者が得意な部分に注力できます。
  • 最小限の処理で書き換えを行っているので、ming のように1からファイルを構成するより負荷が軽めです。軽くなるかもしれません。

設計

  • PHP extension (php 5.1.6, 5.2.5 で動作確認)
  • bit stream 処理は自作 (もし良いのがあったら誰か教えて…)
  • ファイル全体から tag ブロックへの分割は無条件で処理するが、tag ブロックの詳細分割は必要な時だけ行う。
  • CWF (zlib 圧縮) 対応は後回し (でも、後で対応できるように) ← 対応しました-
  • png に対応したので libpng が必要です。近いうち GIF 対応するので giflib も必要になりそうです。 0.15 から giflib も必要になりました。
    • 0.18 から libpng や giflib がない環境でも build 出来るようにします。但し、対応する機能は disable になります。

仕様

  • php.ini の ext 設定に swfed.so を追加
  • SWFEditor メソッド一覧 → swfed/functions

使用例 (サンプルコード)

内部仕様 (改造したい人用)

  • tag ブロックの詳細データ処理 (swf_tag_~.[hc])
    • create (calloc と変数初期化)
    • identity (image_id,sound_id 等、数値型 id の比較)
    • destropy (メンバーを辿って全部 free)
    • input (データを受け取って内部構造に変換)
    • output (内部構造をデータとして(mallocしつつ)出力)
    • print (標準出力に内部データを渡す)
  • SWF 独自型の処理 (swf_~_t)
    • parse (bitstream から内部構造に落とす)
    • build (内部構造を bitstream にのせる)

実装

  • なるべく swf_{object|header|tag|...}.c 側に処理を作って、swfed.c はそこへの橋渡しに徹する。
  • swf_tag_<タグ名の省略形>.[hc]
    swf_tag_info_table に swf_tag_detail_handler_t の形式で関数ポインタ群を設定
    -> {create, identity, output, print, destroy}

リリース作業

version

  • php_swfed.c の version を書き換え

テスト

  • DefineBits
    • JPEG/GIF/PNG が処理できる
    • JPEG|GIF,PNG で異なる形式で入れ替えが出来る。
    • GIF/PNG で BitsPerPixel 8 以外でも処理できる
    • GIF/PNG で 横幅が4の倍数以外(4*n+1 か 4*n+2 が望ましい)でも処理できる。
    • 透明つき PNG の処理が出来る。
    • JPEG に透明度をつけて処理できる。
    • JPEG に RST 有りと無しの両パターンでテスト
  • TextEdit
    • テキストが書き換えられる
    • 元より大きい(and 小さい)テキストに書き換えられる。
  • Web越しで動く
  • config.m4
    • libpng や giflib がない場合でも動く
  • malloc/free
    • -DMALLOC_DEBUG を付けて試験
  • まとめてテスト
    for i in `ls *.swf`; do echo $i ;
       php swfdump.php $i > /dev/null ;
    done >& swfed-shape-ng.txt

tarball 作成

  • svn repository web から trunk.tar.gz を取得
  • tar xvfz で伸長
  • chown -R yoya:develop trunk
  • mv trunk swfed-0.??
  • tar cvfz
  • swfed-0.?? からインストールして動作確認。
  • php -i で version 確認
  • リリースページでアップロード

日記

課題

  • Cygwin では shared 形式の extension を作れないようなので、build-in 形式の手順も作成する。buildconf してダメだったので何かやる事があるはず。config.m4 ?
  • 分解できるタグをもっと増やす。
  • zend_mm_corrupted 問題の調査

常に

  • メモリ管理のブラッシュアップ
    • エージングに耐えられるように
    • おかしな SWF を食わせてもリークしないように
  • swfed.c の new_buff の処理を何とかする。

絶賛対応中

  • ベクタ画像の入れ替え。(携帯でビットマップを多用すると容量的にキツい)
    • ステージの SWF 上での扱いがよく分からない…

未定

  • Windows 対応 (ハマり中…)
  • swf_tag.c の処理が冗長なので何とかする

FAQ

loadVariable や loadMovie でよくない?

  • 携帯Flashではボタンを押してイベントを発生させないと、これらで通信が出来ません。なので、開いてすぐに動的なデータを使いたい。といった場合に対応できません。
  • あと、初めからデータが埋まっていれば通信しなくて済みますし。(携帯は通信のコストが馬鹿にならないので)

何故、ming を使わないの?

  • ming は一から SWF ファイルを生成するツールで、既存の SWF ファイルを書き換える機能はありません。
    • 動的でなくても良いデータまで、真面目に一からビット列を構築するので、処理が勿体無いかなと。
  • ming に SWF 読み込み機能を追加するのも考えましたが、全種類のタグの parse を実装するのは手間(人的にもPC的にも)すぎますし、(parse を省く為に) tag ブロックを raw データでも保存できるようにするには、ming の基本構造に手を入れる事になるので、それは無しの方向で…

何故、swfmill を使わないの?

  • swfmill で SWF ファイルを XML に落として必要部分を書き換え、SWF ファイルに戻す事でも目的は達成出来ますが、パフォーマンスを気にする環境にその処理を入れる勇気が自分には無いです。^^;

php current に swf extension があるけど?

  • cvs の履歴を見ると2000年頃に pecl に移動したらしいのですが、pecl で検索しても見つからないし、実際に利用している例も見当たらないので、にんともかんとも…

資料

調査

参考

未参考

その他

ユーザ様 :)

関連ページ


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