• 複数 byte field は Little Endian
  • 可変長フィールドの bit 処理があって面倒
  • タグは TLC(type,length,contents) 構造
+---------+----------------------+
|  magic  |  \0  |  file_length  |
+-------- +------+---------------+
<-3 bytes-><1 byte><-- 4 bytes -->

magic: offset = 0

  • FWS or CWS の 3文字 + \0 (zero terminated string)
  • CWS の時は、file_length の後ろ(=header_movie 以降全て)のデータが zlib 圧縮される

file_length: offset = 4

  • Little Endian 4 byte
  • SWF ファイル全体の byte 数

header_movie

char align (byte境界に合わせる)
   |
   +-------+----------+----------+----------+----------+---
   | size  |  x_min   |  x_max   |  y_min   |  y_max   | ..
   +-------+----------+----------+----------+----------+---
   <5 bits><size bits><size bits><size bits><size bits>
 ---+---------------------------------+------------------+
 .. | frame_rate_dec | frame_rate_int | frame_rate_count |
 ---+---------------------------------+------------------+
     <-- 1 byte -->   <--  1 byte --> <--  2 bytes  -->

size: offset = 8

  • 先頭 5 bits は、この後に続く {x,y}_{min_max} のフィールドサイズ(つまり可変長)

{x,y}_{min,max}: offset = 8 + 5(bits) + n*size(bits) (n は 0 数え)

  • 表示フレームの左上と右下の座標値 (単位は TWIPS)
  • 負の値もとりうる事に注意。

frame_rate_decimal: offset = 8 + 5(bits) + 4*size(bits)

  • frame_rate の小数部

frame_rate_integral: offset = 8 + 5(bits) + 4*size(bits) + 1

  • frame_rate の整数部

frame_rate_count: offset = 8 + 5(bits) + 4*size(bits) + 2

  • frame_rate_count: frame 数

tag block

  • header + header_movie の後ろに TLC(Type|Length|Contents)形式で並ぶ
+----------------------------------------------------+
| header | header_movie | tag_block | tag_block| ... |
+----------------------------------------------------+
<-8bytes-> <- 可変長 ->   <- 可変長 -- 数も可変 --
  • tag block は contents の長さ(length)によって二種類のフォーマットに分かれる

tag block の構造 (1) length < 0x3f

+-------------------------------------+
|  tag    | length |     contents     |
+-------------------------------------+
<-10bits-><-6bits-><-- length bytes -->
<- Little Endian ->

tag block の構造 (1) 0x3f <= length or something

+------------------------------------------------------+
|  tag   |  0x3f   |    length    |      contents      |
+------------------------------------------------------+
<-10bits-><-6bits-><-- 4 bytes --> <-- length bytes -->
<- Little Endian ->
  • DefineBitJpeg* のように length の値に関係なく(0x3f 以下でも)このフォーマットを使う tag があるので注意。

tag contents の構造

(0) End

  • SWF ファイルの末尾に来る tag は必ずこれ
    +--------------+
    | tag | length |
    |  0  |    0   |
    +--------------+
    <-  2 bytes  ->

(6) DefineBitsJPEG

  • JPEG データが image_data にそのまま入る
+-------------------------------------------------------------+
| tag | length |    length    |  image_id |     image_data    |
|  6  |  0x3f  |              |           |                   |
+-------------------------------------------------------------+
<-- 2 bytes --> <- 4 bytes -> <-2 bytes->  <-contents 残り全部->
                              <------------------  length ---->

(21) DefineBitsJPEG2

+-----------------------------------------+------------------------------+
| tag | length |    length    |  image_id | encoding_tables | image_data |
|  21 |  0x3f  |              |           |                              |
+------------------------------------------------------------------------+
<-- 2 bytes --> <- 4 bytes  -> <-2 bytes->  <---    contents 残り全部  --->
                               <---------------- length ---------------->

(35) DefineBitsJPEG3

  • DefineBitsJPEG2 のデータに alpha channel (透明度)データが加わったもの
    • これに画像のマスク値を乗せればスプライト的な表示が可能。
    • alpha channel は zlib 圧縮して格納。伸張すると画像左上の pixel から対応する順に透明度の値(1byte)が並んでいる。
    • 参考 -> http://diary.awm.jp/~yoya/?20080213#200802132
+---------------------------------------------------------------
| tag | length |    length    |  image_id | offset_to_alpha | ..
|  35 |  0x3f  |              |           |                 |
+---------------------------------------------------------------
<-- 2 bytes --> <-  4 bytes -> <-2 bytes-> <--  4 bytes -->
                               <--- length (最後まで)  ---
 ---+------------------------------+-------------------+
 .. | encoding_tables | image_data |   alpha(zlib圧縮) |
 ---+------------------------------+-------------------+
     <--    offse_to_alpha      --> <-contents 残り全部->

(90) DefineBitsJPEG4

  • DefineBitsJPEG3 のデータに deblock_param (デブロッキングフィルタの値)データが加わったもの
    • deblock_param は 2 byte
+---------------------------------------------------------------
| tag | length |    length    |  image_id | offset_to_alpha | ..
|  90 |  0x3f  |              |           |                 |
+---------------------------------------------------------------
<-- 2 bytes --> <-  4 bytes -> <-2 bytes-> <--  4 bytes -->
                               <--- length (最後まで)  ---
 ---+-------------+-----------------+------------+-------------------+
 .. |deblock_param| encoding_tables | image_data |   alpha(zlib圧縮) |
 ---+-------------+-----------------+------------+-------------------+
     <- 2 bytes ->                               <-contents 残り全部->
     <------------ offset_to_alpha ------------->

作成予定


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