- SWFにおける x と y は整数型
- ブラウザと同じスクリーン座標系
- x は水平軸, 0 が左端
- y は垂直軸, 0 が上端
- ブラウザと同じスクリーン座標系
- twips という単位がある。1px === 20 twips
- { width: 800 twip, height: 400 twip } の矩形は { width: 40px height: 20px } として表示
- 20 で割り切れない twips はアンチエイリアスで表現
-
SWFでは 8-bit, 16-bit, 32-bit, 64-bit の符号付き・符号無し整数が使われる
-
バイトオーダーはリトルエンディアン(x86と同様)
0x20, 0x71, 0x6e, 0x45
は 0x456e7120 の32bit値として扱う0x12, 0xe7
は 0xe712 の16bit値として扱う
-
ビットオーダーはビッグエンディアン。ビットを扱う場合は左から0bitになる
-
整数型はバイト境界に沿ってパディングされている必要がある
-
符号付き整数は 2の補数で表現する
- 最上位ビットが 1 なら負
- 最上位ビットが 0 なら正
- 2の補数は、正の値を反転し+1した値
// 0x01 の2の補数は 0xFF 0x01 (0b0000,0b0001)(元の値) 0xFE (0b1111,0b1110)(反転) 0xFF (0b1111,0b1111)(+1)
type | sign | bits | SWF |
---|---|---|---|
SI8 | signed | 8 | 1+ |
SI16 | signed | 16 | 1+ |
SI32 | signed | 32 | 1+ |
UI8 | unsigned | 8 | 1+ |
UI16 | unsigned | 16 | 1+ |
UI32 | unsigned | 32 | 1+ |
type | sign | bits | SWF |
---|---|---|---|
SI8[n] | signed | 8 x n | 1+ |
SI16[n] | signed | 16 x n | 1+ |
UI8[n] | unsigned | 8 x n | 1+ |
UI16[n] | unsigned | 16 x n | 1+ |
UI24[n] | unsigned | 24 x n | 1+ |
UI32[n] | unsigned | 32 x n | 1+ |
UI64[n] | unsigned | 64 x n | 1+ |
-
FIXED(32bit 固定小数点数)は 32 bit 整数と同じように、リトルエンディアンでバイト境界に沿ってパディングされる
-
32bit 固定小数点は 16.16 形式で、16 bit の整数部と 16 bit 小数部に分かれている
FIXED(7.5) -> 0x0007.8000 `00 80 07 00` (SWF上の表現)
-
-
FIXED8 型(16bit 固定小数点数)は 16 bit 整数と同じように、リトルエンディアンでバイト境界に沿ってパディングされる
- 16bit 固定小数点は 8.8 形式で 8 bit の整数部と 86 bit 小数部に分かれている
-
浮動小数点数は IEEE 754
- FLOAT16 は FLOAT と似ているが、指数部と仮数部の長さ(精度)が異なる
- 符号 1 bit
- 指数部 5 bit
- 仮数部 10 bit
- FLOAT16 は FLOAT と似ているが、指数部と仮数部の長さ(精度)が異なる
type | format | bits | SWF |
---|---|---|---|
FIXED | 16.16 | 32 | 1+ |
FIXED8 | 8.8 | 16 | 8+ |
FLOAT16 | IEEE754 like | 16 | 8+ |
FLOAT | IEEE754 | 32 | 8+ |
DOUBLE | IEEE754 | 64 | 8+ |
type | format | bits | SWF |
---|---|---|---|
EncodedU32 | エンコードされた可変長サイズの整数 | 32 x n | 9+ |
- EncodedU32(32-bit 符号無しのエンコードされた整数)はサイズが可変
-
数値の大きさにより 1 ~ 5 byte の間で長さが変化します (大きな値ほど大きな保存領域が要る)。
-
エンコードアルゴリズム
// 最上位ビットがセットされていたら、次のバイトにデータが続く // 最上位ビットがセットされていなかったら、そこでデータを終了する // 残り 7 bit に値が入る int GetEncodedU32(unsigned char*& pos) { int result = pos[0]; if (!(result & 0x00000080)) { pos++; return result; } result = (result & 0x0000007f) | pos[1] << 7; if (!(result & 0x00004000)) { pos += 2; return result; } result = (result & 0x00003fff) | pos[2] << 14; if (!(result & 0x00200000)) { pos += 3; return result; } result = (result & 0x001fffff) | pos[3] << 21; if (!(result & 0x10000000)) { pos += 4; return result; } result = (result & 0x0fffffff) | pos[4] << 28; pos += 5; return result; }
-
型 | format | bits | SWF |
---|---|---|---|
SB[nBits] | 符号無し整数 | nBits | 1+ |
UB[nBits] | 符号付き整数 | nBits | 1+ |
FB[nBits] | 符号付き固定小数点数 | 最大32bit | 1+ |
-
ビット型は可変長のビットフィールド
-
ビット型はバイト境界に沿う必要はない
- 他の型 (UI8 とか UI16) は常にバイト境界にパディングする必要がある
- ビット型 + 整数型のようにパディングが必要な場合は、ビット型の最後のバイトの残りを 0 埋めする
-
FB[nBits] は、32 bit の 16.16 符号付きの固定小数点数で、上位 16 bit は整数、下位 16 bit は小数を表す
- 固定小数点ビット型は符号付きビット型の値と見た目は同じであっても、解釈の仕方が異なる
19 bit 符号付きビット型の 0x30000 は 196608 になるが 19 bit 固定小数点ビット型の 0x30000 (0b11,0b00000000,0b00000000) は 3.0 になる。19bitのうち上位3bits, 下位16bits で 3.16 の構成になる
64 bit stream (includs Bit Value x 9 + padding + UI16 value)
-------- -------- -------- --------
0101101010010010010111100100011010111001100100000100110010101101
------ Bit Value 1
----- Bit Value 2
------ Bit Value 3
---- Bit Value 4
-------- Bit Value 5
--- Bit Value 6
----- Bit Value 7
--- Bit Value 8
---- Bit Value 9
---- zero padding
---------------- UI16
ここでは例として RECT 構造体で考えてみましょう。
''RECT''
|フィールド|型|コメント|h
|Nbits|UB[5]|矩形のそれぞれのフィールドで使われるビット数|
|Xmin|SB[Nbits]|矩形の最小 X 座標|
|Xmax|SB[Nbits]|矩形の最大 X 座標|
|Ymin|SB[Nbits]|矩形の最小 Y 座標|
|Ymax|SB[Nbits]|矩形の最大 Y 座標|
Nbits フィールドの値で、Xmin, Xmax, Ymin, Ymax のそれぞれのビット長を指定します。
次のようなデータが RECT 構造体に入っているとすると、
Xmin = 127 (10進数) = 1111111 (2進数)
Xmax = 260 (10進数) = 100000100 (2進数)
Ymin = 15 (10進数) = 1111 (2進数)
Ymax = 514 (10進数) = 1000000010 (2進数)
Nbits の値は一番多くのビットを必要とするフィールドから求めることができます。
上の表では、514 (01000000010) が、11 ビットの長さで、最大のものとなります。
結果、次に示すような形式で保存されます。
''RECT''
|フィールド|型と値|コメント|h
|Nbits|UB[5] = 01011|必要なビット数 (11)|
|Xmin|SB[11] = 00001111111|twip 単位の最小 X 座標 (127)|
|Xmax|SB[11] = 00100000100|twip 単位の最大 X 座標 (260)|
|Ymin|SB[11] = 00000001111|twip 単位の最小 Y 座標 (15)|
|Ymax|SB[11] = 01000000010|twip 単位の最大 Y 座標 (514)|
- STRING は NULL で終端する文字列
type | format | bits | SWF | encoding |
---|---|---|---|---|
UI8[n] | CHR x n + NULL | n * 8 + 8 | 1+ | ANSI |
UI8[n] | CHR x n + NULL | n * 8 + 8 | 1+ | SHIFT-JIS |
UI8[n] | CHR x n + NULL | n * 8 + 8 | 6+ | UTF-8 |
- SWF 5 以前は ANSI(ASCII) または SHIFT-JIS でエンコードする
- エンコーディング方式を示すフラグはなく混乱を引き起こしていた
- SWF 6+ 常に UTF-8 でエンコードする
type | format | bits | SWF |
---|---|---|---|
UI8 | LanguageCode | 8 | 1+ |
- Flash Player は言語コードを参考に テキストの禁則文字(改行の仕様)と、デバイスフォントの代替フォントの決定を行う
- 言語コード 0 は言語を選択しないことを表す
- 0 は Flash Player の実行環境のロケールによって最適化された動作になる
LanguageCode | |
---|---|
0 | Default |
1 | Latin |
2 | Japanese |
3 | Korean |
4 | Simplified Chinese |
5 | Traditional Chinese |
- RGB は 赤緑青を24bit で表現する
Field | type | |
---|---|---|
Red | UI8 | |
Green | UI8 | |
Blue | UI8 | |
Alpha | UI8 | 0-255, 0で完全な透明 |
- RGBA は 赤緑青透を32bit で表現する
Field | type | |
---|---|---|
Red | UI8 | |
Green | UI8 | |
Blue | UI8 | |
Alpha | UI8 | 0-255, 0で完全な透明 |
- ARGB は 透赤緑青を32bit で表現する。先頭がα値になる
Field | type | |
---|---|---|
Alpha | UI8 | 0-255, 0で完全な透明 |
Red | UI8 | |
Green | UI8 | |
Blue | UI8 |
Field | type | |
---|---|---|
Nbits | UB[5] | |
Xmin | SB[Nbits] | twips |
Xmax | SB[Nbits] | twips |
Ymin | SB[Nbits] | twips |
Ymax | SB[Nbits] | twips |
Field | type | |
---|---|---|
HasScale | UB[5] | |
NScaleBits | SB[Nbits] | twips |
Xmax | SB[Nbits] | twips |
Ymin | SB[Nbits] | twips |
Ymax | SB[Nbits] | twips |
**色変換レコード [#scdf9a10]
CXFORM レコードは、グラフィックスオブジェクトへの簡単な色変換の仕方を定義します。次の 2 種類の変換が可能です。
--乗算変換 --加算変換
乗算変換は、 赤・緑・青 のそれぞれに 8.8 形式の固定小数の値を掛け算します。この固定小数の 1.0 の値は 0x100 か、10 進数の値で 256 を使って表現します。
次のような式を使って、色 (R,G,B) を 色 (R', G', B') に変換します。
R' = (R * RedMultTerm) / 256 G' = (G * GreenMultTerm) / 256 B' = (B * BlueMultTerm) / 256
加算変換は、 赤・緑・青 のそれぞれに正の数または負の数の値を足し算します。結果が 255 を超えた場合は、255 に飽和されます。 結果が 0 以下になる場合も同様に、 0 に飽和されます。
次のような式を使って、色 (R,G,B) を 色 (R', G', B') に変換します。
R' = max(0, min(R + RedAddTerm, 255)) G' = max(0, min(G + GreenAddTerm, 255)) B' = max(0, min(B + BlueAddTerm, 255))
次のように、乗算変換と加算変換を組み合わせることも可能です。乗算が先に適用されます。
R' = max(0, min(((R * RedMultTerm) / 256) + RedAddTerm, 255)) G' = max(0, min(((G * GreenMultTerm) / 256) + GreenAddTerm, 255)) B' = max(0, min(((B * BlueMultTerm) / 256) + BlueAddTerm, 255))
CXFORM レコードは、バイト境界に合わせられる (byte aligned) 必要があります。
***CXFORM 型 [#j99c0273]
|フィールド|型|コメント|h |HasAddTerms|UB[1]|加算値を使用する = 1| |HasMultTerms|UB[1]|乗算値を使用する = 1| |Nbits|UB[4]|これ以降のフィールドで使用するビット長| |RedMultTerm|If HasMultTerms = 1, SB[Nbits]|乗算値 (赤)| |GreenMultTerm|If HasMultTerms = 1, SB[Nbits]|乗算値 (緑)| |BlueMultTerm|If HasMultTerms = 1, SB[Nbits]|乗算値 (青)| |RedAddTerm|If HasAddTerms = 1, SB[Nbits]|加算値 (赤)| |GreenAddTerm|If HasAddTerms = 1, SB[Nbits]|加算値 (緑)| |BlueAddTerm|If HasAddTerms = 1, SB[Nbits]|加算値 (青)|
***移動 [#m39784b3] -前のページ : [[MATRIX レコード>基本的なデータ型/MATRIX レコード]] -次のページ : [[アルファ値付き色変換レコード>基本的なデータ型/アルファ値付き色変換レコード]]