• The added line is THIS COLOR.
  • The deleted line is THIS COLOR.
TITLE:SWF Editor for PHP
CENTER:''SWF Editor for PHP (テスト中)''
CENTER:''SWF Editor for PHP''
RIGHT:(c) 2008/03/09- yoya@awm.jp

- ここの内容は、少しずつ sourgeforge に移行する予定です。
#img(http://sourceforge.jp/sflogo.php?group_id=3689&type=1&dummy=.png)
-- 旧) http://sourceforge.jp/projects/swfed/
-- 新) http://osdn.jp/projects/swfed/
----
#contents

CENTER:5月頭目標で実用的な品質まで持って行く予定
- p5-SWFEditor (perl 拡張)
-- https://github.com/mix3/p5-SWFEditor

* メモ [#memo]
- http://www.adobe.com/devnet/swf/ 公式 SWF仕様書
- http://www.m2osw.com/swf_alexref.html 非公式 SWF 解析結果

** リリース予定と変更履歴 [#changelog]

- http://sourceforge.jp/projects/swfed/wiki/ChangeLog

** 課題 [#w7228897]

- configure で gif, png 取りこめない場合の警告を分かり易くする
- 安定化 (php binding の見直し含め)
- 高速化 (はしょれる処理がありそう)
- コード整理 (冗長になってる)

** 確認予定 [#fb7b8c5a]
- getPNGData メソッドで透明度付きPNG の動作が未確認。tRNS は対応済みだが RGBA 形式の処理は未確認。
- replaceJPEGData で alpha データを指定した時の挙動があやしい。(JPEG は premultiplied されてないとダメかも)
- getPNGData で抽出した画像のガンマ値が高いように見える。(オリジナルより白っぽい)

** 完了 [#done]

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

* 成果物 [#output]

** ダウンロード [#download]
-  %% http://sourceforge.jp/projects/swfed/files/ release %%
-  %% http://svn.sourceforge.jp/svnroot/swfed/trunk/ current %%
- http://sourceforge.jp/projects/swfed/scm/git/swfed/
-  利用に制限はかけません。改造して使うのもお好きなままに。
-  コピーライトの名前だけ書き換えて配布されたら泣きます。(;ω;)

** 動作環境 [#runtime-env]

- PHP5 (5.1.x, 5.2.x, 5.3.x, 5.4.x, 5.5.x)
- Linux, FreeBSD, Macintosh(x86, PPC 両方), [http://d.hatena.ne.jp/yoya/20110810/swfed Windows(?)]
- zlib, libpng, giflib ライブラリ

** 実験ページ [#testpage]
- http://app.awm.jp/swfed/ ([http://svn.sourceforge.jp/svnroot/swfed/trunk/www/ ソースコード])
- http://awm.jp/~yoya/php/flash/swfdump.php

** インストール方法 [#install]

- zlib, libpng, giflib が必要です。(見つからないと configure でエラーになります)

*** モジュールのビルド [#build]
- swfed-?.??.tar.gz をもってきて伸張
--  http://sourceforge.jp/projects/swfed/files/
- src 以下で phpize & configure & make

 cd src
 phpize
 ./configure
 make

- linux や freebsd だと php-dev 系pkg, macintosh だと Xcode といった開発用パッケージが必要です。

*** モジュール(新規)設置 [#setting]
- modules 以下に生成される so ファイルを php の extension ディレクトリに copy
- php.ini に extension 設定追加
 extension=swfed.so
--  CentOS や Debian だと /etc/php.d/ 以下に置き場所があるようです。([http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1332046903 参考]]
- apachectl graceful

 su
 cp modules/swfed.so <php_ext_dir>/.
 vi <php_ini_dir>/php.ini
 apachectl graceful

*** モジュール更新 [#update]
- apachectl stop
- extension ディレクトリに so を copy
- apachectl start

 su
 apachectl stop
 cp modules/swfed.so <php_ext_dir>/.
 apachectl start

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

*** !!! [#gb857e1e]

- なぜ apache module を更新すると Segmentation fault するのか 
--  http://dsas.blog.klab.org/archives/50972695.html

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

* 目的 [#purpose]

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

* 設計 [#design]

- PHP extension (php 5.1.6 ← CentOS 5 の yum の対応バージョンがそれなので…)
- bit stream 処理は自作 (もしイイのがあったら誰か教えて…)
- CWF (zlib 圧縮) 対応%%は後回し (でも、後で対応できるように)%% ← 対応しました
- tag ブロック分割と tag の詳細parse を分けて、余分な処理をなるべく省く。
- 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 になります。

** 仕様 [#api]

- php.ini の ext 設定に swfed.so を追加
- php.ini の ext 設定に swfed.so を追加すれば動く。
- 機能はこちらを参照の事 → [[swfed/functions]] (SWFEditor メソッド一覧)

- 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 getTagDatail(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 getEditTextString(string variable_name); return text;
      function replaceEditTextString(string variable_name, string text)
                                     return true/false;
      ---- ここから下は未実装
       function getTagData(integer seqno);
                                     return string tagdata;
 }
*** 使用例 [#usage]
- http://diary.awm.jp/~yoya/data/2008/04/23/swfed/swfdump.phps
- http://diary.awm.jp/~yoya/data/2008/04/23/swfed/swfreplaceeditstring.phps
*** 使用例 (サンプルコード) [#usage]
- http://svn.sourceforge.jp/svnroot/swfed/trunk/sample/swfdump.php
- http://svn.sourceforge.jp/svnroot/swfed/trunk/sample/swfreplacejpegdata.php
- http://svn.sourceforge.jp/svnroot/swfed/trunk/sample/swfreplaceeditstring.php
- http://svn.sourceforge.jp/svnroot/swfed/trunk/sample/swfcompress.php
- http://svn.sourceforge.jp/svnroot/swfed/trunk/sample/swfapplyshapematrix.php

** 内部仕様 (改造したい人用) [#internal-spec]

- 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 にのせる)


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

* 成果物 [#output]
* リリース作業 [#release]

** プログラム [#program]
--  http://diary.awm.jp/~yoya/data/2008/04/29/swfed/ 最新は多分こっち
--  http://diary.awm.jp/~yoya/data/2008/04/23/swfed/ ~.phps はこっち
** version [#p484cb74]

** 実験ページ [#testpage]
- http://awm.jp/~yoya/php/flash/swfdump/
- http://awm.jp/~yoya/php/flash/swfdump.php
- php_swfed.h の version を書き換え

** インストール方法 [#install]
- swfed をディレクトリ毎もってくる 
- php ソースツリーの ext 以下に swfed を配置 
- swfed で phpize & configure & make
** テスト [#test]

 cd  /home/<yourname?>/src/php-5.2.5/ext/swfed
 phpize
 ./configure
 make
- 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 小さい)テキストに書き換えられる。

※ 本来はソースツリー上以外でコンパイルしても大丈夫なはずですが、適当なディレクトリで作成した swfed.so だと動かないようです… 謎…
- 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 作成 [#taball]

- %%svn repository web から trunk.tar.gz を取得%%
// git archive --format=tar --prefix=swfed-0.XX/ HEAD | gzip -9 > swfed-0.XX.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 確認
- リリースページでアップロード



* 日記 [#diary]
- SWFいじり開始
--  http://diary.awm.jp/~yoya/?20080114#200801141
- Flash SWF ファイル内 JPEG 画像入れ替えの PHP extension 完成
--  http://diary.awm.jp/~yoya/?20080331#200803311 | ([http://d.hatena.ne.jp/yoya/20080331 hatena] | [http://mp.i-revo.jp/user.php/wrckyapk/entry/7378.html i-revo mp])
- swfed replaceJpegData alpha データ対応 (画像入れ替えサンプル&heart;)
--  http://diary.awm.jp/~yoya/?20080514#200805141

* 課題 [#w9c739f4]
- ムービークリップ入れ替え
--  http://diary.awm.jp/~yoya/?20110319#201103190

- DefineBitsJPEG2,3 の動作テスト
* 課題 [#todo]

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

** 常に [#lifework]

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

** 必要が生じたら [#kf22b7d4]
** 未定 [#kf22b7d4]

- DefineBitsLossless(未圧縮画像, BMP とか PNG 等)も要望があれば対応するかも。
- Windows 対応 (ハマり中…)
- swf_tag.c の処理が冗長なので何とかする

* FAQ [#faq]

- こちらに幾つか移動 > [http://sourceforge.jp/projects/swfed/wiki/FAQ]

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

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

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

** php current に swf extension があるけど? [#l1d146af]
- cvs の履歴を見ると2000年頃に pecl に移動したらしいのですが、pecl で検索しても見つからないし、実際に利用している例も見当たらないので、にんともかんとも…

* 資料 [#data]

** 調査 [#study]

- Flash SWF バイナリ ([[Flash/SWF]])
- PHP extension の作り方 ([[PHP/ext]])
- zlib の使い方 ([[zlib]])
- 画像ファイル処理ライブラリ ([[libpng]]) | ([[giflib]]) | ([[libjpeg]] 結局使ってない) 
- [http://diary.awm.jp/~yoya/?2008021&to=200802132#200802132 FlashSWF alpha データ抽出@Yoya's diary]

** 参考 [#ref]
- http://sswf.sourceforge.net/SWFalexref.html
-- http://www.m2osw.com/swf_alexref.html
- http://www.swftools.org/

** 未参考 [#noref]

- SWF::Parser - SWFファイルをパース 
-- http://perldoc.jp/docs/modules/SWF-File-0.20/Parser.pod
- SWF::Builder - SWFファイル生成
--  http://d.hatena.ne.jp/sfujiwara/20070618/1182172990
- PECL swf
-- http://cvs.php.net/viewvc.cgi/pecl/swf/
- jpeglib の使い方 ([[jpeglib]])

** その他 [#data-etc]

- http://sourceforge.jp/projects/swfed
- PHPカンファレンス2008/2009LT ([[LT/swfed]]) リベンジ&色々進捗があったので
- http://labs.gree.jp/blog/2010/08/631/

* ユーザ様 :) [#user]
- http://www.polygonmagic.com/cedec/cedec20110908.pdf 資料中にswfedの文字を発見 :-)
- http://black-tree.net/diary/?date=20090104
- http://mateio.blog.so-net.ne.jp/2010-03-12
- http://blog.y-110.net/log/eid140.html
- http://d.hatena.ne.jp/sasezaki/20090913/p1
- http://blog.dtop.jp/~komaba/?p=185 SWFEditorを使ったswf合成でFlash作成者が気をつけること
- http://d.hatena.ne.jp/okonomi/20110120/1295495603 swfedのインストール on Homebrew@Mac OS 10.6.6
- http://blog.ps-ax.info/2011/07/swfmill%E3%81%A7gif%E3%81%AE%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%882/ swfmillでGIFの置き換え(2)
- http://d.hatena.ne.jp/deeeki/20110222/swf_editor_replace SWF Editor for PHP 画像置換

** MacOSX [#c658ae8b]
- https://gist.github.com/1057955/40da271924012a3cd0b9a7ecbff7e968fcee5861 install swfeditor MacSX 10.6
- [http://www.polidog.jp/2011/09/16/macbookpro%E3%81%ABswfeditor%E3%82%92%E3%81%84%E3%82%8C%E3%81%A6%E3%81%BF%E3%81%9F/ MacBookProにSWFEditorをいれてみた]

* 関連ページ [#rel]

- Flash SWF バイナリ ([[Flash/SWF]])
- PHP extension の作り方 ([[PHP/ext]])
- zlib の使い方 ([[zlib]])
- image composer extention ([[imgcompo]])


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