SWF Shape サイズ削減
Flash の SWF を parse して build するだけのプログラムを作ってみました。
ここから更にベクター情報をデフォルメするつもりですが、とりあえず、バイナリを構築し直すだけで少しサイズが減ったので報告。
プログラム
サイズ比較
- 処理前
magic=CWS version=8 file_length=3166474 rect=(0, 0)-(550, 300) (f_size=15)
- 処理後
magic=CWS version=8 file_length=3166366 rect=(0, 0)-(550, 300) (f_size=15)
理屈
SWF DefineShape のベクター情報の値は、まず値を格納するのに必要なフィールド長があって、その後ろに実際の値が続きます。
- 典型例
+------------------------------+ | numBits | deltaX | deltaY | +------------------------------+ <4or5 bits><-numBits-><-numBits->
この numBits が実際に必要な値より大き目にとる事があるようです。
ギリギリのフィールド長でバイナリを作り直したら、少しだけサイズが減りました。
新たな課題
- ChaneStyleRecord の StateNewStyle があると表示が少し変。
- これ、Style に追加でなく、Style を入れ替えてる気がする。
- だとすると、さらに数バイト削れてラッキーですが。