Skip to content

Instantly share code, notes, and snippets.

@uupaa
Last active August 29, 2015 14:18
Show Gist options
  • Save uupaa/539b22c1f075bb9a072b to your computer and use it in GitHub Desktop.
Save uupaa/539b22c1f075bb9a072b to your computer and use it in GitHub Desktop.

BasicDataTypes

Coordinates and Twips (座標系とtwips)

  • SWFにおける x と y は整数型
    • ブラウザと同じスクリーン座標系
      • x は水平軸, 0 が左端
      • y は垂直軸, 0 が上端
  • twips という単位がある。1px === 20 twips
    • { width: 800 twip, height: 400 twip } の矩形は { width: 40px height: 20px } として表示
    • 20 で割り切れない twips はアンチエイリアスで表現

Integer type and byte order

  • 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)
    

INTEGER, INTEGER_ARRAY

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, FLOAT

  • 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
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+

ENCODED_INTEGER

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;
      }

BITS

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

  • 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 でエンコードする

LANGCODE_CODE

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

RGBA color with alpha record

RGB color record

  • RGB は 赤緑青を24bit で表現する
Field type
Red UI8
Green UI8
Blue UI8
Alpha UI8 0-255, 0で完全な透明

RGBA color record

  • RGBA は 赤緑青透を32bit で表現する
Field type
Red UI8
Green UI8
Blue UI8
Alpha UI8 0-255, 0で完全な透明

ARGB color record

  • ARGB は 透赤緑青を32bit で表現する。先頭がα値になる
Field type
Alpha UI8 0-255, 0で完全な透明
Red UI8
Green UI8
Blue UI8

RECT

Field type
Nbits UB[5]
Xmin SB[Nbits] twips
Xmax SB[Nbits] twips
Ymin SB[Nbits] twips
Ymax SB[Nbits] twips

MATRIX

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 レコード]] -次のページ : [[アルファ値付き色変換レコード>基本的なデータ型/アルファ値付き色変換レコード]]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment