SWF Editor for PHP
- ここの内容は、少しずつ sourgeforge に移行する予定です。
メモ
次回(0.15)リリースメモ
- 無し
- p5-SWFEditor (perl 拡張)
目的
メモ
- 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 圧縮) 対応
は後回し (でも、後で対応できるように) ← 対応しました
課題
仕様
- configure で gif, png 取りこめない場合の警告を分かり易くする
- 安定化 (php binding の見直し含め)
- 高速化 (はしょれる処理がありそう)
- コード整理 (冗長になってる)
- php.ini の ext 設定に swfed.so を追加
確認予定
- getPNGData メソッドで透明度付きPNG の動作が未確認。tRNS は対応済みだが RGBA 形式の処理は未確認。
- replaceJPEGData で alpha データを指定した時の挙動があやしい。(JPEG は premultiplied されてないとダメかも)
- getPNGData で抽出した画像のガンマ値が高いように見える。(オリジナルより白っぽい)
- PHP extension API (実装済)
class SWFEditor {
function input(string swddata) return true/false;
function output() return string swfdata;
function swfInfo() return ; // print swfInfo
function getTagList();
return array(array('tag'=>long,
'length'=>long,
'detail'=>bool),
...)
function getTagDetail(integer seqno);
return array(...); image_id とかそれ系
function getJpegData(integer image_id)
return string jpegdata;
function getJpegAlpha(integer image_id)
return string alphadata;
function replaceJpegData(integer image_id, string jpegdata
[,string alphadata])
return true/false;
function getPNGData(integer image_id)
return string pngdata;
function replacePNGData(integer image_id, string pngdata)
return true/false;
function getSoundData(integer sound_id) // getMP3Data は廃止。
return string sounddata;
function replaceMLDData(integer sound_id, string mlddata)
return true/false;
function getEditTextString(string [variable_name|edit_id]); return text;
function replaceEditTextString(string [variable_name|edit_id], string text)
return true/false;
※ Flash ver 6 以降は UTF-8 ですが、Flash Lite は ver 4 相当なので
※ CP932(SJIS-Win)エンコーディングです。アプリ側でコード変換して下さい。
function getHeaderInfo() return array('compress'=>...,
'version'=>...);
function setHeaderInfo(array('compress'=>..., 'version'=>...))
return true/false;
- PHP extension API (開発中)
function getMovieHeaderInfo() return array('frame_size'=>
array('x_min' =>..,'x_max' => ..,
'y_min' =>..,'y_max' => ..);
'frame_rate'=>...,
'frame_count'=>...);
function setMovieHeaderInfo(array('frame_size'=>
array('x_min' =>..,'x_max' => ..,
'y_min' =>..,'y_max' => ..);
'frame_rate'=>...,
'frame_count'=>...);
return true/false;
function replaceMP3Data(integer sound_id, string mp3data,
integer samples)
return true/false;
- PHP extension API (未実装)
function getSymbolSWF(string symbol_name)
return swfdata;
function replaceSymbolSWF(string symbol_name, string swfdata)
return true/false;
function getActionData(integer seqno); // 微妙
function disasmActionData(string actiondata);
return Array(Array('op'=>$code,
'data'=>$data)
);
function asmActiondata(Array(Array('op'=>$code, 'data'=>$data)));
return action_data;
function replaceActionData(integer seqno, string actiondata);
return true/false;
function getAlphaDataFromGIFData(string gifdata)
return alphadata;
function getTagData(integer seqno);
return string tagdata;
}
完了
使用例 (サンプルコード)
内部仕様 (改造した人用)
成果物
- tag ブロックの詳細データ処理
- create (calloc と変数初期化)
- identity (image_id,sound_id 等、数値型 id の比較)
- destropy (メンバーを辿って全部 free)
- input (データを受け取って内部構造に変換)
- output (内部構造をデータとして(mallocしつつ)出力)
- print (標準出力に内部データを渡す)
ダウンロード
- SWF 独自型の処理
- parse (bitstream から内部構造に落とす)
- build (内部構造を bitstream にのせる)
動作環境
- PHP5 (5.1.x, 5.2.x, 5.3.x, 5.4.x, 5.5.x)
- Linux, FreeBSD, Macintosh(x86, PPC 両方), Windows(?)
- zlib, libpng, giflib ライブラリ
実装
- なるべく swf_{object|header|tag|...}.c 側に処理を作って、swfed.c はそこへの橋渡しに徹する。
- swf_tag_<タグ名の省略形>.[hc]
swf_tag_info_table に swf_tag_detail_handler_t の形式で関数ポインタ群を設定
-> {create, identity, output, print, destroy}
成果物
プログラム
実験ページ
インストール方法
- zlib, libpng, giflib が必要です。(見つからないと configure でエラーになります)
モジュールのビルド
- swfed-?.??.tar.gz をディレクトリ毎もってきて伸張
- swfed-?.??.tar.gz をもってきて伸張
- src 以下で phpize & configure & make
cd src
phpize
./configure
make
- linux や freebsd だと php-dev 系pkg, macintosh だと Xcode といった開発用パッケージが必要です。
モジュール(新規)設置
- modules 以下に生成される so ファイルを php の extension ディレクトリに copy
- php.ini に extension 設定追加
extension=swfed.so
- CentOS や Debian だと /etc/php.d/ 以下に置き場所があるようです。(参考]
- 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
※ もし、無停止で更新する方法があれば、どなたかご教授頂けませんか。(無理な気がしてますが…)
!!!
- なぜ apache module を更新すると Segmentation fault するのか
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 を追加すれば動く。
- 機能はこちらを参照の事 → swfed/functions (SWFEditor メソッド一覧)
使用例 (サンプルコード)
内部仕様 (改造したい人用)
- tag ブロックの詳細データ処理 (swf_tag_~.[hc])
- create (calloc と変数初期化)
- get_cid (image_id,sound_id 等、数値型 id の取得)
- replace_cid (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.h の 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 小さい)テキストに書き換えられる。
- config.m4
- libpng や giflib がない場合でも動く
- malloc/free
tarball 作成
-
svn repository web から trunk.tar.gz を取得
git archive --format=tar --prefix=swfed-1.00/ v1_00 | gzip -9 > swfed-1.00.tar.gz
- tar xvfz で伸長
- chown -R yoya:develop trunk
- mv trunk swfed-0.??
- tar cvfz
- swfed-0.?? からインストールして動作確認。
- php -i で version 確認
- リリースページでアップロード
日記
- SWFいじり開始
- Flash SWF ファイル内 JPEG 画像入れ替えの PHP extension 完成
- swfed replaceJpegData alpha データ対応 (画像入れ替えサンプル )
課題
- Cygwin では shared 形式の extension を作れないようなので、build-in 形式の手順も作成する。多分、configure 前に buildconf を実行する位だと思うけど。
- Cygwin では shared 形式の extension を作れないようなので、build-in 形式の手順も作成する。buildconf してダメだったので何かやる事があるはず。config.m4 ?
- 分解できるタグをもっと増やす。
- zend_mm_corrupted 問題の調査
常に
常に
- メモリ管理のブラッシュアップ
- エージングに耐えられるように
- おかしな SWF を食わせてもリークしないように
- swfed.c の new_buff の処理を何とかする。
絶賛対応中
未定
- swfdump/index.php の公開
- GIF 吸出し対応
近日中に対応
未定
- ベクタ画像の入れ替えを検討中。(携帯でビットマップを多用すると容量的にキツい)
- swf_tag.c の処理が冗長なので何とかする
FAQ
loadVariable や loadMovie でよくない?
- それらを実行する時に通信が発生しますが、初めに送る Flash に反映されていれば、その通信がいらなくなるかなと…。そんな事気にしないと言われてたら、それまでですが。
- あと、携帯Flashではボタンを押してイベントを発生させないと、これらで通信が出来ません。なので、開いてすぐに動的なデータを使いたい。といった場合に対応できません。
- 携帯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 で検索しても見つからないし、実際に利用している例も見当たらないので、にんともかんとも…
資料
調査
参考
未参考
- SWF::Parser - SWFファイルをパース
- SWF::Builder - SWFファイル生成
- PECL swf
その他
その他
ユーザ様
MacOSX
関連ページ
|