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 を入れ替えてる気がする。
  • だとすると、さらに数バイト削れてラッキーですが。