yoyaのメモ

2011/03/08(Tue) SWFEditor 0.32 replaceMovieClip 対応

[]SWFEditor 0.32 replaceMovieClip 対応

SWF の画像入れ替えやテキスト入れ替えに加えて、

(動きのある)シンボル入れ替えにも対応しました。

入れ替えたいシンボルのインスタンス名と SWFデータを渡すと、

渡した SWF をシンボルに変換して差し替えます。

まだ実験的なリリースです。今の所、

depth 重複避けとか根本的な処理が幾つか抜けています。

原理

  • インスタンス名からシンボルを検索する
    • インスタンス名(name)を持つ PlaceObject2 タグを探す
    • PlaceObject2 が character_id で指し示す Spriteタグを探す
  • CID 重複避け
    • テンプレートSWF が使用している CID をリストアップする。
    • 入れ替える SWF 中の CID で上記のと衝突する番号は renum する
  • 渡した SWF をシンボルに変換して差し替える
    • その SWFコンテンツ系のタグは Spriteタグの前に展開
    • その SWF の制御系タグは Sprite の中身を消して、その中に改めて展開する。

制限事項

  • 差し替える SWF 中の ActionScript のターゲットで相対パスは使わないのを推奨します。SWF を MovieClip に包む処理を入れている為、渡した SWF 内の ActionScriptroot 以外を指すターゲットが別の場所を指すようになるかもしれません。

課題

  • テンプレートSWF と差し替え SWF で depth が重複しないよう renum する。
  • 入れ替えて不要になったコンテンツタグを削除する。
  • 差し替え SWF の中に Sprite タグが含まれる場合に、その Sprite 中の CID を renum する。
  • 別の Sprite の中に入っている Sprite を指定して入れ替えられるようにする。(ただ、ちょっとパフォーマンスが心配)

続く → replaceMovieClip の使い方 - yoyaのメモ

2010/12/05(Sun) swfedがたまに落ちる原因?

[]swfedがたまに落ちる原因?

たまにといいますか、FreeBSD ではよく落ちるという報告が今年の頭から何度かありまして…

動作確認して次バージョンで出します。

src/jpeg_segment.c

jpeg_segment_delete_node(jpeg_segment_t *jpeg_seg, int marker) {
    jpeg_segment_node_t *node;
    int count = 0;
    for (node=jpeg_seg->head ; node ; node=node->next) {
        if (node->marker == marker) {
            node->marker = -1; // remove mark;
            if (node->data_ref) {
                free(node->data_ref); // ☆☆コレ☆☆
                node->data_ref = NULL;
            }
            node->data_len = 0;
            count ++;
        }
    }
    return count;
}

わざわざ free されないように data_ref (他変数の参照だよ) という

分かりやすい変数名にしてたのに。。。シネバイイノニ。> 自分。

2010/11/30(Tue) [swfed] setActionVariables 実装

[]setActionVariables 実装

SWFEditor で SWF にパラメータを埋め込むのに、現状、

テキストボックスを利用して頂いていますが、

ActionScript変数を、直接的に埋め込みたいという要望があり、

↑↑これを真似て、実装してみました。

原理

変数名と代入する値の文字列を各々 Push Data して SetVariable する

ActionScript Byte Code のバイナリを生成して、

DoAction タグの形式で SWF の初めの方に挿入します。

プログラム

テスト

<?php
$swf_filename = $argv[1];
$swfdata = file_get_contents($swf_filename);
$obj = new SWFEditor();
$obj->input($swfdata);
$variables = array('yoyakey' => 'yoyavalue', 'foo' => 'goo');
$obj->setActionVariables($variables);
echo $obj->output();

結果

swfdump --full

[00c]        45 DOACTION
                 (    9 bytes) action: Push String:"yoyakey"
                 (   11 bytes) action: Push String:"yoyavalue"
                 (    0 bytes) action: SetVariable
                 (    5 bytes) action: Push String:"foo"
                 (    5 bytes) action: Push String:"goo"
                 (    0 bytes) action: SetVariable
                 (    0 bytes) action: End

懸念

  • 挿入する場所は初めの方ですが、具体的な条件が絞り込めていません。
  • とりあえず、FileAttribute よりは後にしてますが、コンテンツ系タグより前に置いて良いのかどうか。。

まず、iPhone に浮気してから Flash Lite が動く携帯が手元にないので、

誰かから借りないと確認出来なくて困るw

予定

SWF バイナリ的には期待通りですが、

実動作も期待通りなのが確認できたら、0.26 としてリリースします。

2010/11/23(Tue) swfed が10回に1度位セグフォする不具合

[]swfed が10回に1度位セグフォする不具合

不具合報告を貰って、手元で問題を再現できなかったので、

backtrace を送ってもらった。

#3  0x00002b0dce7c9992 in swf_tag_lossless_replace_png_data (detail=0x2b0dbf46f7e0, 
    image_id=<value optimized out>, png_data=0x11 <Address 0x11 out of bounds>, 
    png_data_len=47338044985344, tag=0x2b0dbf470430)
    at /usr/local/src/swfed-0.23/src/swf_tag_lossless.c:423
#4  0x00002b0dce7bf472 in swf_tag_replace_png_data (tag=0x2b0dbf470430, image_id=50, 
    png_data=0x2b0dcf7516e0 "\211PNG\r\n\032\n", png_data_len=289)
    at /usr/local/src/swfed-0.23/src/swf_tag.c:483

swf_tag_lossless_replace_png_data の引数が無茶苦茶になってる。

ワイルドポインタかスタック破壊といった、いやらしい系のバグですね… ○rz

スタック破壊なら swf_tag_lossless_replace_png_data 以降で、

自動変数のバウンダリ破壊があるのかな。って所だけど。

ワイルドポインタだと、怪しい所を試行錯誤でつぶすしかなくて大変だ。

最悪は、その両方の合わせ技なんだけど…

2010/10/27(Wed) adjustShapeBitmap 出来たー (JPEG 限定だけど)

[]adjustShapeBitmap 出来たー (JPEG 限定だけど)

swfed で、元の画像と異なるサイズの画像に入れ替えると、

枠で足りない所が変な色で埋まったり、枠でクリップされたりと

まずいので、その対応の処理を入れました。

JPEG のみ対応と断って、0.22 でリリース済みです。

GIF と PNG にも適用出来たら 0.23 でリリースします。多分、来週位。

サンプル

$obj = new SWFEditor();
$obj->adjustShapeBitmap(SWFEditor::SHAPE_BITMAP_RECT_RESIZE);
// $obj->adjustShapeBitmap(SWFEditor::SHAPE_BITMAP_MATRIX_RESCALE);
// $obj->adjustShapeBitmap(SWFEditor::SHAPE_BITMAP_TYPE_TILLED);
$obj->input($swfdata);
$obj->replaceJpegData($image_id, $jpegdata);
echo $obj->output();

f:id:yoya:20101028014108j:imagef:id:yoya:20101028015517j:imageに入れ替える。

結果

f:id:yoya:20101028013857p:image

f:id:yoya:20101028014022p:image

f:id:yoya:20101028014130p:image

f:id:yoya:20101028014141p:image

課題

そろそろ機能拡張しにくくなってきたのでコードの整理が必要。

コピペでバラまいたコードを共通化したい。

特に、tag のリストを走査したり、tag を分解したりの処理。

あと、adjustShapeBitmap で Shape tag を走査する際に、

ルームを無駄に二度回してるので修正する。(0.23 までに)