テクスチャ画像ファイルフォーマット zit形式について ●ファイル構造 Zit 画像データは、次の3つのブロックからできています。 ・ヘッダ 16byte ・パレットエントリ 必要個数(無い場合もある) ・データ本体 ヘッダは、画像サイズやピクセルフォーマットなどの情報を格納します。パレットエ ントリは、パレット形式を用いる場合のみ必要で、RGB 形式などパレットが不要な場 合はこのブロックは存在しません。データ本体はその直後から始まります。 ●ヘッダ詳細 ヘッダブロックの構造は次の通りです。すべてのデータはリトルエンディアンで格納 されます。 struct { unsigned short Head; // 'ZT' 固定 unsigned short Id; // フォーマット識別子 unsigned short Palsize; // パレットエントリの個数 unsigned short Flag; // 通常は0固定 unsigned short X, Y; // 画像サイズ unsigned short Ox, Oy; // 元画像のサイズ }; ・Head は次のシンボルで定義されます。'ZT' 固定です。 #define ZIT_HEAD_TYPE ((unsigned short)('Z'+'T'*256)) ・ID は次の識別子を使用します。この値はすべて意味を持っており、必要に応じて ピクセル情報を取り出すことができます。 ID自体は多数定義されていますが、実際に使用されるのはこの中の一部です。 *良く使われるもの RGB565 RGB1555 RGB4444 RGB8888 PALET8565 PALET81555 PALET88888 #define ZIT_ID_RGB332 0x0801 #define ZIT_ID_RGB4444 0x1042 #define ZIT_ID_RGB565 0x1002 #define ZIT_ID_RGB1555 0x1012 #define ZIT_ID_RGB888 0x1803 #define ZIT_ID_RGB8888 0x2084 #define ZIT_ID_PALET1565 0x8102 #define ZIT_ID_PALET1888 0x8103 #define ZIT_ID_PALET2565 0x8202 #define ZIT_ID_PALET2888 0x8203 #define ZIT_ID_PALET4565 0x8402 #define ZIT_ID_PALET4888 0x8403 #define ZIT_ID_PALET84444 0x8842 #define ZIT_ID_PALET8565 0x8802 #define ZIT_ID_PALET81555 0x8812 #define ZIT_ID_PALET8888 0x8803 #define ZIT_ID_PALET88888 0x8884 #define ZIT_ID_UV88 0x5002 #define ZIT_ID_UVL565 0x5052 #define ZIT_ID_UVL888 0x6083 #define ZIT_ID_TYPEMASK 0xc000 #define ZIT_ID_TYPE_PALET 0x8000 #define ZIT_ID_TYPE_BUMP 0x4000 #define ZIT_ID_TYPE_COMPRESS 0xc000 #define ZIT_FLAG_MIPMAP 0x0001 ・1dot あたりの bit 数を求める場合 inline int ZitGetBitCount() { return (Id & 0x3f00)>>8; } [例] RGB565 なら 16 が返る 8bit PALET なら 8 が返る ・1pixelに使われるカラーサイズ(bit数)を求める場合 inline int ZitGetColorSize() //bit { return (Id & 0x000f)<<3; } [例] RGB565 なら 16 が返る 8bit PALET で、各パレットエントリが 32bit なら 32 が返る ・カラー情報に含まれるαのbit数を求める inline int ZitGetAlphaSize() //bit { return (Id & 0x00f0)>>4; } [例] RGB565 なら 0 が返る RGB1555 なら 1 が返る ・パレット形式かどうか調べる inline int ZitIsPalet() //bool { return (Id & ZIT_ID_TYPEMASK) == ZIT_ID_TYPE_PALET; } ・BUMPデータかどうか調べる inline int ZitIsBump() //bool { return (Id & ZIT_ID_TYPEMASK) == ZIT_ID_TYPE_BUMP; } ・MIPMAPデータを含んでいるかどうか調べる inline int ZitIsMipmap() //bool { return Flag & ZIT_FLAG_MIPMAP; } ・データ本体のバイト数を計算する inline int ZitGetDataByteSize() //byte { return (X * Y * ZitGetBitCount()) >>3; } ・データに含まれているパレットエントリの個数を得る inline int ZitGetPaletSize() //colors { return Palsize; } ・ピクセルフォーマットが持てるパレットエントリの最大個数個数を得る inline int ZitGetPaletMax() //colors { return (1<>3; } ・パレットエントリの先頭アドレスを得る inline int ZitGetPaletOffset() //byte { return sizeof( ZddZit ); } inline void *ZitGetPaletAddress() { return (void*)((char*)this + ZitGetPaletOffset()); } ・データ本体のアドレスを得る inline int ZitGetDataOffset() { return ZitGetPaletOffset() + ZitGetPaletByteSize(); } inline void *ZitGetDataAddress() { return (void*)((char*)this + ZitGetDataOffset()); } ●パレットエントリ パレットエントリは、ヘッダの直後から始まります。ピクセルフォーマットに従った カラー情報が、必要分だけ格納され、パレットエントリの個数はヘッダの Palsize に入ります。Palsize が 0 の場合は、このブロックは存在しません。 ●データ本体 パレットエントリブロックの直後からデータ本体が始まります。データは画像の左上 から右下へ、そのままの形で入ります。 2000/01/08 小笠原博之 oga@art.udn.ne.jp http://www.vector.co.jp/authors/VA004474/