- 複数byte field は LittleEndian
- 後は bit 処理が幾つか
- タグは TLC(type,length,contents) 構造
+---------+----------------------+
| magic | \0 | file_length |
+-------- +------+---------------+
<-3 bytes-><1 byte><-- 4 bytes -->
magic: offset = 0
- FWS or CWS の 3文字 + \0 terminate string
- CWS の時は、ファイルサイズフィールド以降が zlib 圧縮される
file_length: offset = 4
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_integer: offset = 8 + 5(bits) + 4*size(bits) + 1
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 | length | contents |
+-------------------------------------+
<-10bits-><-6bits-><-- length bytes -->
<- Little Endian ->
+------------------------------------------------------+
| tag | 0x3f | length | contents |
+------------------------------------------------------+
<-10bits-><-6bits-><-- 4 bytes --> <-- length bytes -->
<- Little Endian ->
contents の構造
(0) End
(6) DefineBitsJPEG
- JPEG データが image_data にそのまま入る
+-------------------------------------------------------------+
| tag | length | length | image_id | image_data |
| 6 | 0x3f | | | |
+-------------------------------------------------------------+
<-- 2 bytes --> <- 4 bytes -> <-2 bytes-> <-contents 残り全部->
(21) DefineBitsJPEG2
- JPEG データの圧縮テーブルに関するセグメントが encoding_tables に、それ以外のセグメントが image_data に入る。
- そのまま取り出しても JPEG ファイルにはならず、セグメントを並び替える必要がある。
- JPEG データのセグメント構造については (Flash/JPEG) ←こちらにまとめる予定。
+---------------------------------------------
| tag | length | length | image_id | ..
| 6 | 0x3f | | |
+---------------------------------------------
<-- 2 bytes --> <- 4 bytes -> <-2 bytes->
---+------------------------------+
.. | encoding_tables | image_data |
---+------------------------------+
<--- contents 残り全部 --->
(35) DefineBitsJPEG3
- DefineBitsJPEG2 のデータに alpha channel (透明度)データが加わったもの
- これに画像のマスク値を乗せればスプライト的な表示が可能。
- alpha channel は zlib 圧縮して保存。伸張すると r,b,g,画像左上の pixel から対応する順に並ぶ。
+---------------------------------------------------------------
| tag | length | length | image_id | offset_to_alpha | ..
| 6 | 0x3f | | | |
+---------------------------------------------------------------
<-- 2 bytes --> <- 4 bytes -> <-2 bytes-> <-- 4 bytes -->
---+------------------------------+-------------------+
.. | encoding_tables | image_data | alpha(zlib圧縮) |
---+------------------------------+-------------------+
<-- offse_to_alpha --> <-contents 残り全部->