rect 処理修正

テキストツールで貼り付けた矩形の情報を表示すると
以下のような頓珍漢な値が表示されていました。
(min が max より大きい…)

tag=DefineEditText(37) length=42
edit_id=2
rect=(393, 393)-(37, 146) (f_size=13)
text=1 wwrap=0 multi=0 pass=0 ro=1 col=

これで、自分がフォーマットを勘違いしているのかと悩んだのですが、
この値を埋めるフィールドが可変な上に負の値も扱える事に気づいて、
bitstream は unsigned 前提で作ってるので、2の補数処理をどこかに
入れないとダメな事に気づきました。

↓処理はこんな感じで。関数名が思いつかなったので許して… ○rz

int two_negative(int num, int size) {
int msb = 1 << (size - 1);
int mask = msb - 1;
if (num & msb) {
    return - ((num^mask) & mask) - 1;
}
return num;

結果。

tag=DefineEditText(37) length=47
    edit_id=2
    rect=(-8, -2)-(101, 36) (f_size=12)

それっぽい値になりました。

DefineEditText の string

文字列の抽出の仕方が分かりました。
静止テキストの時はインスタンス変数が指定できない=variable_name が空で、その時は、'\0'の 1 byte のみ展開されます。
SWF フォーマットの string は null terminate のバイト列という定義なので、少し考えれば当たり前なんですけど。

tag=DefineEditText(37)  length=47
        edit_id=2
        rect=(-8, -2)-(101, 36) (f_size=12)
        text=1 wwrap=0 multi=1 pass=0 ro=1 col=1 maxlen=0 font=1
        layout=1 no_sel=1 border=0
        font_id=1 font_height=14
        red=0x00  green=0x00  blue=0xff  alpha=0xff
        align=2 (left,right)_margine=(0,0) indent=0 leading=40
        variable_name=
fobaa   initial_text=thisistest

よし…

インスタンス名

DefineEditText にはインスタンス名を埋めるフィールド(variable_name)が含まれますが、
これを埋められるのは「ダイナミックテキスト」と「テキスト入力」2パターン。
どちらも Lite1.1 では使えません。

Lite1.1 で使える「静止テキスト」では、インスタンス変数を指定できないので
入れ替えをする場合は swf をダンプして edit_id を調べて…
という面倒な手順を踏む事になりそうです。